ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA2NmY1ZmMyLi4xZGQ1MTM5IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNSwyNiArNSwxNCBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLSAgICBhaWRsOiB7Ci0gICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCi0gICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIiwKLQotICAgICAgICAiQ2FzSW1wbC5jcHAiLAotICAgICAgICAiRGVzY3JhbWJsZXJJbXBsLmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiSUNyeXB0by5jcHAiLAogICAgICAgICAiSURybS5jcHAiLAogICAgICAgICAiSURybUNsaWVudC5jcHAiLAogICAgICAgICAiSU1lZGlhRHJtU2VydmljZS5jcHAiLAotICAgICAgICAiTWVkaWFDYXNEZWZzLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMzYmIwLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDYXNJbXBsIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQ2FzSW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RydWN0IENhc0ltcGw6OlBsdWdpbkhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBQbHVnaW5Ib2xkZXIoQ2FzUGx1Z2luICpwbHVnaW4pIDogbVBsdWdpbihwbHVnaW4pIHt9Ci0gICAgflBsdWdpbkhvbGRlcigpIHsgaWYgKG1QbHVnaW4gIT0gTlVMTCkgZGVsZXRlIG1QbHVnaW47IH0KLSAgICBDYXNQbHVnaW4qIGdldCgpIHsgcmV0dXJuIG1QbHVnaW47IH0KLQotcHJpdmF0ZToKLSAgICBDYXNQbHVnaW4gKm1QbHVnaW47Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGx1Z2luSG9sZGVyKTsKLX07Ci0KLUNhc0ltcGw6OkNhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpCi0gICAgOiBtUGx1Z2luSG9sZGVyKE5VTEwpLCBtTGlzdGVuZXIobGlzdGVuZXIpIHsKLSAgICBBTE9HVigiQ1RPUiIpOwotfQotCi1DYXNJbXBsOjp+Q2FzSW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUiIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ2FzSW1wbDo6T25FdmVudCgKLSAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKGFwcERhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhcHBEYXRhISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENhc0ltcGwgKmNhc0ltcGwgPSBzdGF0aWNfY2FzdDxDYXNJbXBsICo+KGFwcERhdGEpOwotICAgIGNhc0ltcGwtPm9uRXZlbnQoZXZlbnQsIGFyZywgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2FzSW1wbDo6aW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pIHsKLSAgICBtTGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgbVBsdWdpbkhvbGRlciA9IG5ldyBQbHVnaW5Ib2xkZXIocGx1Z2luKTsKLX0KLQotdm9pZCBDYXNJbXBsOjpvbkV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUxpc3RlbmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiBldmVudERhdGE7Ci0gICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBzaXplID4gMCkgewotICAgICAgICBldmVudERhdGEucmVzZXQobmV3IENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpKTsKLSAgICB9Ci0KLSAgICBtTGlzdGVuZXItPm9uRXZlbnQoZXZlbnQsIGFyZywgZXZlbnREYXRhKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0UHJpdmF0ZURhdGEiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnNldFByaXZhdGVEYXRhKHB2dERhdGEpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6Om9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoIm9wZW5TZXNzaW9uIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gaG9sZGVyLT5nZXQoKS0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEFMT0dWKCJvcGVuU2Vzc2lvbjogc2Vzc2lvbiBvcGVuZWQsIHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZygqc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSB7Ci0gICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgcHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6Y2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoImNsb3NlU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VjbShjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRWNtOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFY20oc2Vzc2lvbklkLCBlY20pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRW1tIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFbW0oZW1tKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZW5kRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSB7Ci0gICAgQUxPR1YoInNlbmRFdmVudCIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChldmVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgQ2FzRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgKmV2ZW50RGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSB7Ci0gICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgU3RyaW5nOChwcm92aXNpb25TdHJpbmcpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvdmlzaW9uKFN0cmluZzgocHJvdmlzaW9uU3RyaW5nKSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSB7Ci0gICAgQUxPR1YoInJlZnJlc2hFbnRpdGxlbWVudHMiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAocmVmcmVzaERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5yZWZyZXNoRW50aXRsZW1lbnRzKHJlZnJlc2hUeXBlLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsICpyZWZyZXNoRGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoInJlbGVhc2U6IHBsdWdpbj0lcCIsCi0gICAgICAgICAgICBtUGx1Z2luSG9sZGVyID09IE5VTEwgPyBtUGx1Z2luSG9sZGVyLT5nZXQoKSA6IE5VTEwpOwotICAgIG1QbHVnaW5Ib2xkZXIuY2xlYXIoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTA5ZTIuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGVzY3JhbWJsZXJJbXBsIgotCi0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGVzY3JhbWJsZXJJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6RGVzY3JhbWJsZXJJbXBsKAotICAgICAgICBjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbikgOgotICAgICAgICBtTGlicmFyeShsaWJyYXJ5KSwgbVBsdWdpbihwbHVnaW4pIHsKLSAgICBBTE9HVigiQ1RPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotfQotCi1EZXNjcmFtYmxlckltcGw6On5EZXNjcmFtYmxlckltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1I6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnNldE1lZGlhQ2FzU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhc1Nlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMobVBsdWdpbi0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIHsKLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZzgobWltZSkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhPSyk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OmRlc2NyYW1ibGUoCi0gICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBpbmZvLCBpbnQzMl90ICpyZXN1bHQpIHsKLSAgICBBTE9HVigiZGVzY3JhbWJsZSIpOwotCi0gICAgKnJlc3VsdCA9IG1QbHVnaW4tPmRlc2NyYW1ibGUoCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgIT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsCi0gICAgICAgICAgICBpbmZvLnNjcmFtYmxpbmdDb250cm9sLAotICAgICAgICAgICAgaW5mby5udW1TdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0LAotICAgICAgICAgICAgaW5mby5kc3RUeXBlID09IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyID8KLSAgICAgICAgICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSA6IGluZm8uZHN0UHRyLAotICAgICAgICAgICAgaW5mby5kc3RPZmZzZXQsCi0gICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoKnJlc3VsdCA+PSAwID8gT0sgOiAqcmVzdWx0KTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVBsdWdpbjsKLSAgICAgICAgbVBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYmEzOC4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDYXMiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNhc0RlZnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzRGF0YTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICByZXR1cm4gcGFyY2VsLT5yZWFkQnl0ZVZlY3Rvcih0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0ICB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVCeXRlVmVjdG9yKCp0aGlzKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiAvKnBhcmNlbCovKSB7Ci0gICAgQUxPR0UoIkNBUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoKSBzaG91bGRuJ3QgYmUgY2FsbGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ0FTeXN0ZW1JZCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1OYW1lKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFDYXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotCi1EZXNjcmFtYmxlSW5mbzo6RGVzY3JhbWJsZUluZm8oKSB7fQotCi1EZXNjcmFtYmxlSW5mbzo6fkRlc2NyYW1ibGVJbmZvKCkge30KLQotc3RhdHVzX3QgRGVzY3JhbWJsZUluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoKGludDMyX3QqKSZkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90Kikmc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoKHVpbnQzMl90KikmbnVtU3ViU2FtcGxlcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAobnVtU3ViU2FtcGxlcyA+IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN1YlNhbXBsZXMgPSBuZXcgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKLSAgICBpZiAoc3ViU2FtcGxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoJnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNyY01lbSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBpZiAoc3JjTWVtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3JjT2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV90ICpuYXRpdmVIYW5kbGUgPSBOVUxMOwotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgbmF0aXZlSGFuZGxlID0gcGFyY2VsLT5yZWFkTmF0aXZlSGFuZGxlKCk7Ci0gICAgICAgIGRzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4obmF0aXZlSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RQdHIgPSBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZQotICAgICAgICAgICAgJiYgZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KWRzdFR5cGUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKG51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGVVaW50MzIoc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzcmNNZW0pKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZU5hdGl2ZUhhbmRsZShzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oZHN0UHRyKSk7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKGRzdE9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcgotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhNWFiYy4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSUNhc0xpc3RlbmVyIHsKLSAgICB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY4MjUuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JRGVzY3JhbWJsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5JQ2FzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhc0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElNZWRpYUNhc1NlcnZpY2UgewotICAgIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yW10gZW51bWVyYXRlUGx1Z2lucygpOwotICAgIGJvb2xlYW4gaXNTeXN0ZW1JZFN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJQ2FzIGNyZWF0ZVBsdWdpbihpbnQgQ0Ffc3lzdGVtX2lkLCBJQ2FzTGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNEZXNjcmFtYmxlclN1cHBvcnRlZChpbnQgQ0Ffc3lzdGVtX2lkKTsKLSAgICBJRGVzY3JhbWJsZXIgY3JlYXRlRGVzY3JhbWJsZXIoaW50IENBX3N5c3RlbV9pZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZDBjNi4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsIGIvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODkyNDQuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKiogQGhpZGUgKi8KLXBhcmNlbGFibGUgTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBjcHBfaGVhZGVyICJtZWRpYS9NZWRpYUNhc0RlZnMuaCI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKaW5kZXggOGZkODY2Yy4uNGIxMzlhOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5taworKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCkBAIC0yOCw4ICsyOCw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBsaWJjbGVhcmtleWNhc3BsdWdpbgogCi0jVE9ETzogbW92ZSB0aGlzIGJhY2sgdG8gL3ZlbmRvci9saWIgYWZ0ZXIgY29udmVyc2lvbiB0byB0cmVibGUKLSNMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IG1lZGlhY2FzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMzksNiArMzgsOSBAQAogICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogICAgIGxpYnByb3RvYnVmLWNwcC1saXRlIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGlianNtbiBcCiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCA0ZWQ1ZmNlLi5lMjc2MzFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JZCk7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgIHNwPENsZWFyS2V5Q2FzU2Vzc2lvbj4gc2Vzc2lvbiA9CiAgICAgICAgICAgICBDbGVhcktleVNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX1NFU1NJT05fTk9UX09QRU5FRDsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtS2V5RmV0Y2hlckxvY2spOwpAQCAtMjkzLDcgKzI5Myw3IEBACiBzdGF0dXNfdCBDbGVhcktleUNhc1Nlc3Npb246OnVwZGF0ZUVDTSgKICAgICAgICAgS2V5RmV0Y2hlciAqa2V5RmV0Y2hlciwgdm9pZCAqZWNtLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChrZXlGZXRjaGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9UX1BST1ZJU0lPTkVEOwogICAgIH0KIAogICAgIGlmIChzaXplIDwga0VjbUhlYWRlckxlbmd0aCkgewpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBjb25zdCBEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAogICAgICAgICBjb25zdCB2b2lkICpzcmNQdHIsIHZvaWQgKmRzdFB0ciwgQVN0cmluZyAqIC8qIGVycm9yRGV0YWlsTXNnICovKSB7CiAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfQ0FOTk9UX0hBTkRMRTsKICAgICB9CiAKICAgICBBRVNfS0VZIGNvbnRlbnRLZXk7CkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICAgICAgaW50MzJfdCBrZXlJbmRleCA9IChzY3JhbWJsaW5nQ29udHJvbCAmIDEpOwogICAgICAgICBpZiAoIW1LZXlJbmZvW2tleUluZGV4XS52YWxpZCkgewogICAgICAgICAgICAgQUxPR0UoImRlY3J5cHQ6IGtleSAlZCBpcyBpbnZhbGlkIiwga2V5SW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19ERUNSWVBUOwogICAgICAgICB9CiAgICAgICAgIGNvbnRlbnRLZXkgPSBtS2V5SW5mb1trZXlJbmRleF0uY29udGVudEtleTsKICAgICB9CkBAIC00MjAsNyArNDIwLDcgQEAKIAogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNsZWFyS2V5RGVzY3JhbWJsZXJQbHVnaW46IHNlc3Npb24gbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX1NFU1NJT05fTk9UX09QRU5FRDsKICAgICB9CiAKICAgICBtQ0FTU2Vzc2lvbiA9IHNlc3Npb247CkBAIC00NDYsNyArNDQ2LDcgQEAKIAogICAgIGlmIChtQ0FTU2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmluaXRpYWxpemVkIENBUyBzZXNzaW9uISIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRDsKICAgICB9CiAKICAgICByZXR1cm4gbUNBU1Nlc3Npb24tPmRlY3J5cHQoCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAppbmRleCA5Y2Q3N2U5Li42ZTEwMDRjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKQEAgLTQ4LDI0ICs0OCwyNCBAQAogICogRXh0cmFjdCBhIGNsZWFyIGtleSBhc3NldCBmcm9tIGEgSlNPTiBzdHJpbmcuCiAgKgogICogUmV0dXJucyBPSyBpZiBhIGNsZWFyIGtleSBhc3NldCBpcyBleHRyYWN0ZWQgc3VjY2Vzc2Z1bGx5LAotICogb3IgRVJST1JfRFJNX05PX0xJQ0VOU0UgaWYgdGhlIHN0cmluZyBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZAorICogb3IgRVJST1JfQ0FTX05PX0xJQ0VOU0UgaWYgdGhlIHN0cmluZyBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZAogICogY2xlYXIga2V5IGFzc2V0LgogICovCiBzdGF0dXNfdCBKc29uQXNzZXRMb2FkZXI6OmV4dHJhY3RBc3NldEZyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGpzb25Bc3NldFN0cmluZywgQXNzZXQgKmFzc2V0KSB7CiAgICAgaWYgKCFwYXJzZUpzb25Bc3NldFN0cmluZyhqc29uQXNzZXRTdHJpbmcsICZtSnNvbk9iamVjdHMpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KIAogICAgIGlmIChtSnNvbk9iamVjdHMuc2l6ZSgpIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAoIXBhcnNlSnNvbk9iamVjdChtSnNvbk9iamVjdHNbMF0sICZtVG9rZW5zKSkKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAKICAgICBpZiAoIWZpbmRLZXkobUpzb25PYmplY3RzWzBdLCBhc3NldCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaAppbmRleCAyZWYwNmM0Li41ZmJkZWE1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCkBAIC0yOSw3ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2xlYXJrZXljYXMgewogZW51bSB7Ci0gICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9EUk1fVkVORE9SX01BWCwKKyAgICBDTEVBUktFWV9TVEFUVVNfQkFTRSA9IEVSUk9SX0NBU19WRU5ET1JfTUFYLAogICAgIENMRUFSS0VZX1NUQVRVU19JTlZBTElEQVNTRVRJRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMSwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRFNZU1RFTUlEID0gQ0xFQVJLRVlfU1RBVFVTX0JBU0UgLSAyLAogICAgIENMRUFSS0VZX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMywKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGNiZjdiZTcuLmUxNTQ1YWYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawpAQCAtMjEsMTIgKzIxLDEzIEBACiAgICAgQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKIAogTE9DQUxfTU9EVUxFIDo9IENsZWFyS2V5RmV0Y2hlclRlc3QKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogCiAjIExPQ0FMX0xERkxBR1MgaXMgbmVlZGVkIGhlcmUgZm9yIHRoZSB0ZXN0IHRvIHVzZSB0aGUgcGx1Z2luLCBiZWNhdXNlCiAjIHRoZSBwbHVnaW4gaXMgbm90IGluIHN0YW5kYXJkIGxpYnJhcnkgc2VhcmNoIHBhdGguIFdpdGhvdXQgdGhpcyAuc28KICMgbG9hZGluZyBmYWlscyBhdCBydW4tdGltZSAobGlua2luZyBpcyBva2F5KS4KIExPQ0FMX0xERkxBR1MgOj0gXAotICAgIC1XbCwtLXJwYXRoLFwkJHtPUklHSU59Ly4uLy4uLy4uL3N5c3RlbS9saWIvbWVkaWFjYXMgLVdsLC0tZW5hYmxlLW5ldy1kdGFncworICAgIC1XbCwtLXJwYXRoLFwkJHtPUklHSU59Ly4uLy4uLy4uL3N5c3RlbS92ZW5kb3IvbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGliY2xlYXJrZXljYXNwbHVnaW4gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBsaWJsb2cKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tayBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawppbmRleCBhOTdmYWM2Li5hMWQ2MWRhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCkBAIC0yOCw2ICsyOCw4IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBsaWJsb2cKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBtZWRpYV9wbHVnaW5faGVhZGVycworCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYSBcCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCBhYzU3ZDY1Li4wZmNmYzY0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM0LDQgKzM0LDUgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibWVkaWFfcGx1Z2luX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icAppbmRleCA3ZjQ0ODE5Li5hYmQxODg0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKIAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTA1MzBlNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGRybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAppbmRleCBmZGY5OWViLi45ZWZkNzZkIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApAQCAtMTQsMTQgKzE0LDI1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JhbWJsZXI7CisjaWZuZGVmIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19DTElFTlRfSAogCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJRGVzY3JhbWJsZXIgewotICAgIHZvaWQgc2V0TWVkaWFDYXNTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIGJvb2xlYW4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZyBtaW1lKTsKLSAgICBpbnQgZGVzY3JhbWJsZShpbiBNZWRpYURlc2NyYW1ibGVyLkRlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0NsaWVudCB7CisgcHVibGljOgorICAgIEF1ZGlvQ2xpZW50KCkgOgorICAgICAgICBjbGllbnRVaWQoLTEpLCBjbGllbnRQaWQoLTEpLCBwYWNrYWdlTmFtZSgiIikge30KKworICAgIHVpZF90IGNsaWVudFVpZDsKKyAgICBwaWRfdCBjbGllbnRQaWQ7CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWU7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaAppbmRleCA1MGUxMmY0Li43NzFmMWI4IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAzMDljMjNkLi5jZTMwYTc4IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oIGIvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNmYxY2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDQVNfSU1QTF9IXwotI2RlZmluZSBDQVNfSU1QTF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5DYXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXNMaXN0ZW5lcjsKLX0KLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotc3RydWN0IENhc1BsdWdpbjsKLWNsYXNzIFNoYXJlZExpYnJhcnk7Ci0KLWNsYXNzIENhc0ltcGwgOiBwdWJsaWMgQm5DYXMgewotcHVibGljOgotICAgIENhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpOwotICAgIHZpcnR1YWwgfkNhc0ltcGwoKTsKLQotICAgIHN0YXRpYyB2b2lkIE9uRXZlbnQoCi0gICAgICAgICAgICB2b2lkICphcHBEYXRhLAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgaW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pOwotICAgIHZvaWQgb25FdmVudCgKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBJQ2FzIGluaGVyaXRzCi0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRQcml2YXRlRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgb3BlblNlc3Npb24oQ2FzU2Vzc2lvbklkKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgY2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm9jZXNzRWNtKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQsIGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlY20pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvY2Vzc0VtbShjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZW1tKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNlbmRFdmVudCgKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlZnJlc2hFbnRpdGxlbWVudHMoCi0gICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmcmVmcmVzaERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVsZWFzZSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBQbHVnaW5Ib2xkZXI7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBtUGx1Z2luSG9sZGVyOwotICAgIHNwPElDYXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FzSW1wbCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBDQVNfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaCBiL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjEyYWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERFU0NSQU1CTEVSX0lNUExfSF8KLSNkZWZpbmUgREVTQ1JBTUJMRVJfSU1QTF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5EZXNjcmFtYmxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcjsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotc3RydWN0IERlc2NyYW1ibGVyUGx1Z2luOwotY2xhc3MgU2hhcmVkTGlicmFyeTsKLQotY2xhc3MgRGVzY3JhbWJsZXJJbXBsIDogcHVibGljIEJuRGVzY3JhbWJsZXIgewotcHVibGljOgotICAgIERlc2NyYW1ibGVySW1wbChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbik7Ci0gICAgdmlydHVhbCB+RGVzY3JhbWJsZXJJbXBsKCk7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRNZWRpYUNhc1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgbWltZSwgYm9vbCAqcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGRlc2NyYW1ibGUoCi0gICAgICAgICAgICBjb25zdCBEZXNjcmFtYmxlSW5mbyYgZGVzY3JhbWJsZUluZm8sIGludDMyX3QgKnJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW4gKm1QbHVnaW47Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmFtYmxlckltcGwpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gREVTQ1JBTUJMRVJfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNWE5NjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0NBU19ERUZTX0hfCi0jZGVmaW5lIE1FRElBX0NBU19ERUZTX0hfCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotY2xhc3MgSU1lbW9yeTsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLW5hbWVzcGFjZSBNZWRpYUNhcyB7Ci1jbGFzcyBQYXJjZWxhYmxlQ2FzRGF0YSA6IHB1YmxpYyBDYXNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgUGFyY2VsYWJsZUNhc0RhdGEoKSB7fQotICAgIFBhcmNlbGFibGVDYXNEYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSA6Ci0gICAgICAgIENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpIHt9Ci0gICAgdmlydHVhbCB+UGFyY2VsYWJsZUNhc0RhdGEoKSB7fQotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJjZWxhYmxlQ2FzRGF0YSk7Ci19OwotCi1jbGFzcyBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvciA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcihpbnQzMl90IENBX3N5c3RlbV9pZCwgY29uc3QgY2hhciAqbmFtZSkKLSAgICAgICAgOiBtQ0FTeXN0ZW1JZChDQV9zeXN0ZW1faWQpLCBtTmFtZShuYW1lKSB7fQotCi0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoKSA6IG1DQVN5c3RlbUlkKDApIHt9Ci0KLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcihQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvciYmIGRlc2MpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgflBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKCkge30KLQotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1DQVN5c3RlbUlkOwotICAgIFN0cmluZzE2IG1OYW1lOwotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKTsKLX07Ci19Ci0KLW5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyIHsKLWNsYXNzIERlc2NyYW1ibGVJbmZvIDogcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIGVudW0gRGVzdGluYXRpb25UeXBlIHsKLSAgICAgICAga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciwgICAgLy8gbm9uLXNlY3VyZQotICAgICAgICBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlICAvLyBzZWN1cmUKLSAgICB9OwotCi0gICAgRGVzdGluYXRpb25UeXBlIGRzdFR5cGU7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW46OlNjcmFtYmxpbmdDb250cm9sIHNjcmFtYmxpbmdDb250cm9sOwotICAgIHNpemVfdCBudW1TdWJTYW1wbGVzOwotICAgIERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXM7Ci0gICAgc3A8SU1lbW9yeT4gc3JjTWVtOwotICAgIGludDMyX3Qgc3JjT2Zmc2V0OwotICAgIHZvaWQgKmRzdFB0cjsKLSAgICBpbnQzMl90IGRzdE9mZnNldDsKLQotICAgIERlc2NyYW1ibGVJbmZvKCk7Ci0gICAgdmlydHVhbCB+RGVzY3JhbWJsZUluZm8oKTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmFtYmxlSW5mbyk7Ci19OwotfQotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvLyBNRURJQV9DQVNfREVGU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKaW5kZXggMzdlMmMzOS4uZjQwMDU4MiAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvIGIvaW5jbHVkZS9tZWRpYS9uYmFpbwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNjdkMGJhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTU4NDFlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mNWJjYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40M2JmYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhhMTNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNzUwZmRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGVhNDNiZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMGY0MjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmNmExNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL05CQUlPLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzM1NDAxZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdhY2ZjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTRiYmJjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NGIyMWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc0YTNiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmggYi9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA2ZDBhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0wLDAgKzEgQEAKKy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvcGF3aW4vbWFzdGVyL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hODc1ZThiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTAsMCArMSBAQAorL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9wYXdpbi9tYXN0ZXIvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaCBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTk2YjMwNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKQEAgLTAsMCArMSBAQAorL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9wYXdpbi9tYXN0ZXIvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MjM3YzZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApAQCAtMCwwICsxIEBACisvdXNyL2xvY2FsL2dvb2dsZS9ob21lL3Bhd2luL21hc3Rlci9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjMwZDU5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCkBAIC0wLDAgKzEgQEAKKy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvcGF3aW4vbWFzdGVyL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xYjg2MTQzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCkBAIC0wLDAgKzEgQEAKKy91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvcGF3aW4vbWFzdGVyL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCA5ZGE1ZWYzLi5mZjQ0MGJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTU2OCw2ICs1NjgsOSBAQAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHkoKTsKIAorICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHVzZWQgYnkgZHVtcCgpIC0gdGhpcyBoYXMgbm8gc2lkZSBlZmZlY3RzLgorICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Q7CisKICAgICAvLyBDdXJyZW50bHkgQXVkaW9GbGluZ2VyIHdpbGwgY2FsbCBmcmFtZXNSZWFkeSgpIGZvciBhIGZhc3QgdHJhY2sgZnJvbSB0d28gdGhyZWFkczoKICAgICAvLyBGYXN0TWl4ZXIgdGhyZWFkLCBhbmQgbm9ybWFsIG1peGVyIHRocmVhZC4gIFRoaXMgaXMgZGFuZ2Vyb3VzLCBhcyB0aGUgcHJveHkgaXMgaW50ZW5kZWQKICAgICAvLyB0byBiZSBjYWxsZWQgZnJvbSBhdCBtb3N0IG9uZSB0aHJlYWQgb2Ygc2VydmVyLCBhbmQgb25lIHRocmVhZCBvZiBjbGllbnQuCkBAIC02MjAsNiArNjIzLDcgQEAKIAogcHVibGljOgogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHkoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2gpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL0lSYWRpby5oIGIvaW5jbHVkZS9yYWRpby9JUmFkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3N2Y4Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW8gOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW86IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW8+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oIGIvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MmFkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpb0NsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvQ2xpZW50KTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOwotCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW9DbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvQ2xpZW50PgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvU2VydmljZS5oIGIvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDZkZDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvOwotY2xhc3MgSVJhZGlvQ2xpZW50OwotCi1jbGFzcyBJUmFkaW9TZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9TZXJ2aWNlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3QgcmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblJhZGlvU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vUmFkaW8uaCBiL2luY2x1ZGUvcmFkaW8vUmFkaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0ZGQyZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL1JhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lbW9yeURlYWxlcjsKLQotY2xhc3MgUmFkaW8gOiBwdWJsaWMgQm5SYWRpb0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotewotcHVibGljOgotCi0gICAgdmlydHVhbCB+UmFkaW8oKTsKLQotICAgIHN0YXRpYyAgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7Ci0gICAgc3RhdGljICBzcDxSYWRpbz4gYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spOwotCi0KLSAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBjYW5jZWwoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpOwotCi0gICAgICAgICAgICAvLyBCcFJhZGlvQ2xpZW50Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwotCi0gICAgICAgICAgICAvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgIFJhZGlvKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYpOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IGdldFJhZGlvU2VydmljZSgpOwotCi0gICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgICAgIHNwPElSYWRpbz4gICAgICAgICAgICAgIG1JUmFkaW87Ci0gICAgICAgICAgICBzcDxSYWRpb0NhbGxiYWNrPiAgICAgICBtQ2FsbGJhY2s7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oIGIvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhN2YxYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmFkaW9DYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0KLSAgICAgICAgICAgIFJhZGlvQ2FsbGJhY2soKSB7fQotICAgIHZpcnR1YWwgflJhZGlvQ2FsbGJhY2soKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCkgPSAwOwotCi19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IGFmZDExODkuLjNlZTc0OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNiBAQAogCWxpYmxvZyBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCi0JbGlicmFkaW9zZXJ2aWNlIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscyBcCiAJbGliaHdiaW5kZXIKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggZWUwMmQyMy4uMzRjNjI5YiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiUmFkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMTMzLDcgKzEzMiw2IEBACiAgICAgICAgIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCmluZGV4IGY1MzliYTkuLjZlNjBmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCkBAIC0xNiwxMiArMTYsMTQgQEAKICAgICBuYW1lOiAibGliQUF1ZGlvX2hlYWRlcnMiLAogICAgIGZyb206ICJpbmNsdWRlIiwKICAgICB0bzogIiIsCi0gICAgc3JjczogWyJpbmNsdWRlL2FhdWRpby8qLmgiXSwKKyAgICAvLyBvbWl0IEFBdWRpb1Rlc3RpbmcuaDsgc3VwcGxpZWQgc2VwYXJhdGVseSB0byB0aG9zZSB3aG8gbmVlZCBpdAorICAgIHNyY3M6IFsiaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgiXSwKICAgICBsaWNlbnNlOiAiaW5jbHVkZS9hYXVkaW8vTk9USUNFIiwKIH0KIAogbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhYXVkaW8iLAorICAgIC8vIGRlbGliZXJhdGVseSBpbmNsdWRlcyBzeW1ib2xzIGZyb20gQUF1ZGlvVGVzdGluZy5oCiAgICAgc3ltYm9sX2ZpbGU6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiAgICAgZmlyc3RfdmVyc2lvbjogIjI2IiwKICAgICB1bnZlcnNpb25lZF91bnRpbDogImN1cnJlbnQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL09XTkVSUyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDkxMGIxMGMuLmVkZjY0NGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiZGV2aWNlSWQgPSAlZFxuIiwgZGV2aWNlSWQpOwogCi0gICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoIlNhbXBsZXNQZXJGcmFtZSA9ICVkXG4iLCBhY3R1YWxTYW1wbGVzUGVyRnJhbWUpOwogICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZVJhdGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaAppbmRleCBjYjEyZmRhLi42YmU5MTEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaApAQCAtNzcsNyArNzcsNyBAQAogICAgICAgICBpZiAobVN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7CisgICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOzsKICAgICB9CiAgICAgLyoqCiAgICAgICogT25seSBjYWxsIHRoaXMgYWZ0ZXIgb3BlbigpIGhhcyBiZWVuIGNhbGxlZC4KQEAgLTE3OSw3ICsxNzksNyBAQAogCiAgICAgLy8gV3JpdGUgemVybyBkYXRhIHRvIGZpbGwgdXAgdGhlIGJ1ZmZlciBhbmQgcHJldmVudCB1bmRlcnJ1bnMuCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByaW1lKCkgewotICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbSk7CisgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTsKICAgICAgICAgY29uc3QgaW50IG51bUZyYW1lcyA9IDMyOyAvLyBhcmJpdHJhcnkKICAgICAgICAgZmxvYXQgemVyb3NbbnVtRnJhbWVzICogc2FtcGxlc1BlckZyYW1lXTsKICAgICAgICAgbWVtc2V0KHplcm9zLCAwLCBzaXplb2YoemVyb3MpKTsKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgIH0KICAgICBQZWFrVHJhY2tlckRhdGFfdCAqZGF0YSA9IChQZWFrVHJhY2tlckRhdGFfdCAqKSB1c2VyRGF0YTsKICAgICAvLyBwcmludGYoIk15Q2FsbGJhY2tQcm9jKCk6IGZyYW1lQ291bnQgPSAlZFxuIiwgbnVtRnJhbWVzKTsKLSAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoc3RyZWFtKTsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKICAgICBmbG9hdCBzYW1wbGU7CiAgICAgLy8gVGhpcyBjb2RlIGFzc3VtZSBtb25vIG9yIHN0ZXJlby4KICAgICBzd2l0Y2ggKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IGUxODg2YWMuLmU1ZjBkZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTIzNCwxNCArMjM0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogLyoqCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkKLSAqLwotLy8gVE9ETyByZW1vdmUgYXMgc29vbiBhcyB0aGUgTkRLIGFuZCBPUyBhcmUgaW4gc3luYywgYmVmb3JlIFJDMQotQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpOwotCi0vKioKICAqIFJlcXVlc3QgYSBzYW1wbGUgZGF0YSBmb3JtYXQsIGZvciBleGFtcGxlIEFBVURJT19GT1JNQVRfUENNX0kxNi4KICAqCiAgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KQEAgLTcyOSwxNSArNzIxLDYgQEAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKIAogLyoqCi0gKiBUaGUgc2FtcGxlc1BlckZyYW1lIGlzIGFsc28ga25vd24gYXMgY2hhbm5lbENvdW50LgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkKLSAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGFjdHVhbCBzYW1wbGVzIHBlciBmcmFtZQotICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7Ci0KLS8qKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYWN0dWFsIGRldmljZSBJRAogICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQgYi9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKaW5kZXggMmJhNTI1MC4uYjkwMTJlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CisrKyBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dApAQCAtMTEsNyArMTEsNiBAQAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjazsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjazsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWU7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQ7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQ7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZTsKQEAgLTM1LDcgKzM0LDYgQEAKICAgICBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lczsKICAgICBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50OwogICAgIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlOwotICAgIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWU7CiAgICAgQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudDsKICAgICBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlOwogICAgIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IDNmNWRlNzcuLmNhNDI0NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMTUwLDEzICsxNTAsNiBAQAogICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOwogfQogCi1BQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKLXsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKLX0KLQogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKQogewpAQCAtMzU3LDEyICszNTAsNiBAQAogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0U2FtcGxlc1BlckZyYW1lKCk7CiB9CiAKLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKQotewotICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLX0KLQogQUFVRElPX0FQSSBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggMmY3MTBiZC4uMjExYmQ3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtMTI5Nyw3ICsxMjk3LDcgQEAKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogICAgIH0KIAogICAgIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGNiKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCBiMGIwMWRiLi4zMWUxZTJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KQEAgLTYyLDExICs2Myw2IEBACiAgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOwogfQogCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgY29udmVydFRpbWVzcGVjVG9Ocyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KQotewotICAgIHJldHVybiB0di50dl9zZWMgKiAobG9uZyBsb25nKU5BTk9TX1BFUl9TRUNPTkQgKyB0di50dl9uc2VjOwotfQotCiAvLyBjdXJyZW50IG1vbm90b25pYyB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KIHN0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkKIHsKQEAgLTI1NjMsNyArMjU1OSw3IEBACiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgogICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEIC8qIG5vdCBuZWVkZWQ6IFNUQVRFX1BBVVNFRF9TVE9QUElORyAqLykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhdCA9IGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhdCA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFnID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl9MQVNUS0VSTkVMT0tdIDwgMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMX0xBU1RLRVJORUxPS10gPCAwKQpAQCAtMjY5NSw4ICsyNjkxLDkgQEAKICAgICAvLyBUaGlzIGlzIHNvbWV0aW1lcyBjYXVzZWQgYnkgZXJyYXRpYyByZXBvcnRzIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFMU0EgZHJpdmVycy4KICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcFZhbGlkKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9OcyhtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBwcmV2aW91c1RpbWVOYW5vcyA9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKQEAgLTI3MjYsNyArMjcyMyw3IEBACiAjaWYgMAogICAgICAgICAgICAgLy8gVW5jb21tZW50IHRoaXMgdG8gdmVyaWZ5IGF1ZGlvIHRpbWVzdGFtcCByYXRlLgogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVRpbWUgPQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VGltZXNwZWNUb05zKHRpbWVzdGFtcC5tVGltZSkgLSBwcmV2aW91c1RpbWVOYW5vczsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKSAtIHByZXZpb3VzVGltZU5hbm9zOwogICAgICAgICAgICAgaWYgKGRlbHRhVGltZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb21wdXRlZFNhbXBsZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCAvIGRlbHRhVGltZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMmNlNmM2My4uZTQ5OTQ1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIC8vIGEgdmFsdWUgYmV0d2VlbiAib3RoZXIiICsgMSBhbmQgIm90aGVyIiArIElOVDMyX01BWCwgdGhlIGNob2ljZSBvZgogLy8gd2hpY2ggbmVlZHMgdG8gYmUgdGhlICJsZWFzdCByZWNlbnRseSB1c2VkIiBzZXF1ZW5jZSB2YWx1ZSBmb3IgInNlbGYiLgogLy8gSW4gZ2VuZXJhbCwgdGhpcyBtZWFucyAobmV3X3NlbGYpIHJldHVybmVkIGlzIG1heChzZWxmLCBvdGhlcikgKyAxLgotCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHN0YXRpYyB1aW50MzJfdCBpbmNyZW1lbnRTZXF1ZW5jZSh1aW50MzJfdCBzZWxmLCB1aW50MzJfdCBvdGhlcikgewogICAgIGludDMyX3QgZGlmZiA9IChpbnQzMl90KSBzZWxmIC0gKGludDMyX3QpIG90aGVyOwogICAgIGlmIChkaWZmID49IDAgJiYgZGlmZiA8IElOVDMyX01BWCkgewpAQCAtMzg5LDYgKzM4OSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCiB7CiAgICAgLy8gVGhpcyB3b3JrcyBmb3IgbUZyYW1lQ291bnRQMiA8PSAyXjMwCkBAIC04MzIsNiArODMzLDI1IEBACiAgICAgcmV0dXJuIGZpbGxlZDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9UcmFja1NlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgY29uc3QgaW50MzJfdCBmbHVzaCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisgICAgaWYgKGZsdXNoICE9IG1GbHVzaCkgeworICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIGJvb2wgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c2V0U3RyZWFtRW5kRG9uZSgpIHsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICBib29sIG9sZCA9CkBAIC04NDMsNiArODYzLDcgQEAKICAgICByZXR1cm4gb2xkOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CkBAIC05MDAsNiArOTIxLDExIEBACiAgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7CiB9CiAKK3NpemVfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7Cit9CisKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dXBkYXRlU3RhdGVXaXRoTG9vcCgKICAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLCBjb25zdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgJnVwZGF0ZSkgY29uc3QKIHsKQEAgLTk5Myw2ICsxMDE5LDcgQEAKICAgICByZXR1cm4gKHNzaXplX3QpIG1TdGF0ZS5tUG9zaXRpb247CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2gpCiB7CiAgICAgaWYgKG1Jc1NodXRkb3duKSB7CkBAIC0xMDM3LDYgKzEwNjQsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6cmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5tRnJhbWVDb3VudDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKaW5kZXggOThhMDUyMS4uYWQ3ZjFkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTQ4LDYgKzQ4LDE4IEBACiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjb25maWctPmZvcm1hdCk7CiB9CiAKK2lubGluZSB2b2lkIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEsIHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgY2xpZW50SW5mby0+dWlkID0gKHVpZF90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICBjbGllbnRJbmZvLT5zZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICBjbGllbnRJbmZvLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7Cit9CisKK2lubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworICAgIGRhdGEud3JpdGVVaW50MzIoKHVpbnQzMl90KSBjbGllbnRJbmZvLT51aWQpOworICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c2Vzc2lvbik7CisgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zb3VyY2UpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgogewpAQCAtODAsMTQgKzkyLDEzIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV2ZW50KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc291cmNlKTsKKyAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBjbGllbnRDb25maWcpOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGRldmljZUNvbmZpZyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwYXRjaEhhbmRsZSk7CkBAIC0xMjMsMTQgKzEzNCwxNCBAQAogICAgIGNhc2UgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGV2ZW50ID0gKGludCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IGNsaWVudEluZm87CiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZzsKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnOworICAgICAgICAgICAgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsICZjbGllbnRJbmZvKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZjbGllbnRDb25maWcpOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmRldmljZUNvbmZpZyk7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgc2Vzc2lvbiwgc291cmNlLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmY2xpZW50SW5mbywgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgcGF0Y2hIYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKQEAgLTAsMCArMSwzIEBACitna2FzdGVuQGdvb2dsZS5jb20KK2ptdHJpdmlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDJlMzlkMjMuLjRkNWIzMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7CiB0eXBlZGVmIHZvaWQgKCpkeW5hbWljX3BvbGljeV9jYWxsYmFjaykoaW50IGV2ZW50LCBTdHJpbmc4IHJlZ0lkLCBpbnQgdmFsKTsKLXR5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGludCBzb3VyY2UsCit0eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKIApAQCAtNDQwLDggKzQ0MCw5IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCiAgICAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZDk0YWQwMC4uZTBkMjQ5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTI2LDYgKzI2LDE2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyB7CisgICAgdWlkX3QgdWlkOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKK307CisKK3R5cGVkZWYgc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyByZWNvcmRfY2xpZW50X2luZm9fdDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKIHsKIHB1YmxpYzoKQEAgLTM4LDggKzQ4LDggQEAKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgbWl4aW5nIHN0YXRlIG9mIGEgc3BlY2lmaWMgbWl4IGluIGEgZHluYW1pYyBhdWRpbyBwb2xpY3kKICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHJlY29yZGluZyBjb25maWd1cmF0aW9uCi0gICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tayBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKaW5kZXggZTU5MjE2OS4uODI3OTA4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCkBAIC0zLDYgKzMsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYmN1dGlscyAgIFwKICAgICBsaWJsb2cgICAgICBcCiAgICAgbGlidXRpbHMgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcAppbmRleCA3MWZiZDk4Li40OWVmOTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtOTgsNyArOTgsOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIERldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSB7CisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKIH0KIAogRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7CkBAIC0xMjAsMjQgKzEyMSwyMSBAQAogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgcHJpbWFyeURldi0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIHByaW1hcnlEZXYtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHByaW1hcnlEZXYtPmdldE1hc3RlclZvbHVtZSgKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CkBAIC0xNDksOSArMTQ3LDggQEAKIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIHByaW1hcnlEZXYtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaAppbmRleCA5ZGEwMmE0Li44NjUxYjUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCkBAIC0xOCwxMSArMTgsMTMgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTEwLDYgKzExMiw3IEBACiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKICAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOworICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KIAogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTZhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKQEAgLTAsMCArMSwyIEBACitrcm9jYXJkQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggNDI3ODVkNS4uMTc2YWJlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTQ4LDYgKzQ4LDE4IEBACiAgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAogICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CiB9CiAKIFN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewpAQCAtMTM1LDYgKzE0Nyw3IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIApAQCAtMzExLDcgKzMyNCw3IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKICAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwpAQCAtMzIwLDYgKzMzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKICAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKQEAgLTU4MCw3ICs1OTUsNyBAQAogICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwogICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAorICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCiAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewogICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwogICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKQEAgLTU5MSw2ICs2MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CiAgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CiAgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAppbmRleCBhN2RmMjc2Li5hNjljY2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1JbjsKQEAgLTEwMyw2ICsxMDQsOSBAQAogCiAgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwogICAgIElTdHJlYW0gKm1TdHJlYW07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKaW5kZXggMDU4MDBhMC4uZGMxN2Y1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMjcsNyArMjcsMTUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOworICAgIH0KIH0KIAogU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKQEAgLTk1LDcgKzEwMyw5IEBACiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewpAQCAtMTMzLDYgKzE0Myw3IEBACiAgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwogICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgICp3cml0dGVuID0gMDsKQEAgLTI2Niw2ICsyNzcsNyBAQAogICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CiAgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CiAgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICAqcmVhZCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaAppbmRleCA4Yzk2YzFmLi5jNzEzNmRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKIAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODMsNiArODQsOSBAQAogCiAgICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4YjFhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CitwdWJsaWM6CisgICAgU3RyZWFtUG93ZXJMb2coKSA6CisgICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKKyAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAorICAgICAgICBtRnJhbWVTaXplKDApIHsKKyAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KKyAgICB9CisKKyAgICB+U3RyZWFtUG93ZXJMb2coKSB7CisgICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCisgICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCisgICAgfQorCisgICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgorICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKKyAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAorICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOworICAgIH0KKworICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgorICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCisgICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAorICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAorICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOworICAgIH0KKworICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLworICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOworCisgICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7CisgICAgc2l6ZV90IG1GcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlSGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvU3RyZWFtSGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9oaWRsL0hhbERlYXRoSGFuZGxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCmluZGV4IGNjYWEyYjQuLjBkZDNmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKQEAgLTEgKzEgQEAKLXN1YmRpcnMgPSBbImZhY3RvcnkiXQorc3ViZGlycyA9IFsiZmFjdG9yeSIsICJjb25maWciXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitrcm9jYXJkQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KK3JhZ29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5OGE5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNyBAQAorLy8gRWZmZWN0IGNvbmZpZ3VyYXRpb24KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZWZmZWN0c2NvbmZpZyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsic3JjL0VmZmVjdHNDb25maWcuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnRpbnl4bWwyIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExNzMwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfTUVESUFfRUZGRUNUU0NPTkZJR19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfRUZGRUNUU0NPTkZJR19ICisKKy8qKiBAZmlsZSBQYXJzZXMgYXVkaW8gZWZmZWN0cyBjb25maWd1cmF0aW9uIGZpbGUgdG8gQyBhbmQgQysrIHN0cnVjdHVyZS4KKyAqIEBzZWUgYXVkaW9fZWZmZWN0c19jb25mX1YyXzAueHNkIGZvciBkb2N1bWVudGF0aW9uIG9uIGVhY2ggc3RydWN0dXJlCisgKi8KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgeworCisvKiogRGVmYXVsdCBwYXRoIG9mIGVmZmVjdCBjb25maWd1cmF0aW9uIGZpbGUuICovCitjb25zdGV4cHIgY2hhciBERUZBVUxUX1BBVEhbXSA9ICIvdmVuZG9yL2V0Yy9hdWRpb19lZmZlY3RzLnhtbCI7CisKKy8qKiBEaXJlY3RvcmllcyB3aGVyZSB0aGUgZWZmZWN0IGxpYnJhcmllcyB3aWxsIGJlIHNlYXJjaCBmb3IuICovCitjb25zdGV4cHIgY29uc3QgY2hhciogTERfRUZGRUNUX0xJQlJBUllfUEFUSFtdID0KKyNpZmRlZiBfX0xQNjRfXworICAgICAgICB7Ii9vZG0vbGliNjQvc291bmRmeCIsICIvdmVuZG9yL2xpYjY0L3NvdW5kZngiLCAiL3N5c3RlbS9saWI2NC9zb3VuZGZ4In07CisjZWxzZQorICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07CisjZW5kaWYKKworc3RydWN0IExpYnJhcnkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjpzdHJpbmcgcGF0aDsKK307Cit1c2luZyBMaWJyYXJpZXMgPSBzdGQ6OnZlY3RvcjxMaWJyYXJ5PjsKKworc3RydWN0IEVmZmVjdEltcGwgeworICAgIExpYnJhcnkqIGxpYnJhcnk7IC8vPCBPbmx5IHZhbGlkIGFzIGxvbmcgYXMgdGhlIGFzc29jaWF0ZWQgbGlicmFyeSB2ZWN0b3IgaXMgdW5tb2RpZmllZAorICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKK307CisKK3N0cnVjdCBFZmZlY3QgOiBwdWJsaWMgRWZmZWN0SW1wbCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBib29sIGlzUHJveHk7CisgICAgRWZmZWN0SW1wbCBsaWJTdzsgLy88IE9ubHkgdmFsaWQgaWYgaXNQcm94eQorICAgIEVmZmVjdEltcGwgbGliSHc7IC8vPCBPbmx5IHZhbGlkIGlmIGlzUHJveHkKK307CisKK3VzaW5nIEVmZmVjdHMgPSBzdGQ6OnZlY3RvcjxFZmZlY3Q+OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK3N0cnVjdCBTdHJlYW0geworICAgIFR5cGUgdHlwZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEVmZmVjdD4+IGVmZmVjdHM7Cit9OwordXNpbmcgT3V0cHV0U3RyZWFtID0gU3RyZWFtPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OwordXNpbmcgSW5wdXRTdHJlYW0gPSBTdHJlYW08YXVkaW9fc291cmNlX3Q+OworCisvKiogUGFyc2VkIGNvbmZpZ3VyYXRpb24uCisgKiBJbnRlbmRlZCB0byBiZSBhIHRyYW5zaWVudCBzdHJ1Y3R1cmUgb25seSB1c2VkIGZvciBkZXNlcmlhbGl6YXRpb24uCisgKiBOb3RlOiBFdmVyeXRoaW5nIGlzIGNvcGllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSB4bWwgZG9tLgorICogICAgICAgSWYgY29waWVzIG5lZWRlZCB0byBiZSBhdm9pZGVkIGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZSwKKyAqICAgICAgIGNvbnNpZGVyIGtlZXBpbmcgYSBwcml2YXRlIGhhbmRsZSBvbiB0aGUgeG1sIGRvbSBhbmQgcmVwbGFjZSBhbGwgc3RyaW5ncyBieSBkb20gcG9pbnRlcnMuCisgKiAgICAgICBPciBldmVuIGJldHRlciwgdXNlIFNBWCBwYXJzaW5nIHRvIGF2b2lkIHRoZSBhbGxvY2F0aW9ucyBhbGwgdG9nZXRoZXIuCisgKi8KK3N0cnVjdCBDb25maWcgeworICAgIGZsb2F0IHZlcnNpb247CisgICAgTGlicmFyaWVzIGxpYnJhcmllczsKKyAgICBFZmZlY3RzIGVmZmVjdHM7CisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtPiBwb3N0cHJvY2VzczsKKyAgICBzdGQ6OnZlY3RvcjxJbnB1dFN0cmVhbT4gcHJlcHJvY2VzczsKK307CisKKy8qKiBSZXN1bHQgb2YgYHBhcnNlKGNvbnN0IGNoYXIqKWAgKi8KK3N0cnVjdCBQYXJzaW5nUmVzdWx0IHsKKyAgICAvKiogUGFyc2VkIGNvbmZpZywgbnVsbHB0ciBpZiB0aGUgeG1sIGxpYiBjb3VsZCBub3QgbG9hZCB0aGUgZmlsZSAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+IHBhcnNlZENvbmZpZzsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudDsgLy88IE51bWJlciBvZiBza2lwcGVkIGludmFsaWQgbGlicmFyeSwgZWZmZWN0IG9yIHByb2Nlc3NpbmcgY2hhaW4KK307CisKKy8qKiBQYXJzZXMgdGhlIHByb3ZpZGVkIGVmZmVjdCBjb25maWd1cmF0aW9uLgorICogUGFyc2luZyBkbyBub3Qgc3RvcCBvZiBmaXJzdCBpbnZhbGlkIGVsZW1lbnQsIGJ1dCBjb250aW51ZXMgdG8gdGhlIG5leHQuCisgKiBAc2VlIFBhcnNpbmdSZXN1bHQ6Om5iU2tpcHBlZEVsZW1lbnQKKyAqLworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoID0gREVGQVVMVF9QQVRIKTsKKworfSAvLyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDYyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNDb25maWciCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHRpbnl4bWwyLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgorCit1c2luZyBuYW1lc3BhY2UgdGlueXhtbDI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3RzQ29uZmlnIHsKKworLyoqIEFsbCBmdW5jdGlvbnMgZXhjZXB0IGBwYXJzZShjb25zdCBjaGFyKilgIGFyZSBzdGF0aWMuICovCituYW1lc3BhY2UgeworCisvKiogQHJldHVybiBhbGwgYG5vZGVgcyBjaGlsZHJlbiB0aGF0IGFyZSBlbGVtZW50cyBhbmQgbWF0Y2ggdGhlIHRhZyBpZiBwcm92aWRlZC4gKi8KK3N0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgWE1MRWxlbWVudD4+IGdldENoaWxkcmVuKGNvbnN0IFhNTE5vZGUmIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjaGlsZFRhZyA9IG51bGxwdHIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFhNTEVsZW1lbnQ+PiBjaGlsZHJlbjsKKyAgICBmb3IgKGF1dG8qIGNoaWxkID0gbm9kZS5GaXJzdENoaWxkRWxlbWVudChjaGlsZFRhZyk7IGNoaWxkICE9IG51bGxwdHI7CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5OZXh0U2libGluZ0VsZW1lbnQoY2hpbGRUYWcpKSB7CisgICAgICAgIGNoaWxkcmVuLmVtcGxhY2VfYmFjaygqY2hpbGQpOworICAgIH0KKyAgICByZXR1cm4gY2hpbGRyZW47Cit9CisKKy8qKiBAcmV0dXJuIHhtbCBkdW1wIG9mIHRoZSBwcm92aWRlZCBlbGVtZW50LgorICogQnkgbm90IHByb3ZpZGluZyBhIHByaW50ZXIsIGl0IGlzIGltcGxpY2l0bHkgY3JlYXRlZCBpbiB0aGUgY2FsbGVyIGNvbnRleHQuCisgKiBJbiBzdWNoIGNhc2UgdGhlIHJldHVybiBwb2ludGVyIGhhcyB0aGUgc2FtZSBsaWZldGltZSBhcyB0aGUgZXhwcmVzc2lvbiBjb250YWluaW5nIGR1bXAoKS4KKyAqLworY29uc3QgY2hhciogZHVtcChjb25zdCBYTUxFbGVtZW50JiBlbGVtZW50LCBYTUxQcmludGVyJiYgcHJpbnRlciA9IHt9KSB7CisgICAgZWxlbWVudC5BY2NlcHQoJnByaW50ZXIpOworICAgIHJldHVybiBwcmludGVyLkNTdHIoKTsKK30KKworCitib29sIHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgdWludDMyX3QgdG1wWzEwXTsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBNYXAgdGhlIGVudW0gYW5kIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZyB0eXBlLgorICogIEludGVuZGVkIHRvIGJlIHNwZWNpYWxpemVkIGZvciBlYWNoIGVudW0gdG8gZGVzZXJpYWxpemUuCisgKiAgVGhlIGdlbmVyYWwgdGVtcGxhdGUgaXMgZGlzYWJsZWQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBFbnVtPgorY29uc3RleHByIHN0ZDo6ZW5hYmxlX2lmPGZhbHNlLCBFbnVtPiBTVFJFQU1fTkFNRV9NQVA7CisKKy8qKiBBbGwgb3V0cHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCisgKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICovCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIHN0ZDo6cGFpcjxhdWRpb19zdHJlYW1fdHlwZV90LCBjb25zdCBjaGFyKj4gU1RSRUFNX05BTUVfTUFQPGF1ZGlvX3N0cmVhbV90eXBlX3Q+W10gPSB7CisgICAgICAgIHtBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgInZvaWNlX2NhbGwifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9TWVNURU0sICJzeXN0ZW0ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9SSU5HLCAicmluZyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX01VU0lDLCAibXVzaWMifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9BTEFSTSwgImFsYXJtIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OLCAibm90aWZpY2F0aW9uIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgImJsdWV0b290aF9zY28ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAiZW5mb3JjZWRfYXVkaWJsZSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0RUTUYsICJkdG1mIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fVFRTLCAidHRzIn0sCit9OworCisvKiogQWxsIGlucHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCisgKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICovCit0ZW1wbGF0ZSA8PgorY29uc3RleHByIHN0ZDo6cGFpcjxhdWRpb19zb3VyY2VfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zb3VyY2VfdD5bXSA9IHsKKyAgICAgICAge0FVRElPX1NPVVJDRV9NSUMsICJtaWMifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9VUExJTkssICJ2b2ljZV91cGxpbmsifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSywgInZvaWNlX2Rvd25saW5rIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCwgInZvaWNlX2NhbGwifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9DQU1DT1JERVIsICJjYW1jb3JkZXIifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgInZvaWNlX3JlY29nbml0aW9uIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgInZvaWNlX2NvbW11bmljYXRpb24ifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9VTlBST0NFU1NFRCwgInVucHJvY2Vzc2VkIn0sCit9OworCisvKiogRmluZCB0aGUgc3RyZWFtIHR5cGUgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJlYW0gdHlwZSBuYW1lIG9yIHJldHVybiBmYWxzZSAqLwordGVtcGxhdGUgPGNsYXNzIFR5cGU+Citib29sIHN0cmluZ1RvU3RyZWFtVHlwZShjb25zdCBjaGFyICpzdHJlYW1OYW1lLCBUeXBlKiB0eXBlKQoreworICAgIGZvciAoYXV0byYgc3RyZWFtTmFtZVBhaXIgOiBTVFJFQU1fTkFNRV9NQVA8VHlwZT4pIHsKKyAgICAgICAgaWYgKHN0cmNtcChzdHJlYW1OYW1lUGFpci5zZWNvbmQsIHN0cmVhbU5hbWUpID09IDApIHsKKyAgICAgICAgICAgICp0eXBlID0gc3RyZWFtTmFtZVBhaXIuZmlyc3Q7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBQYXJzZSBhIGxpYnJhcnkgeG1sIG5vdGUgYW5kIHB1c2ggdGhlIHJlc3VsdCBpbiBsaWJyYXJpZXMgb3IgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUuICovCitib29sIHBhcnNlTGlicmFyeShjb25zdCBYTUxFbGVtZW50JiB4bWxMaWJyYXJ5LCBMaWJyYXJpZXMqIGxpYnJhcmllcykgeworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSB4bWxMaWJyYXJ5LkF0dHJpYnV0ZSgibmFtZSIpOworICAgIGNvbnN0IGNoYXIqIHBhdGggPSB4bWxMaWJyYXJ5LkF0dHJpYnV0ZSgicGF0aCIpOworICAgIGlmIChuYW1lID09IG51bGxwdHIgfHwgcGF0aCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJsaWJyYXJ5IG11c3QgaGF2ZSBhIG5hbWUgYW5kIGEgcGF0aDogJXMiLCBkdW1wKHhtbExpYnJhcnkpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsaWJyYXJpZXMtPnB1c2hfYmFjayh7bmFtZSwgcGF0aH0pOworICAgIHJldHVybiB0cnVlOworfQorCisvKiogRmluZCBhbiBlbGVtZW50IGluIGEgY29sbGVjdGlvbiBieSBpdHMgbmFtZS4KKyAqIEByZXR1cm4gbnVsbHB0ciBpZiBub3QgZm91bmQsIHRoZSBlbGxlbWVudHMgYWRkcmVzcyBpZiBmb3VuZC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitUKiBmaW5kQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHN0ZDo6dmVjdG9yPFQ+JiBjb2xsZWN0aW9uKSB7CisgICAgYXV0byBpdCA9IGZpbmRfaWYoYmVnaW4oY29sbGVjdGlvbiksIGVuZChjb2xsZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV0gKGF1dG8mIGl0ZW0pIHsgcmV0dXJuIGl0ZW0ubmFtZSA9PSBuYW1lOyB9KTsKKyAgICByZXR1cm4gaXQgIT0gZW5kKGNvbGxlY3Rpb24pID8gJippdCA6IG51bGxwdHI7Cit9CisKKy8qKiBQYXJzZSBhbiBlZmZlY3QgZnJvbSBhbiB4bWwgZWxlbWVudCBkZXNjcmliaW5nIGl0LgorICogQHJldHVybiB0cnVlIGFuZCBwdXNoZXMgdGhlIGVmZmVjdCBpbiBlZmZlY3RzIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIGZhbHNlIG9uIGZhaWx1cmUuICovCitib29sIHBhcnNlRWZmZWN0KGNvbnN0IFhNTEVsZW1lbnQmIHhtbEVmZmVjdCwgTGlicmFyaWVzJiBsaWJyYXJpZXMsIEVmZmVjdHMqIGVmZmVjdHMpIHsKKyAgICBFZmZlY3QgZWZmZWN0e307CisKKyAgICBjb25zdCBjaGFyKiBuYW1lID0geG1sRWZmZWN0LkF0dHJpYnV0ZSgibmFtZSIpOworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIG11c3QgaGF2ZSBhIG5hbWU6ICVzIiwgeG1sRWZmZWN0LlZhbHVlKCksIGR1bXAoeG1sRWZmZWN0KSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWZmZWN0Lm5hbWUgPSBuYW1lOworCisgICAgLy8gRnVuY3Rpb24gdG8gcGFyc2UgZWZmZWN0LmxpYnJhcnkgYW5kIGVmZmVjdC51dWlkIGZyb20geG1sCisgICAgYXV0byBwYXJzZUltcGwgPSBbJmxpYnJhcmllc10oY29uc3QgWE1MRWxlbWVudCYgeG1sSW1wbCwgRWZmZWN0SW1wbCYgZWZmZWN0KSB7CisgICAgICAgIC8vIFJldHJpZXZlIGxpYnJhcnkgbmFtZSBhbmQgdXVpZCBmcm9tIHhtbAorICAgICAgICBjb25zdCBjaGFyKiBsaWJyYXJ5TmFtZSA9IHhtbEltcGwuQXR0cmlidXRlKCJsaWJyYXJ5Iik7CisgICAgICAgIGNvbnN0IGNoYXIqIHV1aWQgPSB4bWxJbXBsLkF0dHJpYnV0ZSgidXVpZCIpOworICAgICAgICBpZiAobGlicmFyeU5hbWUgPT0gbnVsbHB0ciB8fCB1dWlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlZmZlY3QgbXVzdCBoYXZlIGEgbGlicmFyeSBuYW1lIGFuZCBhIHV1aWQ6ICVzIiwgZHVtcCh4bWxJbXBsKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IGxpYnJhcnkgbmFtZSB0byBhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzbHkgbG9hZGVkIGxpYnJhcnkKKyAgICAgICAgYXV0byogbGlicmFyeSA9IGZpbmRCeU5hbWUobGlicmFyeU5hbWUsIGxpYnJhcmllcyk7CisgICAgICAgIGlmIChsaWJyYXJ5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBsaWJyYXJ5IHJlZmVyZW5jZWQgaW46ICVzIiwgZHVtcCh4bWxJbXBsKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0LmxpYnJhcnkgPSBsaWJyYXJ5OworCisgICAgICAgIGlmICghc3RyaW5nVG9VdWlkKHV1aWQsICZlZmZlY3QudXVpZCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHV1aWQgaW46ICVzIiwgZHVtcCh4bWxJbXBsKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfTsKKworICAgIGlmICghcGFyc2VJbXBsKHhtbEVmZmVjdCwgZWZmZWN0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHByb3h5IGVmZmVjdHMKKyAgICBlZmZlY3QuaXNQcm94eSA9IGZhbHNlOworICAgIGlmIChzdGQ6OnN0cmNtcCh4bWxFZmZlY3QuTmFtZSgpLCAiZWZmZWN0UHJveHkiKSA9PSAwKSB7CisgICAgICAgIGVmZmVjdC5pc1Byb3h5ID0gdHJ1ZTsKKworICAgICAgICAvLyBGdW5jdGlvbiB0byBwYXJzZSBsaWJodyBhbmQgbGlic3cKKyAgICAgICAgYXV0byBwYXJzZVByb3h5ID0gWyZ4bWxFZmZlY3QsICZwYXJzZUltcGxdKGNvbnN0IGNoYXIqIHRhZywgRWZmZWN0SW1wbCYgcHJveHlMaWIpIHsKKyAgICAgICAgICAgIGF1dG8qIHhtbFByb3h5TGliID0geG1sRWZmZWN0LkZpcnN0Q2hpbGRFbGVtZW50KHRhZyk7CisgICAgICAgICAgICBpZiAoeG1sUHJveHlMaWIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJlZmZlY3RQcm94eSBtdXN0IGNvbnRhaW4gYSA8JXM+OiAlcyIsIHRhZywgZHVtcCgqeG1sUHJveHlMaWIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJbXBsKCp4bWxQcm94eUxpYiwgcHJveHlMaWIpOworICAgICAgICB9OworICAgICAgICBpZiAoIXBhcnNlUHJveHkoImxpYmh3IiwgZWZmZWN0LmxpYkh3KSB8fCAhcGFyc2VQcm94eSgibGlic3ciLCBlZmZlY3QubGliU3cpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlZmZlY3RzLT5wdXNoX2JhY2soc3RkOjptb3ZlKGVmZmVjdCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvKiogUGFyc2UgYW4gc3RyZWFtIGZyb20gYW4geG1sIGVsZW1lbnQgZGVzY3JpYmluZyBpdC4KKyAqIEByZXR1cm4gdHJ1ZSBhbmQgcHVzaGVzIHRoZSBzdHJlYW0gaW4gc3RyZWFtcyBvbiBzdWNjZXNzLAorICogICAgICAgICBmYWxzZSBvbiBmYWlsdXJlLiAqLwordGVtcGxhdGUgPGNsYXNzIFN0cmVhbT4KK2Jvb2wgcGFyc2VTdHJlYW0oY29uc3QgWE1MRWxlbWVudCYgeG1sU3RyZWFtLCBFZmZlY3RzJiBlZmZlY3RzLCBzdGQ6OnZlY3RvcjxTdHJlYW0+KiBzdHJlYW1zKSB7CisgICAgY29uc3QgY2hhciogc3RyZWFtVHlwZSA9IHhtbFN0cmVhbS5BdHRyaWJ1dGUoInR5cGUiKTsKKyAgICBpZiAoc3RyZWFtVHlwZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJzdHJlYW0gbXVzdCBoYXZlIGEgdHlwZTogJXMiLCBkdW1wKHhtbFN0cmVhbSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0cmVhbSBzdHJlYW07CisgICAgaWYgKCFzdHJpbmdUb1N0cmVhbVR5cGUoc3RyZWFtVHlwZSwgJnN0cmVhbS50eXBlKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlczogJXMiLCBzdHJlYW1UeXBlLCBkdW1wKHhtbFN0cmVhbSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChhdXRvJiB4bWxBcHBseSA6IGdldENoaWxkcmVuKHhtbFN0cmVhbSwgImFwcGx5IikpIHsKKyAgICAgICAgY29uc3QgY2hhciogZWZmZWN0TmFtZSA9IHhtbEFwcGx5LmdldCgpLkF0dHJpYnV0ZSgiZWZmZWN0Iik7CisgICAgICAgIGlmIChlZmZlY3ROYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0vYXBwbHkgbXVzdCBoYXZlIHJlZmVyZW5jZSBhbiBlZmZlY3Q6ICVzIiwgZHVtcCh4bWxBcHBseSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGF1dG8qIGVmZmVjdCA9IGZpbmRCeU5hbWUoZWZmZWN0TmFtZSwgZWZmZWN0cyk7CisgICAgICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGVmZmVjdCByZWZlcmVuY2VkIGluOiAlcyIsIGR1bXAoeG1sQXBwbHkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0uZWZmZWN0cy5lbXBsYWNlX2JhY2soKmVmZmVjdCk7CisgICAgfQorICAgIHN0cmVhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoc3RyZWFtKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZQorCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBYTUxEb2N1bWVudCBkb2M7CisgICAgZG9jLkxvYWRGaWxlKHBhdGgpOworICAgIGlmIChkb2MuRXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlICVzOiBUaW55eG1sMiBlcnJvciAoJWQpOiAlcyAlcyIsIHBhdGgsCisgICAgICAgICAgICAgIGRvYy5FcnJvcklEKCksIGRvYy5HZXRFcnJvclN0cjEoKSwgZG9jLkdldEVycm9yU3RyMigpKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisKKyAgICBhdXRvIGNvbmZpZyA9IHN0ZDo6bWFrZV91bmlxdWU8Q29uZmlnPigpOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgYXV0byByZWdpc3RlckZhaWx1cmUgPSBbJm5iU2tpcHBlZEVsZW1lbnRzXShib29sIHJlc3VsdCkgeworICAgICAgICBuYlNraXBwZWRFbGVtZW50cyArPSByZXN1bHQgPyAwIDogMTsKKyAgICB9OworICAgIGZvciAoYXV0byYgeG1sQ29uZmlnIDogZ2V0Q2hpbGRyZW4oZG9jLCAiYXVkaW9fZWZmZWN0c19jb25mIikpIHsKKworICAgICAgICAvLyBQYXJzZSBsaWJyYXJ5CisgICAgICAgIGZvciAoYXV0byYgeG1sTGlicmFyaWVzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAibGlicmFyaWVzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sTGlicmFyeSA6IGdldENoaWxkcmVuKHhtbExpYnJhcmllcywgImxpYnJhcnkiKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZUxpYnJhcnkoeG1sTGlicmFyeSwgJmNvbmZpZy0+bGlicmFyaWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBlZmZlY3RzCisgICAgICAgIGZvciAoYXV0byYgeG1sRWZmZWN0cyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgImVmZmVjdHMiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxFZmZlY3QgOiBnZXRDaGlsZHJlbih4bWxFZmZlY3RzKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZUVmZmVjdCh4bWxFZmZlY3QsIGNvbmZpZy0+bGlicmFyaWVzLCAmY29uZmlnLT5lZmZlY3RzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBwcmUgcHJvY2Vzc2luZyBjaGFpbnMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxQcmVwcm9jZXNzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAicHJlcHJvY2VzcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbFN0cmVhbSA6IGdldENoaWxkcmVuKHhtbFByZXByb2Nlc3MsICJzdHJlYW0iKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZVN0cmVhbSh4bWxTdHJlYW0sIGNvbmZpZy0+ZWZmZWN0cywgJmNvbmZpZy0+cHJlcHJvY2VzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgcG9zdCBwcm9jZXNzaW5nIGNoYWlucworICAgICAgICBmb3IgKGF1dG8mIHhtbFBvc3Rwcm9jZXNzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAicG9zdHByb2Nlc3MiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxTdHJlYW0gOiBnZXRDaGlsZHJlbih4bWxQb3N0cHJvY2VzcywgInN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlU3RyZWFtKHhtbFN0cmVhbSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5wb3N0cHJvY2VzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7c3RkOjptb3ZlKGNvbmZpZyksIG5iU2tpcHBlZEVsZW1lbnRzfTsKK30KKworfSAvLyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawppbmRleCA3M2Y2ZWY1Li4yOGI5NmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsNyBAQAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBmMjdkNWNhLi41MTlmNGE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMzLDYgKzMzLDEwIEBACiAKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKKyNlbmRpZgorCiAvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCiB0eXBlZGVmIGVudW0gewogICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCkBAIC04Miw4ICs4NiwxOSBAQAogCiAvLyBudW1iZXIgb2YgZWZmZWN0cyBpbiB0aGlzIGxpYnJhcnkKIGNvbnN0IGludCBrTmJFZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3N0YXRpYyBMVk1fRkxPQVQgY2xhbXBfZmxvYXQoTFZNX0ZMT0FUIGEpIHsKKyAgICBpZiAoYSA+IDEuMGYpIHsKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorICAgIGVsc2UgaWYgKGEgPCAtMS4wZikgeworICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9Cit9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVGVzdCBjb2RlCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI4Niw3ICszMDEsNyBAQAogICAgIHJldHVybiAtRUlOVkFMOwogfQogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCiBzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKQEAgLTM4NSw3ICs0MDAsMTA4IEBACiAKICAgICByZXR1cm4gMDsKIH0KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCiAKK3N0YXRpYyBpbnQgRG93bm1peF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKKworICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXI7CisgICAgTFZNX0ZMT0FUICpwU3JjLCAqcERzdDsKKyAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKilzZWxmOworCisgICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcERvd25taXhlciA9IChkb3dubWl4X29iamVjdF90KikgJnBEd21Nb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYW4gdW5pbml0aWFsaXplZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIGlmIChwRG93bm1peGVyLT5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYSBub24tY29uZmlndXJlZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKworICAgIHBTcmMgPSAoTFZNX0ZMT0FUICopIGluQnVmZmVyLT5zMTY7CisgICAgcERzdCA9IChMVk1fRkxPQVQgKikgb3V0QnVmZmVyLT5zMTY7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKKworICAgIGNvbnN0IGJvb2wgYWNjdW11bGF0ZSA9CisgICAgICAgICAgICAocER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIGNvbnN0IHVpbnQzMl90IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0gcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworCisgICAgc3dpdGNoKHBEb3dubWl4ZXItPnR5cGUpIHsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfU1RSSVA6CisgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyBwU3JjWzBdKTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgcFNyY1sxXSk7CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBwU3JjWzBdOworICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IHBTcmNbMV07CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKKyNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKKyAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gZm9ybWF0cworICAgICAgICBzd2l0Y2goKGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3QpZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IERvd25taXhfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKQEAgLTgxOCw2ICs5MzQsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgpAQCAtODQ1LDcgKzk2MiwzNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUlIKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBGTCArIFJMCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArICgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZikpOworICAgICAgICAgICAgLy8gRlIgKyBSUgorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdCgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZik7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKQEAgLTg2NCw2ICsxMDA5LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTkwOCw3ICsxMDU0LDUyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbHNlCit2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gNjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTdQb2ludDEoKQpAQCAtOTI3LDYgKzExMTgsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTApAQCAtOTczLDggKzExNjUsNTQgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07CisgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gODsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEdlbmVyaWMoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDAxLDYgKzEyMzksNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAKQEAgLTEwOTIsMyArMTMzMSw5NiBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KKyNlbHNlCitib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKworICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKG1hc2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGhhc1NpZGVzID0gKG1hc2sgJiBrU2lkZXMpICE9IDA7CisgICAgY29uc3QgYm9vbCBoYXNCYWNrcyA9IChtYXNrICYga0JhY2tzKSAhPSAwOworCisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CisgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKKyAgICBjb25zdCBib29sIGhhc0xGRSA9CisgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKKyAgICBjb25zdCBib29sIGhhc0JDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKTsKKyAgICAvLyBjb21wdXRlIGF0IHdoYXQgaW5kZXggZWFjaCBjaGFubmVsIGlzOiBzYW1wbGVzIHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgICAvLyAgIEZMIEZSIEZDIExGRSBCTCBCUiBCQyBTTCBTUgorICAgIC8vIHdoZW4gYSBjaGFubmVsIGlzIG5vdCBwcmVzZW50LCBpdHMgaW5kZXggaXMgc2V0IHRvIHRoZSBzYW1lIGFzIHRoZSBpbmRleCBvZiB0aGUgcHJlY2VkaW5nCisgICAgLy8gY2hhbm5lbAorICAgIGNvbnN0IGludCBpbmRleEZDICA9IGhhc0ZDICAgID8gMiAgICAgICAgICAgIDogMTsgICAgICAgIC8vIGZyb250IGNlbnRlcgorICAgIGNvbnN0IGludCBpbmRleExGRSA9IGhhc0xGRSAgID8gaW5kZXhGQyArIDEgIDogaW5kZXhGQzsgIC8vIGxvdyBmcmVxdWVuY3kKKyAgICBjb25zdCBpbnQgaW5kZXhCTCAgPSBoYXNCYWNrcyA/IGluZGV4TEZFICsgMSA6IGluZGV4TEZFOyAvLyBiYWNrIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhCUiAgPSBoYXNCYWNrcyA/IGluZGV4QkwgKyAxICA6IGluZGV4Qkw7ICAvLyBiYWNrIHJpZ2h0CisgICAgY29uc3QgaW50IGluZGV4QkMgID0gaGFzQkMgICAgPyBpbmRleEJSICsgMSAgOiBpbmRleEJSOyAgLy8gYmFjayBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhTTCAgPSBoYXNTaWRlcyA/IGluZGV4QkMgKyAxICA6IGluZGV4QkM7ICAvLyBzaWRlIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhTUiAgPSBoYXNTaWRlcyA/IGluZGV4U0wgKyAxICA6IGluZGV4U0w7ICAvLyBzaWRlIHJpZ2h0CisKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliID0gMDsKKyAgICAgICAgICAgIGlmIChoYXNGQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEZDXTsgfQorICAgICAgICAgICAgaWYgKGhhc0xGRSkgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsgfQorICAgICAgICAgICAgaWYgKGhhc0JDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4QkNdOyB9CisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiAqPSBNSU5VU18zX0RCX0lOX0ZMT0FUOworICAgICAgICAgICAgLy8gYWx3YXlzIGhhcyBGTC9GUgorICAgICAgICAgICAgbHQgPSBwU3JjWzBdOworICAgICAgICAgICAgcnQgPSBwU3JjWzFdOworICAgICAgICAgICAgLy8gbWl4IGluIHNpZGVzIGFuZCBiYWNrcworICAgICAgICAgICAgaWYgKGhhc1NpZGVzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleFNMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4U1JdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0JhY2tzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleEJMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4QlJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICBydCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IG51bUNoYW47CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAppbmRleCAyMzk5YWJkLi5jMWJlMGYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKQEAgLTI3LDcgKzI3LDkgQEAKICovCiAKICNkZWZpbmUgRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fRkxPQVQgZmxvYXQKKyNlbmRpZgogdHlwZWRlZiBlbnVtIHsKICAgICBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQsCiAgICAgRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCwKQEAgLTk1LDExICs5NywxOCBAQAogaW50IERvd25taXhfUmVzZXQoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOwogaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Citib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2Vsc2UKIHZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIGJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgdWludDMyX3QgbWFzaywgaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2VuZGlmCiAKICNlbmRpZiAvKkFORFJPSURfRUZGRUNURE9XTk1JWF9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IDE2NjgwYmQuLmRkYmZkZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCkBAIC0xMCwxOCArMTAsNDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZWZmZWN0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAotICAgIHNyY3M6IFsiRWZmZWN0c0ZhY3RvcnkuYyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgICJFZmZlY3RzRmFjdG9yeS5jIiwKKyAgICAgICAgICJFZmZlY3RzQ29uZmlnTG9hZGVyLmMiLAorICAgICAgICAgIkVmZmVjdHNGYWN0b3J5U3RhdGUuYyIsCisgICAgICAgICAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAiLAorICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKICAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUiXSwKKyAgICBjZmxhZ3M6IFsiLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOlsiaW5jbHVkZS9tZWRpYSJdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJlZmZlY3RzX2hlYWRlcnMiLAorICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJlZmZlY3RzX2hlYWRlcnMiXSwKIH0KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiZHVtcEVmZmVjdENvbmZpZ0ZpbGUiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbInRlc3QvRHVtcENvbmZpZy5jcHAiXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAorICAgICAgICAibGliZWZmZWN0cyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6WyIuIiwgImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZWYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUNvbmZpZ0xvYWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKKy8vIFRvIGdldCBhbmQgYWRkIHRoZSBlZmZlY3QgcG9pbnRlZCBieSB0aGUgcGFzc2VkIG5vZGUgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitzdGF0aWMgaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCk7CitzdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CisKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCisKK2ludCBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCkKK3sKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IGxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKyAgICBsb2FkTGlicmFyaWVzKHJvb3QpOworICAgIGxvYWRFZmZlY3RzKHJvb3QpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJJRVNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZExpYnJhcnkobm9kZSwgbm9kZS0+bmFtZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fTFA2NF9fCisvLyBhdWRpb19lZmZlY3RzLmNvbmYgYWx3YXlzIHNwZWNpZmllcyAzMiBiaXQgbGliIHBhdGg6IGNvbnZlcnQgdG8gNjQgYml0IHBhdGggaWYgbmVlZGVkCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQorICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBrTGlicmFyeVBhdGhSb290U2l6ZSA9CisgICAgICAgIChzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdCkgLyBzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdFswXSkpOworCisvLyBDaGVja3MgaWYgdGhlIGxpYnJhcnkgcGF0aCBwYXNzZWQgYXMgbGliX3BhdGhfaW4gY2FuIGJlIG9wZW5lZCBhbmQgaWYgbm90CisvLyB0cmllcyBpbiBzdGFuZGFyZCBlZmZlY3QgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoIGp1c3QgdGhlIGxpYnJhcnkgbmFtZSBhbmQgcmV0dXJucyBjb3JyZWN0IHBhdGgKKy8vIGluIGxpYl9wYXRoX291dAoraW50IGNoZWNrTGlicmFyeVBhdGgoY29uc3QgY2hhciAqbGliX3BhdGhfaW4sIGNoYXIgKmxpYl9wYXRoX291dCkgeworICAgIGNoYXIgKnN0cjsKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZTsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGxpYl9wYXRoX2luID09IE5VTEwgfHwgbGliX3BhdGhfb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RybGNweShsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCk7CisKKyAgICAvLyBUcnkgZXhhY3QgcGF0aCBmaXJzdAorICAgIHN0ciA9IHN0cnN0cihsaWJfcGF0aF9vdXQsICIvbGliL3NvdW5kZngvIik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgbGlicmFyeSBuYW1lIGZyb20gaW5wdXQgcGF0aAorICAgIGxlbiA9IHN0ciAtIGxpYl9wYXRoX291dDsKKyAgICBsaWJfbmFtZSA9IGxpYl9wYXRoX2luICsgbGVuICsgc3RybGVuKCIvbGliL3NvdW5kZngvIik7CisKKyAgICAvLyBUaGVuIHRyeSB3aXRoIGxpYnJhcnkgbmFtZSBhbmQgc3RhbmRhcmQgcGF0aCBuYW1lcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTGlicmFyeVBhdGhSb290U2l6ZTsgaSsrKSB7CisgICAgICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICAgICAgc25wcmludGYocGF0aCwKKyAgICAgICAgICAgICAgICAgUEFUSF9NQVgsCisgICAgICAgICAgICAgICAgICIlcy8lcyIsCisgICAgICAgICAgICAgICAgIGtMaWJyYXJ5UGF0aFJvb3RbaV0sCisgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgaWYgKEZfT0sgPT0gYWNjZXNzKHBhdGgsIDApKSB7CisgICAgICAgICAgICBzdHJjcHkobGliX3BhdGhfb3V0LCBwYXRoKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKHN0cm5jbXAobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpICE9IDAsCisgICAgICAgICAgICAgICAgImNoZWNrTGlicmFyeVBhdGgoKSBjb3JyZWN0ZWQgbGlicmFyeSBwYXRoICVzIHRvICVzIiwgbGliX3BhdGhfaW4sIGxpYl9wYXRoX291dCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworCisKK2ludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICB2b2lkICpoZGwgPSBOVUxMOworICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CisgICAgbGlzdF9lbGVtX3QgKmU7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tMaWJyYXJ5UGF0aCgoY29uc3QgY2hhciAqKW5vZGUtPnZhbHVlLCBwYXRoKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChoZGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyIsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgQUxPR1coImdldExpYnJhcnkoKSBiYWQgdGFnICUwOHggaW4gbGliIGluZm8gc3RydWN0IiwgZGVzYy0+dGFnKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2MtPnZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKyAgICBsLT5oYW5kbGUgPSBoZGw7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKKworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gbDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGdMaWJyYXJ5TGlzdCA9IGU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgcGF0aCk7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKKyAgICB9CisgICAgLy9hZGQgZW50cnkgZm9yIGxpYnJhcnkgZXJyb3JzIGluIGdMaWJyYXJ5RmFpbGVkTGlzdAorICAgIGxpYl9mYWlsZWRfZW50cnlfdCAqZmwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9mYWlsZWRfZW50cnlfdCkpOworICAgIGZsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7CisgICAgZmwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKworICAgIGxpc3RfZWxlbV90ICpmZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBmZS0+b2JqZWN0ID0gZmw7CisgICAgZmUtPm5leHQgPSBnTGlicmFyeUZhaWxlZExpc3Q7CisgICAgZ0xpYnJhcnlGYWlsZWRMaXN0ID0gZmU7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgZXJyb3IgaW4gbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGZsLCBwYXRoKTsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvLyBUaGlzIHdpbGwgZmluZCB0aGUgbGlicmFyeSBhbmQgVVVJRCB0YWdzIG9mIHRoZSBzdWIgZWZmZWN0IHBvaW50ZWQgYnkgdGhlCisvLyBub2RlLCBnZXRzIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBhbmQgbGliX2VudHJ5X3QgYW5kIGFkZHMgdGhlIHN1YmVmZmVjdCAtCisvLyBzdWJfZW50cnlfdCB0byB0aGUgZ1N1YkVmZmVjdExpc3QKK2ludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCIpOworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGxpc3RfZWxlbV90ICplOworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJfZWZmZWN0ID0gbWFsbG9jKHNpemVvZihzdWJfZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBzdWJfZWZmZWN0LT5vYmplY3QgPSBkOworICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKKyAgICBzdWJfZWZmZWN0LT5saWIgPSBsOworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gc3ViX2VmZmVjdDsKKyAgICBlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtOworICAgIGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbSA9IGU7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGxpYl9lbnRyeV90ICp0bXA7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGZpbmRFZmZlY3QoTlVMTCwgJnV1aWQsICZ0bXAsIE5VTEwpID09IDApIHsKKyAgICAgICAgQUxPR1coInNraXBwaW5nIGR1cGxpY2F0ZSB1dWlkICVzICVzIiwgbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA/ICJhbmQgaXRzIHN1Yi1lZmZlY3RzIiA6ICIiKTsKKyAgICAgICAgc2tpcCA9IHRydWU7CisgICAgfQorCisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGlmIChza2lwKSB7CisgICAgICAgIGUtPm5leHQgPSBnU2tpcHBlZEVmZmVjdHM7CisgICAgICAgIGdTa2lwcGVkRWZmZWN0cyA9IGU7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSB7CisgICAgICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgICAgICBsLT5lZmZlY3RzID0gZTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aGUgVVVJRCBub2RlIGluIHRoZSBjb25maWdfdHJlZSwgaWYgbm9kZS0+bmV4dCBpcyB2YWxpZCwKKyAgICAvLyB0aGF0IHdvdWxkIGJlIHN1YiBlZmZlY3Qgbm9kZS4KKyAgICAvLyBGaW5kIHRoZSBzdWIgZWZmZWN0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGdTdWJFZmZlY3RMaXN0CisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgaW50IGNvdW50ID0gMjsKKyAgICBib29sIGh3U3ViZWZ4ID0gZmFsc2UsIHN3U3ViZWZ4ID0gZmFsc2U7CisgICAgbGlzdF9zdWJfZWxlbV90ICpzdWJlID0gTlVMTDsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJBZGRpbmcgdGhlIGVmZmVjdCB0byBnRWZmZWN0U3ViTGlzdCBhcyB0aGVyZSBhcmUgc3ViIGVmZmVjdHMiKTsKKyAgICAgICAgc3ViZSA9IG1hbGxvYyhzaXplb2YobGlzdF9zdWJfZWxlbV90KSk7CisgICAgICAgIHN1YmUtPm9iamVjdCA9IGQ7CisgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKKyAgICAgICAgc3ViZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0OworICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmU7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwgJiYgY291bnQpIHsKKyAgICAgICBpZiAoYWRkU3ViRWZmZWN0KG5vZGUpKSB7CisgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGFkZCBzdWJFZmZlY3QgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZ1N1YkVmZmVjdExpc3QgdG8gcG9pbnQgdG8gb2xkZXIgbGlzdDsKKyAgICAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlLT5uZXh0OworICAgICAgICAgICBmcmVlKHN1YmUtPnN1Yl9lbGVtKTsvLyBGcmVlIGFuIGFscmVhZHkgYWRkZWQgc3ViIGVmZmVjdAorICAgICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgICAgIGZyZWUoc3ViZSk7CisgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgIH0KKyAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CisgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7CisgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKKyAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAorICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCisgICAgICAgIGlmICghKChzdWJFZmZlY3REZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpKSB7CisgICAgICAgICAgICAgc3dTdWJlZnggPSB0cnVlOworICAgICAgICAgICAgICpkID0gKnN1YkVmZmVjdERlc2M7CisgICAgICAgICAgICAgZC0+dXVpZCA9IHV1aWQ7CisgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSBDaGFuZ2VkIHRoZSBQcm94eSBkZXNjIik7CisgICAgICAgfSBlbHNlCisgICAgICAgICAgIGh3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICBjb3VudC0tOworICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICAvLyAxIEhXIGFuZCAxIFNXIHN1YiBlZmZlY3QgZm91bmQuIFNldCB0aGUgb2ZmbG9hZCBmbGFnIGluIHRoZSBQcm94eSBkZXNjCisgICAgaWYgKGh3U3ViZWZ4ICYmIHN3U3ViZWZ4KSB7CisgICAgICAgIGQtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgorICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgeworICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7CisgICAgfQorCisgICAgZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MjYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgY29uZmlndXJhdGlvbgorICogYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiB0aGUgZ2xvYmFsIEVmZmVjdEZhY3RvcnlTdGF0ZS4gKi8KK0FORFJPSURfQVBJCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKaW5kZXggMzdjMGJiNy4uY2QwZTc2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTE3LDY1ICsxNyw0NiBAQAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgogCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdFZmZlY3RMaXN0OyAvLyBsaXN0IG9mIGVmZmVjdF9lbnRyeV90OiBhbGwgY3VycmVudGx5IGNyZWF0ZWQgZWZmZWN0cwotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcwotc3RhdGljIGxpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQKLS8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAotLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCi1zdGF0aWMgbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOyAvLyBjb250cm9scyBhY2Nlc3MgdG8gZ0xpYnJhcnlMaXN0CiBzdGF0aWMgdWludDMyX3QgZ051bUVmZmVjdHM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG51bWJlciBvZiBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJMaWI7ICAgIC8vIGN1cnJlbnQgbGlicmFyeSBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJFZmZlY3Q7IC8vIGN1cnJlbnQgZWZmZWN0IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyB1aW50MzJfdCBnQ3VyRWZmZWN0SWR4OyAgICAgICAvLyBjdXJyZW50IGVmZmVjdCBpbmRleCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCi1zdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorLyoqIE51bWJlciBvZiBlbGVtZW50cyBza2lwcGVkIGR1cmluZyB0aGUgZWZmZWN0cyBjb25maWd1cmF0aW9uIGxvYWRpbmcuCisgKiAgLTEgaWYgdGhlIGNvbmZpZyBsb2FkZXIgZmFpbGVkCisgKiAgLTIgaWYgY29uZmlnIGxvYWQgd2FzIHNraXBwZWQKKyAqLworc3RhdGljIHNzaXplX3QgZ0NvbmZpZ05iRWxlbVNraXBwZWQgPSAtMjsKIAogc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAogc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKLQotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0aWMgaW50IGluaXQoKTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOwotc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7Ci0vLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOwotc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwogc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOwogc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKLXN0YXRpYyBpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogLy8gVG8gc2VhcmNoIGEgc3ViZWZmZWN0IGluIHRoZSBnU3ViRWZmZWN0TGlzdAogc3RhdGljIGludCBmaW5kU3ViRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKLXN0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7Ci1zdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOwotc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC00NjEsMTAgKzQ0MiwxMiBAQAogICAgIGlmIChpZ25vcmVGeENvbmZGaWxlcykgewogICAgICAgICBBTE9HSSgiQXVkaW8gZWZmZWN0cyBpbiBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgYmUgaWdub3JlZCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkID0gRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhOVUxMKTsKKyAgICAgICAgaWYgKGdDb25maWdOYkVsZW1Ta2lwcGVkIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBsb2FkIFhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiwgZmFsbGJhY2sgdG8gLmNvbmYiKTsKKyAgICAgICAgICAgIEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICV6ZCBlbGVtZW50cyIsIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDc0LDM2NyArNDU3LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0gICAgbG9hZExpYnJhcmllcyhyb290KTsKLSAgICBsb2FkRWZmZWN0cyhyb290KTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBfX0xQNjRfXwotLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KLSAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKLQotLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAotLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCi0vLyBpbiBsaWJfcGF0aF9vdXQKLWludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgY29uc3QgY2hhciAqbGliX25hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOwotCi0gICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKLSAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKLSAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7Ci0gICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOwotCi0gICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgewotICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgICAgIHNucHJpbnRmKHBhdGgsCi0gICAgICAgICAgICAgICAgIFBBVEhfTUFYLAotICAgICAgICAgICAgICAgICAiJXMvJXMiLAotICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAotICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7Ci0gICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgewotICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7Ci0gICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAotICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi1pbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgdm9pZCAqaGRsID0gTlVMTDsKLSAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOwotICAgIGxpc3RfZWxlbV90ICplOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKLSAgICBpZiAoaGRsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7Ci0gICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKLSAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0gICAgbC0+aGFuZGxlID0gaGRsOwotICAgIGwtPmRlc2MgPSBkZXNjOwotICAgIGwtPmVmZmVjdHMgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7Ci0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGw7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKLSAgICBnTGlicmFyeUxpc3QgPSBlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAgIGlmIChoZGwgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKGhkbCk7Ci0gICAgfQotICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKLSAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKLSAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0KLSAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZmUtPm9iamVjdCA9IGZsOwotICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OwotICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7Ci0KLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQotLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQotLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci1pbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQotewotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7Ci0gICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKLSAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5Ci0gICAgc3ViX2VmZmVjdC0+bGliID0gbDsKLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7Ci0gICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKLSAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOwotICAgIGlmIChsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsaWJfZW50cnlfdCAqdG1wOwotICAgIGJvb2wgc2tpcCA9IGZhbHNlOwotICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAotICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7Ci0gICAgICAgIHNraXAgPSB0cnVlOwotICAgIH0KLQotICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKLSAgICAgICAgY2hhciBzWzQwXTsKLSAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICBjaGFyIHNbNTEyXTsKLSAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKLSAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gZDsKLSAgICBpZiAoc2tpcCkgewotICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOwotICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9IGVsc2UgewotICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgbC0+ZWZmZWN0cyA9IGU7Ci0gICAgfQotCi0gICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCi0gICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCi0gICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIGludCBjb3VudCA9IDI7Ci0gICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOwotICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7Ci0gICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOwotICAgICAgICBzdWJlLT5vYmplY3QgPSBkOwotICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7Ci0gICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKLSAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOwotICAgIH0KLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7Ci0gICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgewotICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7Ci0gICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKLSAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKLSAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICAgICBmcmVlKHN1YmUpOwotICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICAgICB9Ci0gICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OwotICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOwotICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKLSAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCi0gICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKLSAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYwotICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgewotICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOwotICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOwotICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOwotICAgICAgIH0gZWxzZQotICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7Ci0gICAgICAgY291bnQtLTsKLSAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYwotICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgewotICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIC8vIFNlYXJjaGVzIHRoZSBzdWIgZWZmZWN0IG1hdGNoaW5nIHRvIHRoZSBzcGVjaWZpZWQgdXVpZAogLy8gaW4gdGhlIGdTdWJFZmZlY3RMaXN0LiBJdCBnZXRzIHRoZSBsaWJfZW50cnlfdCBmb3IKIC8vIHRoZSBtYXRjaGVkIHN1Yl9lZmZlY3QgLiBVc2VkIGluIEVmZmVjdENyZWF0ZSBvZiBzdWIgZWZmZWN0cwpAQCAtODgxLDI5ICs1MDMsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKLSAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKLSAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OwotICAgIH0KLQotICAgIGUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgd2hpbGUgKGUpIHsKLSAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7Ci0gICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7Ci0gICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7Ci0gICAgICAgICAgICByZXR1cm4gbDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC05MzUsMTE0ICs1MzQsNiBAQAogICAgIHJldHVybiBjbnQ7CiB9CiAKLWludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCi0gICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKLXsKLSAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKLSAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIHdoaWxlIChlICYmICFmb3VuZCkgewotICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgd2hpbGUgKGVmeCkgewotICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0ID0gLUVOT0VOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7Ci0gICAgICAgICpsaWIgPSBsOwotICAgICAgICBpZiAoZGVzYykgewotICAgICAgICAgICAgKmRlc2MgPSBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKLSAgICBjaGFyIHNbMjU2XTsKLSAgICBjaGFyIHNzWzI1Nl07Ci0gICAgY2hhciBpZHRbaW5kZW50ICsgMV07Ci0KLSAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7Ci0gICAgaWR0W2luZGVudF0gPSAwOwotCi0gICAgc3RyWzBdID0gMDsKLQotICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7Ci0gICAgc3RybGNhdChzdHIsIHMsIGxlbik7Ci0KLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7Ci0gICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7Ci0gICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKLSAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotfQotCi1pbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKLXsKLSAgICBpbnQgdG1wWzEwXTsKLQotICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKLSAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKLSAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKLSAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107Ci0gICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKLSAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOwotICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07Ci0gICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKLSAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOwotICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCi17Ci0KLSAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csCi0gICAgICAgICAgICB1dWlkLT50aW1lTWlkLAotICAgICAgICAgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLAotICAgICAgICAgICAgdXVpZC0+bm9kZVswXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMV0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzJdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVszXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbNF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzVdKTsKLQotICAgIHJldHVybiAwOwotfQotCiBpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKSB7CiAgICAgY2hhciBzWzUxMl07CiAKQEAgLTEwOTIsNiArNTgzLDIwIEBACiAgICAgICAgICAgICBlID0gZS0+bmV4dDsKICAgICAgICAgfQogICAgIH0KKyAgICBzd2l0Y2ggKGdDb25maWdOYkVsZW1Ta2lwcGVkKSB7CisgICAgY2FzZSAtMjoKKyAgICAgICAgZHByaW50ZihmZCwgIkVmZmVjdCBjb25maWd1cmF0aW9uIGxvYWRpbmcgc2tpcHBlZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIGZhaWxlZCB0byBsb2FkLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gcGFydGlhbGx5IGxvYWRlZCwgc2tpcHBlZCAlemQgZWxlbWVudHMuXG4iLAorICAgICAgICAgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA3MmUwOTMxLi4yOWRiYzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwpAQCAtOTYsNiArOTYsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgc3ViIGVmZmVjdCBkZXNjcmlwdG9ycy4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXRTdWJFZmZlY3RzKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICoqcFN1YmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlTdGF0ZSIKKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsKK2xpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7CitsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKK3sKKyAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChlICYmICFmb3VuZCkgeworICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CisgICAgICAgICpsaWIgPSBsOworICAgICAgICBpZiAoZGVzYykgeworICAgICAgICAgICAgKmRlc2MgPSBkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB1dWlkLT50aW1lTG93LAorICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgeworICAgIGNoYXIgc1syNTZdOworICAgIGNoYXIgc3NbMjU2XTsKKyAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKKworICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKKyAgICBpZHRbaW5kZW50XSA9IDA7CisKKyAgICBzdHJbMF0gPSAwOworCisgICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAorICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY5NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAZmlsZSBDb250YWlucyB0aGUgc3RhdGUgc2hhcmVkIHdpdGggY29uZmlndXJhdGlvbiBsb2FkZXIgb2YgdGhlIEVmZmVjdCBmYWN0b3J5LgorICogICAgICAgIFRoaXMgZ2xvYmFsIHN0YXRlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvciBpbiBhIHN0cnVjdHVyZQorICogICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgbG9hZGVyIG9uIEVmZmVjdHNGYWN0b3J5IGluaXQuCisgKiAgICAgICAgVGhpcyBoZWFkZXIgYWxzbyBjb250YWlucyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayBvbiB0aGUgc3RhdGUuCisgKi8KKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcworLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZCBvciBpbnZhbGlkIHZlcnNpb24KK2V4dGVybiBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCisvLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KK2V4dGVybiBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnTGliTG9jazsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorCitleHRlcm4gbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKKworaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOworLyoqIFVzZWQgdG8gbG9nIFVVSURzICovCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CisKKy8qKiBVc2VkIGZvciBkZWJ1Z2luZy4gKi8KK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4Yjc4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworLyoqIFNpbWlsYXJseSB0byBkbG9wZW4sIGxvb2tzIGZvciB0aGUgcHJvdmlkZWQgcGF0aCBpbiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRILgorICogQHJldHVybiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGZvdW5kIGFuZCBzZXQgcmVzb2x2ZWRQYXRoIHRvIGl0cyBhYnNvbHV0ZSBwYXRoLgorICogICAgICAgICBmYWxzZSBpZiBub3QgZm91bmQKKyAqLworYm9vbCByZXNvbHZlTGlicmFyeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIHJlc29sdmVkUGF0aCkgeworICAgIGZvciAoYXV0byogbGlicmFyeURpcmVjdG9yeSA6IExEX0VGRkVDVF9MSUJSQVJZX1BBVEgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FuZGlkYXRlUGF0aCA9IHN0ZDo6c3RyaW5nKGxpYnJhcnlEaXJlY3RvcnkpICsgJy8nICsgcGF0aDsKKyAgICAgICAgaWYgKGFjY2VzcyhjYW5kaWRhdGVQYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICpyZXNvbHZlZFBhdGggPSBzdGQ6Om1vdmUoY2FuZGlkYXRlUGF0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBMb2FkcyBhIGxpYnJhcnkgZ2l2ZW4gaXRzIHJlbGF0aXZlIHBhdGggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGxpYkVudHJ5LgorICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGgsIGhhbmRsZSBhbmQgZGVzYyBmaWxsZWQKKyAqICAgICAgICAgZmFsc2Ugb24gc3VjY2VzcyB3aXRoIGxpYkVudHJ5J3MgcGF0aCBmaWxsZWQgd2l0aCB0aGUgcGF0aCBvZiB0aGUgZmFpbGVkIGxpYgorICogVGhlIGNhbGxlciBNVVNUIGZyZWUgdGhlIHJlc291cmNlcyBwYXRoIChmcmVlKSBhbmQgaGFuZGxlIChkbGNsb3NlKSBpZiBmaWxsZWQuCisgKi8KK2Jvb2wgbG9hZExpYnJhcnkoY29uc3QgY2hhciogcmVsYXRpdmVQYXRoLCBsaWJfZW50cnlfdCogbGliRW50cnkpIG5vZXhjZXB0IHsKKworICAgIHN0ZDo6c3RyaW5nIGFic29sdXRlUGF0aDsKKyAgICBpZiAoIXJlc29sdmVMaWJyYXJ5KHJlbGF0aXZlUGF0aCwgJmFic29sdXRlUGF0aCkpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgaW4gZWZmZWN0IGRpcmVjdG9yaWVzOiAlcyIsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgY2hhciogcGF0aCA9IGFic29sdXRlUGF0aC5jX3N0cigpOworICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBsaWIgaXMgY2xvc2VkIG9uIGVhcmx5IHJldHVybgorICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShkbGNsb3NlKSo+IGxpYkhhbmRsZShkbG9wZW4ocGF0aCwgUlRMRF9OT1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGRsb3BlbiBsaWJyYXJ5ICVzOiAlcyIsIHBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvKiBkZXNjcmlwdGlvbiA9IHN0YXRpY19jYXN0PGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QqPigKKyAgICAgICAgICBkbHN5bShsaWJIYW5kbGUuZ2V0KCksIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUikpOworICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVmZmVjdCBsaWJyYXJ5LCBmYWlsZWQgbm90IGZpbmQgc3ltYm9sICclcycgaW4gJXM6ICVzIiwKKyAgICAgICAgICAgICAgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRlc2NyaXB0aW9uLT50YWcgIT0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHKSB7CisgICAgICAgIEFMT0dFKCJCYWQgdGFnICUjMDh4IGluIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi0+dGFnLCBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2NyaXB0aW9uLT52ZXJzaW9uKTsKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTik7CisgICAgaWYgKG1ham9yVmVyc2lvbiAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbiAlIzA4eCwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBtYWpvclZlcnNpb24sIGV4cGVjdGVkTWFqb3JWZXJzaW9uLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxpYkVudHJ5LT5oYW5kbGUgPSBsaWJIYW5kbGUucmVsZWFzZSgpOworICAgIGxpYkVudHJ5LT5kZXNjID0gZGVzY3JpcHRpb247CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBCZWNhdXNlIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZGVzdHJveWVkIGJ5IGMgY29kZSwgdXNpbmcgbmV3IHRvIGFsbG9jYXRlIHNoYXJlZCBzdHJ1Y3R1cmUKKyAqIGlzIG5vdCBwb3NzaWJsZS4gUHJvdmlkZSBhIGVxdWl2YWxlbnQgb2YgdW5pcXVlX3B0ciBmb3IgbWFsbG9jL2ZyZWVkIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUKKyAqIHRoZXkgYXJlIG5vdCBsZWFrZWQgaW4gdGhlIGMrKyBjb2RlLgorIEB7ICovCitzdHJ1Y3QgRnJlZURlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwKSB7CisgICAgICAgIGZyZWUocCk7CisgICAgfQorfTsKKy8qKiB1bmlxdWVfcHRyIGZvciBvYmplY3QgY3JlYXRlZCB3aXRoIG1hbGxvYy4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgVW5pcXVlQ1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBGcmVlRGVsZXRlcj47CisKKy8qKiBjIHZlcnNpb24gb2Ygc3RkOjptYWtlX3VuaXF1ZS4gVXNlcyBtYWxsb2MgYW5kIGZyZWUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1VuaXF1ZUNQdHI8VD4gbWFrZVVuaXF1ZUMoKSB7CisgICAgVCogcHRyID0gbmV3IChtYWxsb2Moc2l6ZW9mKFQpKSkgVHt9OyAvLyBVc2UgcGxhY2VtZW50IG5ldyB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUKKyAgICByZXR1cm4gVW5pcXVlQ1B0cjxUPntwdHJ9OworfQorCisvKiogQH0gKi8KKworLyoqIFB1c2ggYW4gbm90IG93bmVkIGVsZW1lbnQgaW4gYSBsaXN0X2VsZW0gbGluayBsaXN0IHdpdGggYW4gb3B0aW9uYWwgbG9jay4gKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMaXN0RWxlbT4KK3ZvaWQgbGlzdFB1c2goVCogb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgYXV0byBsaXN0RWxlbSA9IG1ha2VVbmlxdWVDPExpc3RFbGVtPigpOworICAgIGxpc3RFbGVtLT5vYmplY3QgPSBvYmplY3Q7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKKyAgICB9CisgICAgbGlzdEVsZW0tPm5leHQgPSAqbGlzdDsKKyAgICAqbGlzdCA9IGxpc3RFbGVtLnJlbGVhc2UoKTsKKyAgICBpZiAobXV0ZXggIT0gbnVsbHB0cikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgICAgfQorfQorCisvKiogUHVzaCBhbiBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFVuaXF1ZUNQdHI8VD4mJiBvYmplY3QsIExpc3RFbGVtKiogbGlzdCwgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IG51bGxwdHIpIG5vZXhjZXB0IHsKKyAgICBsaXN0UHVzaChvYmplY3QucmVsZWFzZSgpLCBsaXN0LCBtdXRleCk7Cit9CisKK3NpemVfdCBsb2FkTGlicmFyaWVzKGNvbnN0IGVmZmVjdHNDb25maWc6OkxpYnJhcmllcyYgbGlicywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliTGlzdCwgcHRocmVhZF9tdXRleF90KiBsaWJMaXN0TG9jaywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliRmFpbGVkTGlzdCkKK3sKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisgICAgZm9yIChhdXRvJiBsaWJyYXJ5IDogbGlicykgeworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGxpYiBlbnRyeQorICAgICAgICBhdXRvIGxpYkVudHJ5ID0gbWFrZVVuaXF1ZUM8bGliX2VudHJ5X3Q+KCk7CisgICAgICAgIGxpYkVudHJ5LT5uYW1lID0gc3RyZHVwKGxpYnJhcnkubmFtZS5jX3N0cigpKTsKKyAgICAgICAgbGliRW50cnktPmVmZmVjdHMgPSBudWxscHRyOworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpYkVudHJ5LT5sb2NrLCBudWxscHRyKTsKKworICAgICAgICBpZiAoIWxvYWRMaWJyYXJ5KGxpYnJhcnkucGF0aC5jX3N0cigpLCBsaWJFbnRyeS5nZXQoKSkpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgbG9hZCBmYWlsdXJlCisgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJGYWlsZWRMaXN0KTsKKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShsaWJFbnRyeSksIGxpYkxpc3QsIGxpYkxpc3RMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKKy8qKiBGaW5kIGEgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBsaXN0LiAqLworbGliX2VudHJ5X3QqIGZpbmRMaWJyYXJ5KGNvbnN0IGNoYXIqIG5hbWUsIGxpc3RfZWxlbV90KiBsaXN0KSB7CisKKyAgICB3aGlsZSAobGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8qIG9iamVjdCA9IHN0YXRpY19jYXN0PGxpYl9lbnRyeV90Kj4obGlzdC0+b2JqZWN0KTsKKyAgICAgICAgaWYgKHN0cmNtcChvYmplY3QtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdHJ1Y3QgVXVpZFN0ciB7CisgICAgLyoqIExlbmd0aCBvZiBhbiB1dWlkIHJlcHJlc2VudGVkIGFzIHN0cmluZy4gQFRPRE86IHVzZSBhIGNvbnN0YW50IGluc3RlYWQgb2YgNDAuICovCisgICAgY2hhciBidWZmWzQwXTsKK307CisKKy8qKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvdmlkZWQgdXVpZC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYW4gb3V0cHV0IGJ1ZmZlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgdXVpZFRvU3RyaW5nKCkKKyAqLworY2hhciogdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsIFV1aWRTdHImJiBzdHIgPSB7fSkgeworICAgIHV1aWRUb1N0cmluZygmdXVpZCwgc3RyLmJ1ZmYsIHNpemVvZihzdHIuYnVmZikpOworICAgIHJldHVybiBzdHIuYnVmZjsKK30KKworc3RydWN0IExvYWRFZmZlY3RSZXN1bHQgeworICAgIC8qKiB0cnVlIGlmIHRoZSBlZmZlY3QgaXMgdXNhYmxlIChha2EsIGV4aXN0aW5nIGxpYiwgZGVzYywgcmlnaHQgdmVyc2lvbiwgdW5pcXVlIHV1aWQpICovCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgLyoqIFNldCBpZiB0aGUgZWZmZWN0IGxpYiB3YXMgZm91bmQqLworICAgIGxpYl9lbnRyeV90KiBsaWIgPSBudWxscHRyOworICAgIC8vKiBTZXQgaWYgdGhlIGRlc2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVseSByZXRyaWV2ZWQgZnJvbSB0aGUgbGliICovCisgICAgVW5pcXVlQ1B0cjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3REZXNjOworfTsKKworTG9hZEVmZmVjdFJlc3VsdCBsb2FkRWZmZWN0KGNvbnN0IEVmZmVjdEltcGwmIGVmZmVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqIGxpYkxpc3QpIHsKKyAgICBMb2FkRWZmZWN0UmVzdWx0IHJlc3VsdDsKKworICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBsaWJyYXJ5CisgICAgcmVzdWx0LmxpYiA9IGZpbmRMaWJyYXJ5KGVmZmVjdC5saWJyYXJ5LT5uYW1lLmNfc3RyKCksIGxpYkxpc3QpOworICAgIGlmIChyZXN1bHQubGliID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMgdG8gbG9hZCBlZmZlY3QgJXMiLAorICAgICAgICAgICAgICBlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdC5lZmZlY3REZXNjID0gbWFrZVVuaXF1ZUM8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4oKTsKKworICAgIC8vIEdldCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IKKyAgICBpZiAocmVzdWx0LmxpYi0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJmVmZmVjdC51dWlkLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSkgIT0gMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsCisgICAgICAgICAgICAgIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIHJlc3VsdC5saWItPm5hbWUpOworICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIER1bXAgZWZmZWN0IGZvciBkZWJ1ZworI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsIHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzKTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgZWZmZWN0IGlzIHN1cHBvcnRlZAorICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uKSAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiQmFkIEFQSSB2ZXJzaW9uICUjMDh4IGZvciBlZmZlY3QgJXMgaW4gbGliICVzLCBleHBlY3RlZCBtYWpvciAlIzA4eCIsCisgICAgICAgICAgICAgIHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uLCBuYW1lLmNfc3RyKCksIHJlc3VsdC5saWItPm5hbWUsIGV4cGVjdGVkTWFqb3JWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBsaWJfZW50cnlfdCAqXzsKKyAgICBpZiAoZmluZEVmZmVjdChudWxscHRyLCAmZWZmZWN0LnV1aWQsICZfLCBudWxscHRyKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgJXMgdXVpZCAlcyBhbHJlYWR5IGV4aXN0IiwgdXVpZFRvU3RyaW5nKGVmZmVjdC51dWlkKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuc3VjY2VzcyA9IHRydWU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZV90IGxvYWRFZmZlY3RzKGNvbnN0IEVmZmVjdHMmIGVmZmVjdHMsIGxpc3RfZWxlbV90KiBsaWJMaXN0LCBsaXN0X2VsZW1fdCoqIHNraXBwZWRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgIGxpc3Rfc3ViX2VsZW1fdCoqIHN1YkVmZmVjdExpc3QpIHsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKworICAgICAgICBhdXRvIGVmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdCwgZWZmZWN0Lm5hbWUsIGxpYkxpc3QpOworICAgICAgICBpZiAoIWVmZmVjdExvYWRSZXN1bHQuc3VjY2VzcykgeworICAgICAgICAgICAgaWYgKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmZmVjdC5pc1Byb3h5KSB7CisgICAgICAgICAgICBhdXRvIHN3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYlN3LCBlZmZlY3QubmFtZSArICIgbGlic3ciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGF1dG8gaHdFZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QubGliSHcsIGVmZmVjdC5uYW1lICsgIiBsaWJodyIsIGxpYkxpc3QpOworICAgICAgICAgICAgaWYgKCFzd0VmZmVjdExvYWRSZXN1bHQuc3VjY2VzcyB8fCAhaHdFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtYWluIGVmZmVjdCBpbiB0aGUgc2tpcHBlZCBsaXN0IGV2ZW4gaWYgb25seSBhIHN1YmVmZmVjdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgLy8gYXMgdGhlIG1haW4gZWZmZWN0IGlzIG5vdCB1c2FibGUgd2l0aG91dCBpdHMgc3ViZWZmZWN0cy4KKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgc2tpcHBlZEVmZmVjdHMpOworICAgICAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RQdXNoKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgc3ViRWZmZWN0TGlzdCk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECisgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOworICAgICAgICAgICAgZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLT51dWlkID0gZWZmZWN0LnV1aWQ7CisKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIGF1dG8gcmVnaXN0ZXJTdWJFZmZlY3QgPSBbc3ViRWZmZWN0TGlzdF0oYXV0byYmIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBtYWtlVW5pcXVlQzxzdWJfZWZmZWN0X2VudHJ5X3Q+KCk7CisgICAgICAgICAgICAgICAgZW50cnktPm9iamVjdCA9IHJlc3VsdC5lZmZlY3REZXNjLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAgICAgZW50cnktPmxpYiA9IHJlc3VsdC5saWI7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVudHJ5KSwgJigqc3ViRWZmZWN0TGlzdCktPnN1Yl9lbGVtKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoc3dFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoaHdFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgJmVmZmVjdExvYWRSZXN1bHQubGliLT5lZmZlY3RzKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgSW50ZXJmYWNlIGZ1bmN0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiAiQyIgc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgdXNpbmcgZWZmZWN0c0NvbmZpZzo6cGFyc2U7CisgICAgYXV0byByZXN1bHQgPSBwYXRoID8gcGFyc2UocGF0aCkgOiBwYXJzZSgpOworICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgKz0gbG9hZExpYnJhcmllcyhyZXN1bHQucGFyc2VkQ29uZmlnLT5saWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ0xpYnJhcnlMaXN0LCAmZ0xpYkxvY2ssICZnTGlicmFyeUZhaWxlZExpc3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRWZmZWN0cyhyZXN1bHQucGFyc2VkQ29uZmlnLT5lZmZlY3RzLCBnTGlicmFyeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdTa2lwcGVkRWZmZWN0cywgJmdTdWJFZmZlY3RMaXN0KTsKKworICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICIlenUgZXJyb3JzIGR1cmluZyBsb2FkaW5nIG9mIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCwgcGF0aCA/OiBlZmZlY3RzQ29uZmlnOjpERUZBVUxUX1BBVEgpOworCisgICAgcmV0dXJuIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgeG1sIGNvbmZpZ3VyYXRpb24gYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiBFZmZlY3RGYWN0b3J5U3RhdGUuCisgKiBAcGFyYW1baW5dIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvciBOVUxMwqB0byBsb2FkIHRoZSBkZWZhdWx0IG9uZQorICogQHJldHVybiAtMcKgb24gdW5yZWNvdmVyYWJsZSBlcnJvciAoZWc6IG5vIGNvbmZpZ3VyYXRpb24gZmlsZSkKKyAqICAgICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgaW52YWxpZCBlbGVtZW50cyAobGliICYgZWZmZWN0KSBza2lwcGVkIGlmIHRoZSBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQKKyAqIEBub3RlIHRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZm9yIHRlc3QgcHVycG9zZSBvbmx5LiBEbyBub3QgY2FsbCBmcm9tIG91dHNpZGUgdGhpcyBsaWJyYXJ5LgorICovCitBTkRST0lEX0FQSQorc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpOworCisjaWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCmluZGV4IDY0YTMyMTIuLmE1YTEyZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KIAorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC01Miw2ICs1Myw3IEBACiAvLyAgICAgICAgKnBOdW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGluIGZhY3RvcnkKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTc5LDYgKzgxLDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMTAsNiArMTEzLDcgQEAKIC8vICAgICAgICAqcEhhbmRsZTogICAgICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBoYW5kbGUuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAogICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpOwogCkBAIC0xMzAsNiArMTM0LDcgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIGludGVyZmFjZSBoYW5kbGUKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTUzLDYgKzE1OCw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjksOCArMTc1LDEwIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgdXVpZCBpcyBlcXVhbCB0byBFRkZFQ1RfVVVJRF9OVUxMLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdElzTnVsbFV1aWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOwogCitBTkRST0lEX0FQSQogaW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCk7CiAKICNpZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvdGVzdC9EdW1wQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE1NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gbnVsbHB0cjsKKyAgICBib29sIGxlZ2FjeUZvcm1hdDsKKworICAgIGlmIChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWxlZ2FjeSIpID09IDApIHsKKyAgICAgICAgbGVnYWN5Rm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGxlZ2FjeSBlZmZlY3QgY29uZmlnIGZpbGVcbiIpOworICAgIH0gZWxzZSBpZiAoKGFyZ2MgPT0gMiB8fCBhcmdjID09IDMpICYmIHN0cmNtcChhcmd2WzFdLCAiLS14bWwiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeUZvcm1hdCA9IGZhbHNlOworICAgICAgICBpZiAoYXJnYyA9PSAzKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgWE1MIGVmZmVjdCBjb25maWcgZmlsZTogJXNcbiIsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGRlZmF1bHQgWE1MIGVmZmVjdCBjb25maWcgZmlsZS5cbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFyZ3VtZW50cy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2FnZTogJXMgWy0tbGVnYWN5fC0teG1sIFtGSUxFXV1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWxlZ2FjeUZvcm1hdCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcocGF0aCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvYWRYbWxFZmZlY3RDb25maWcgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnRpYWxseSBmYWlsZWQgdG8gbG9hZCBjb25maWcuIFNraXBwZWQgJXp1IGVsZW1lbnRzLCAiCisgICAgICAgICAgICAgICAgICAgICJzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iLCAoc2l6ZV90KXJldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVnYWN5Rm9ybWF0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkRWZmZWN0Q29uZmlnIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxlZ2FjeSBsb2FkRWZmZWN0Q29uZmlnIGhhcyBwcm9iYWJseSBzdWNjZWVkLCBzZWUgbG9nY2F0IHRvIG1ha2Ugc3VyZS5cbiIpOworICAgIH0KKworICAgIGlmIChFZmZlY3REdW1wRWZmZWN0cyhTVERPVVRfRklMRU5PKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWZmZWN0IGR1bXAgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawppbmRleCA4M2U4Mjg4Li45NDFlYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtNzIsMTkgKzcyLDI1IEBACiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAogICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKICAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKICAgICBDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMgXAogICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBcCisgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKICAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKICAgICBDb21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIFwKICAgICBDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIFwKICAgICBDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCkBAIC0xMjAsNyArMTI2LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCiAgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE3OSw2ICsxODUsNyBAQAogICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL2xpYiBcCiAgICAgJChMT0NBTF9QQVRIKS9Db21tb24vc3JjCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDIyODk3N2QuLjRjMmI5NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC0xOTgsNiArMTk4LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIxMCw2ICsyMTQsMTAgQEAKICAgICBMVkRCRV9GU18zMjAwMCA9IDYsCiAgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAogICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBMVkRCRV9GU185NjAwMCA9IDksCisgICAgTFZEQkVfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfRnNfZW47CiAKQEAgLTQ1MCwxMiArNDU4LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggYjFlYmFkZi4uZjMyZWQzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfX0xWREJFX0NPRUZGU19IX18KIAogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MTQsNSArNTE1LDYzMiBAQAogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGlnaCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNzY5OGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzOTAwMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDA4MDdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzM4MThmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU3MzJmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU2NjkwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MzAwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MzI3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NzE3NmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTQ5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njk5NTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTUzNDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzc4NjNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MTA1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU3MTAyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NjYyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjA4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDc0NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjYxOTRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODg5MzFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4OTkyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY3MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg5ODMxZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyMDgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTk0OTE1ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc0NTg4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk3NDU4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzQ2MWYKICNlbmRpZgorCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2MDMyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI2ODEwZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkyOTM5NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNTI3NWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0Njg4MWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDgyNTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Mjk0MzVmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTExOTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxMjQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzMzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDA1MmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTAxOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzQzNmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM3ODRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTMxMjVmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzU1OTRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MDkzZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjk1ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTg2MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NDAxOWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjcxOGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODY4MDVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjUwNzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODc3OTdmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzEwNzdmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTM4OThmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQwODZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY5NDlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2OTU0ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS44OTMzODdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTM1MTdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE1OTk4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MjI5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTE0MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyMDg5MmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MjMyNmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDM5NDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzQ3OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTY3NDBmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ2MzEzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4NjA3ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA5MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0ODc5N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTE1N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzE1NjhmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU4MzZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzgzNjdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYxNjQ5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg0MzAzZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQyNWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjkwMGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTU3OGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTk4NGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjc4OWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzUzOWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjM5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS44ODA4MjVmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTAwMjMxZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTA0OTc3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjc2NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45Mjc1NzlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzAxMTFmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTEyMzg3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzQ1OWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MjgzNjVmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUwMDg3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTUxMzAzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTYxOGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3NzhmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjQ0MjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ0NDc3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjcyMWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTI1ODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1MDQwZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc1MzQ3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTI4MmYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODE4ODhmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODIwNTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYwNzI0ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MzM1OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4ODkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxNjgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyOTkyZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1ODQwZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTg0OGYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTE5N2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NTQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODU0ODhmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0NjRmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYxNTBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MTUwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjczM2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzU1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMTg5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTMyMDlmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMwODVmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMDg1ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzU1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Mzc1OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MTk5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY1MzdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY1OTlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NDVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTQ1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjgyM2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDc2MmYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTg0NjFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDAzODFmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk5MjM0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MjM4ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MjA5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTc5OTY2ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEzNjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODQ2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA4NDY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjg1ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODI4NjlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjM2NGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MzY0ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NDU3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjI2ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjg4ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA2NDFmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDI1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkxMTAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTEzOThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE5MmYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTkyZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzMzc0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MjIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTUzMDlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjEzMWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMTMxZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1NjE1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTc4NjhmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg5MzlmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODk0NWYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTg1NzJmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxODU3MmYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1ODc0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNDI3ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMzU0NWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MDY0N2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTcyNTk2ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMjQ1OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzE0OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTc0Nzk1ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTM3M2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MDEwOGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDM3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjgxOWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTcxNGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg2MjA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjI2OGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjkwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MzE4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDcwOWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI0MGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNDczZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzQyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk1NWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzMDc4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzE0NGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzUzNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NTU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAtMS45OTY4NjBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNzc4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg0MzdmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODQ0NGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDkwNzNmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5NTNmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY2MTlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Mzc5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NjM3N2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxNTI4OWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTUyODlmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2ODgyZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDY3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzU0NzdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzY3MTFmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgzNzlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MjM5NWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA0N2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNzcwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDc3MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgzODYzZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDE0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODc5NzdmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODgyODhmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQyMDdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTMyNGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MTQ4OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzg2N2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDM4NjdmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyMDM4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTYxMzRmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5ODA3NWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5ODA4NWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgdGltZSBjb25zdGFudHMgYW5kIGdhaW4gc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUdDIFRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg0MTM5NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODgyMjIzZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTEyNTFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzI3NmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MjY3ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NDQwNjFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzc0NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MTU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKKyNlbmRpZgorCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA0MmYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMwZgorI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyMWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCisjZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA4ZgorI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCisjZW5kaWYKKworLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4NTUzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzA5NTczZgorI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjA3OTQ1OGYKKyNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi45NDMyODJmCisjZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZvbHVtZSBjb250cm9sIGdhaW4gKi8KKyNkZWZpbmUgVk9MVU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKworLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjQ2OTBmCisjZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE3OTc3ZgorI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjUyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI0MjJmCisjZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MDI5ZgorI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODI5OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYyMzFmCisjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgorI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgorI2VuZGlmCisjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLworI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCisjZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLworI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCisjZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLworI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLworI2VuZGlmCisKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmluZGV4IGI2NjMyYTMuLmZkNDAxNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwpAQCAtMTA3LDM1ICsxMDcsNjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKIAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKLQorICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfMTkyMDAwKSkpOworI2Vsc2UKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cworICAgICAqLworICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpL3NpemVvZihMVk1fSU5UMTYpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyNlbHNlCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfQzMyX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOworI2Vsc2UKKyAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9GTE9BVF9Db2Vmc190ICopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQorICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfQzMyX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOwotCisjZWxzZQorICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworI2VuZGlmCiB9CiAKIApAQCAtMTc1LDcgKzIwOCw5IEBACiAgICAgewogICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KICAgICB9CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKIAogfQpAQCAtMjEyLDYgKzI0Nyw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgIGRCU2hpZnRzX2ZhYzsKKyNlbmRpZgogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBpZiBlbmFibGVkCiAgICAgICovCkBAIC0yMzcsMzMgKzI3NSw1OCBAQAogICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKDYgKyBWb2x1bWUgJSA2KTsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwogICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGRCU2hpZnRzX2ZhYyA9IChMVk1fRkxPQVQpKDEgPDwgZEJTaGlmdHMpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIDw8IDE2KTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPj4gZEJTaGlmdHM7Ci0KKyNlbHNlCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0IC8gZEJTaGlmdHNfZmFjOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVNoaWZ0ID0gVk9MVU1FX1NISUZUKzE7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKICAgICAgKi8KICAgICBpZihkQlNoaWZ0cyA+IDApCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKCgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSkgPj4gZEJTaGlmdHMpKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0gLyBkQlNoaWZ0c19mYWMpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbmRpZgogfQogCiAKQEAgLTMwOSw3ICszNzIsMTEgQEAKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKyNlbHNlCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworI2VuZGlmCiAKIAogICAgIC8qCkBAIC0zMzIsMTIgKzM5OSwxOSBAQAogICAgIHsKICAgICAgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogCiAKICAgICB9CkBAIC0zNTcsMTMgKzQzMSwyMyBAQAogCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwweDAwMDA3RkZGKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOworI2VuZGlmCiAgICAgfQogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwppbmRleCBhMzYyM2JjLi4zZmZmMmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTgwLDcgKzgwLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIERhdGEgbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICA9IHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpOworI2Vsc2UKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0RhdGFfdCk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtODgsNyArOTIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29lZiBtZW1vcnkKICAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOworI2Vsc2UKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtOTYsNyArMTA0LDEyIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLwogICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CkBAIC0xNTEsMTAgKzE2NCwxNiBAQAogewogCiAgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgTWl4R2FpbjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE1peEdhaW47CisjZW5kaWYKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKIAogCiAgICAgLyoKQEAgLTIzNSw3ICsyNTQsMTEgQEAKICAgICAvLyBpbml0aWFsaXplIHRoZSBtaXhlciB3aXRoIHNvbWUgZml4ZXMgdmFsdWVzIHNpbmNlIG90aGVyd2lzZSBMVkRCRV9TZXRWb2x1bWUgZW5kcyB1cAogICAgIC8vIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhCiAgICAgcE1peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGLDB4MDAwMDdGRkYpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgMS4wLCAxLjApOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIHZvbHVtZQpAQCAtMjQ1LDkgKzI2OCwxMyBAQAogCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSBhcyB0aGUgdGFyZ2V0ICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKKyNlbHNlCisgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBNaXhHYWluLCBNaXhHYWluKTsKKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJlIHRoZSBtaXhlciBwcm9jZXNzIHBhdGggKi8KICAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOwpAQCAtMjY4LDkgKzI5NSwxMSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTA7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLwpAQCAtMjc4LDkgKzMwNywxNSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTA7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAogICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgMS4wLCAxLjApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAKICAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA4MzM5ZDNjLi40ZTUyMDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTc3LDYgKzc3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEYXRhIHN0cnVjdHVyZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBBR0MgcGFyYW1ldGVycyAqLwpAQCAtOTgsNyArOTksMjkgQEAKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCiAKIH0gTFZEQkVfQ29lZl90OworI2Vsc2UKKy8qIERhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEFHQyBwYXJhbWV0ZXJzICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworCit9IExWREJFX0RhdGFfRkxPQVRfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KK30gTFZEQkVfQ29lZl9GTE9BVF90OworI2VuZGlmCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xMDgsOCArMTMxLDEzIEBACiAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIERhdGEgYW5kIGNvZWZmaWNpZW50IHBvaW50ZXJzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZEQkVfRGF0YV90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLwogICAgIExWREJFX0NvZWZfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworI2Vsc2UKKyAgICBMVkRCRV9EYXRhX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl9GTE9BVF90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisjZW5kaWYKIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogCkBAIC0xMzYsNSArMTY0LDMgQEAKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgICAgICAvKiBfX0xWREJFX1BSSVZBVEVfSF9fICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggNjlkNzlkMi4uMTBlYTcwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiQUdDLmgiCiAjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTcyLDEzNiArNzEsMjM2IEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgY29uc3QgTFZNX0lOVDE2ICpwSW5EYXRhLCBMVk1fSU5UMTYgKnBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKKyAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKikgaEluc3RhbmNlOworICBMVk1fSU5UMzIgKnBTY3JhdGNoID0KKyAgICAgIChMVk1fSU5UMzIgKikgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0lOVDMyICpwTW9ubzsKKyAgTFZNX0lOVDE2ICpwSW5wdXQgPSAoTFZNX0lOVDE2ICopIHBJbkRhdGE7CisKKyAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikgKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisKKyAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBwTW9ubyA9ICZwU2NyYXRjaFsyICogTnVtU2FtcGxlc107CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CisgICAgcmV0dXJuIChMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICovCisgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTikKKyAgICAgIHx8IChMVkNfTWl4ZXJfR2V0Q3VycmVudCgKKyAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT0gTFZDX01peGVyX0dldFRhcmdldCgKKyAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpIHsKKworICAgIC8qCisgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCisgICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCisgICAgICovCisgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCisgICAgcFNjcmF0Y2gsIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgeworICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAoTFZNX0lOVDMyICopIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAqLworICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKKyAgICAgKiAoTm90IHJlcXVpcmVkIGZvciAxNi1iaXQgaW1wbGVtZW5hdGlvbnMpCisgICAgICovCisgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCisgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgLyogRGVzdC4gMTYtYml0IGRhdGEgICAgICovCisgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgTFZEQkVfU0NBTEVTSElGVCk7IC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgIH0KKworICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpCisgICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCisgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCisgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKSB7CisKKyAgICAvKgorICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgKi8KKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLCBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisKKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgcFNjcmF0Y2hWb2wsIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7CisKKyAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKK30KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKKyAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAorICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKIAotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBNb25vOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dCAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOworICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCisgIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKKyAgTFZNX0ZMT0FUICpwTW9ubzsKKyAgTFZNX0lOVDMyIGlpID0gMDsKIAorICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7CisvLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKIAotICAgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIHNob3J0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0lOVDE2ICopKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOwogCi0gICAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICAgIHBNb25vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJnBTY3JhdGNoWzIqTnVtU2FtcGxlc107CisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgeworICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0CisgICAqLworICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisKKyAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07CisgIH0KKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKKyAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQorICB7CiAKICAgICAvKgotICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7Ci0gICAgICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKLSAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKLSAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCi0gICAgICAgICAqIChGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gYXBwbHkgaGVhZHJvb20gbG9zcyBoZXJlKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1NDQUxFU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCi0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KLSAgICAgICAgICovCi0gICAgICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgotICAgICAgICAgKi8KLSAgICAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKLSAgICAgICAgICogKE5vdCByZXF1aXJlZCBmb3IgMTYtYml0IGltcGxlbWVuYXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLCAgICAgICAgICAgIC8qIERlc3QuIDE2LWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLSAgICB9Ci0KLSAgICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAotICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKQotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQotICAgICAgICAgKi8KLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICAgKi8KLQotICAgIH0KKyAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KIAogICAgIC8qCi0gICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOworICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgorICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOworICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcFNjcmF0Y2hfaW4sCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICB9CisKKyAgLyoKKyAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAqLworICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworCisgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKIH0KLQotCi0KLQotCi0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggZjVkMjI5ZS4uYzRhOWIxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtMzYsNyArMzYsMTEgQEAKIC8qCiAgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUV9GTE9BVF9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKQEAgLTgzLDYgKzg3LDE4IEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTMwLDYgKzE0NiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTc3LDYgKzIwNiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjIzLDEyICsyNjUsMzIgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfX07CisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKK307CiAKIC8qCiAgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJQX0MzMl9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM4MDAwX0ZjNTVfQjIsCkBAIC0yNTcsNiArMzE5LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yODYsNiArMzU2LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMzE1LDYgKzM5MywxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTM0Myw3ICs0MjksMTkgQEAKICAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX19OworICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKKworfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzUzLDcgKzQ1MSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAogICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKICAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCkBAIC0zNjIsMTAgKzQ2NCwyMCBAQAogICAgIEFHQ19BVFRBQ0tfRnMyNDAwMCwKICAgICBBR0NfQVRUQUNLX0ZzMzIwMDAsCiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAotICAgIEFHQ19BVFRBQ0tfRnM0ODAwMH07CisgICAgQUdDX0FUVEFDS19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAorICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisjZW5kaWYKKworfTsKIAogLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19ERUNBWV9GczgwMDAsCiAgICAgQUdDX0RFQ0FZX0ZzMTEwMjUsCiAgICAgQUdDX0RFQ0FZX0ZzMTIwMDAsCkBAIC0zNzQsMTAgKzQ4NiwyMCBAQAogICAgIEFHQ19ERUNBWV9GczI0MDAwLAogICAgIEFHQ19ERUNBWV9GczMyMDAwLAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAotICAgIEFHQ19ERUNBWV9GczQ4MDAwfTsKKyAgICBBR0NfREVDQVlfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRlMxOTIwMDAKKyNlbmRpZgorCit9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19HQUlOXzBkQiwKICAgICBBR0NfR0FJTl8xZEIsCiAgICAgQUdDX0dBSU5fMmRCLApAQCAtMzk2LDcgKzUxOCwxMSBAQAogICAgIEFHQ19HQUlOXzE1ZEJ9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19IUEZHQUlOXzBkQiwKICAgICBBR0NfSFBGR0FJTl8xZEIsCiAgICAgQUdDX0hQRkdBSU5fMmRCLApAQCAtNDIyLDYgKzU0OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg0MDAwLCAgICAgICAgICAgICAvKiAtNmRCICovCiAgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCkBAIC00MzAsOCArNTU3LDIyIEBACiAgICAgMHg2NUFELCAgICAgICAgICAgICAvKiAtMmRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCiAgICAgMHg3RkZGfTsgICAgICAgICAgICAvKiAgMGRCICovCisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0geworICAgIDAuNTAwMDAwZiwgICAgICAgICAvKiAtNmRCICovCisgICAgMC41NjIzNDFmLCAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjYzMDk1N2YsICAgICAgICAgLyogLTRkQiAqLworICAgIDAuNzA3OTQ2ZiwgICAgICAgICAvKiAtM2RCICovCisgICAgMC43OTQzMjhmLCAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjg5MTI1MWYsICAgICAgICAgLyogLTFkQiAqLworICAgIDEuMDAwMDAwZn07ICAgICAgICAvKiAgMGRCICovCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgVk9MX1RDX0ZzODAwMCwKICAgICBWT0xfVENfRnMxMTAyNSwKICAgICBWT0xfVENfRnMxMjAwMCwKQEAgLTQ0MCw5ICs1ODEsMTcgQEAKICAgICBWT0xfVENfRnMyNDAwMCwKICAgICBWT0xfVENfRnMzMjAwMCwKICAgICBWT0xfVENfRnM0NDEwMCwKLSAgICBWT0xfVENfRnM0ODAwMH07CisgICAgVk9MX1RDX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTkyMDAwCisjZW5kaWYKK307CisKKwogCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CisKICAgICBNSVhfVENfRnM4MDAwLAogICAgIE1JWF9UQ19GczExMDI1LAogICAgIE1JWF9UQ19GczEyMDAwLApAQCAtNDUxLDYgKzYwMCwxMCBAQAogICAgIE1JWF9UQ19GczI0MDAwLAogICAgIE1JWF9UQ19GczMyMDAwLAogICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwfTsKKyAgICBNSVhfVENfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxOTIwMDAKKyNlbmRpZgogCi0KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKaW5kZXggNDc2ZTZhMC4uY2E0NmUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03Niw4ICs3Nyw1NyBAQAogCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXTsKIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQorICovCitleHRlcm4gY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJQX0ZMT0FUX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdOworCisvKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXTsKKworI2VuZGlmIC8qQlVJTERfRkxPQVQqLworCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdOwogCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDFmZjJhMmMuLjliNmRhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC01MTQsMTEgKzUxNCwxOSBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworI2Vsc2UKIExWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCmluZGV4IDZjYmVlN2QuLjBhM2MzMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwpAQCAtNDgsNyArNDgsMTUyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycworICAgICAqLworICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKyAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgICpwVG9Qcm9jZXNzID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBQcm9jZXNzZWQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyArIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgICA9IExWTV9GSVJTVENBTEw7CisgICAgfQorICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIHRvIG91dHB1dCBpcyBzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisKKworICAgIC8qCisgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGRlbGF5IGJ1ZmZlciBhcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCisgICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAvKiBOdW1iZXIgb2YgZGVsYXkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLworICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZSBjb3VudCAqLworICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgIC8qIFVwZGF0ZSB0aGUgZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzIGZvciB0aGlzIGNhbGwgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiAwKQorICAgIHsKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIgYW5kIHNhbXBsZXMgdG8gb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICsgTnVtU2FtcGxlcyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgorICAgICAqLworICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7CisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisKKworICAgIC8qCisgICAgICogU2F2ZSBzYW1wbGVzIHRvIHRoZSBkZWxheSBidWZmZXIgaWYgYW55IGxlZnQgdW5wcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0xBU1RDQUxMKSkKKyAgICB7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgcFN0YXJ0ICAgICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC0xODksNyArMzM0LDcgQEAKICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLwogICAgIH0KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMTMsNyArMzU4LDQ3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGUgYmxvY2sgc2l6ZSB0byBwcm9jZXNzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBwcm9jZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7CisgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICoqcFByb2Nlc3NlZCwKQEAgLTI1Miw3ICs0MzcsNyBAQAogICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOwogICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNzgsNiArNDYzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZEluKExWTV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtNDE2LDcgKzYwMiw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlckluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDcxLDcgKzY1NywzNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC01MDEsNyArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTIyLDcgKzczOCwxNTYgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBkZXN0aW5hdGlvbiAqLworICAgIH0KKyAgICBwRGVzdCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBvdXRwdXQgYWRkcmVzcyAqLworCisKKyAgICAvKgorICAgICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBzYW1wbGVzIHRvIHNlbmQgdG8KKyAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgorICAgICAgICAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgZGVsYXllZCBvdXRwdXQgYnVmZmVyIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCisgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHByb2Nlc3NlZCByZXN1bHRzIHRvIHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYKKyAgICAgICAgKFNhbXBsZUNvdW50ICE9IDApKQorICAgIHsKKyAgICAgICAgaWYgKFNhbXBsZUNvdW50IDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZW1haW5pbmcgcHJvY2Vzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGNvdW50ICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHBvaW50ZXJzLCBjb3VudHMgYW5kIHNldCBkZWZhdWx0IGJ1ZmZlciBwcm9jZXNzaW5nCisgICAgICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIHNpemUgKi8KKyAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQpAQCAtNjcyLDcgKzEwMzcsNyBAQAogICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgYmxvY2sgc2l6ZSAqLwogICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsgICAgICAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzQxLDYgKzExMDYsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0KExWTV9IYW5kbGVfdCAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQogewpAQCAtODA1LDcgKzExNzEsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg0Myw3ICsxMjA5LDMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKQEAgLTg2Nyw0ICsxMjU3LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAppbmRleCAyNzEyYjJjLi4zNTM1NjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCkBAIC0yNiwxMCArMjYsNjU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFRyZWJsZUJvb3N0Q29ybmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgVHJlYmxlQm9vc3RNaW5SYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDM4NDM0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMxNTk5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wODE1NTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODg0NzUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTk0MworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI0MDA5MAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg0MjMyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTg1ODAxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNDUxNDUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjQ4ODcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxMzQ5MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1NjU0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzkwMTc3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMDE0NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc2MjE5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwNjE4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwMjcyOAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MTA4MgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zMTEwNDkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDI2MjAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyNTg4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU2ODk1NgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTk5NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MjE5NjQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNjM2NzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkzNjQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA4NjI2NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyNDAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNDQ2NjIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjMyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDc3MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE3MzE3NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTUwOTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTE2OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMTQwODYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTM4NjMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI4NDg3MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMTY5MjEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0MjkxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDk2MzQyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTg1NDU0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NTMzODkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg1NDQwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42NjU1NzQKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzk3NjI1CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyMzQ5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzMjY4MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjQ3MzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTExNDgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIzMTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAwMTAwMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ2ODQ0NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0OTgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42OTIyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDI0MzM4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjk0NjMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDYyNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yOTI0NDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzYzMQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTU5NDMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkwOTE5MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwNTkzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ0MTAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NDM2NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTMyNTcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTc4MDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzc2Njk1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTE0MjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40NzAzMTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc1MzU1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc0MzIwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY5MzIxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjA2NTU5CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODI1NDUzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM4MjgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MjE0MTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTQwMzA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTA4MjA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjMyNzEwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMxNzc5MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjUzNjY4NworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU1Mjk1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc3MTg0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxNjgwNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAzNTY5OAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMTI4NTIKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzMxNzQ2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDQ1MDIzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjYzOTE2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuODE3NzI0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDM2NjE4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNDUzMDYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY0MTUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzIxMDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjYxNTM4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41Mjk0ODgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYzODc1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDkzNDA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzYxMzU5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjMwOTcxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5ODkyMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTMyNjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODQ5OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyNjQ0NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNTI4MDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyMDc1OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS42Mzg3NzgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42MTU0NTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS44ODM0MDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44ODk5MjQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xNTc4NzMKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjQ2NTgzNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0MzQyNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjgxMTM3NAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTMxMTI3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy4xOTkwNzYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKyNpZmRlZiBISUdIRVJfRlMKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk2MjMzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NzM1ODMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA0MjA4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43ODE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzI1MzU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDI3MDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ2MTI5MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAzODY0MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjEzODEwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTkxMTYwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg0OTM5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjM2MjI4OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjU1NDI5OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTkyMzg3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzY5NzM4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDM0MTEzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMTE0NjQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi4yODI2ODUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDk2NTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi41ODcwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzUxMDk3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuOTI4NDQ3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjMxMTU1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTY0MDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy43NDE0MTQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjY0NjM3MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMjIzNzIxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44NzUxNTAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjg4MDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45OTYxMzAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0NTQ0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTMxODcxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI4NDE3NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjg3NzM3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ1NTA2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjg3OTQ3NworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNjQ2ODA0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODYxOTQwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMzU5OTkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTAzMzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYwNjgzOQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjM3NDE2NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi42NzgwNTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjI1MTY5MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMTkwMjAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYzNDI2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy40MDE1OTEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy44MzA4NDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NDUxNDUKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMzEyNDcyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA1LjA4NTU0MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00Ljg1Mjg2OAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKworI2VuZGlmCisKKyNlbHNlCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDIyMDUwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTY0MjkxICovCkBAIC01NzEsMyArMTIxNiw0IEBACiAKIAogI2VuZGlmCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwppbmRleCA3MjU2NGQ0Li5jZmU1M2I4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKQEAgLTY1LDkgKzY1LDE2IEBACiAgICAgaWYoCiAgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwogICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisjZWxzZQogICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorI2VuZGlmCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CiAgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKICAgICB7CkBAIC0yNjgsNyArMjc1LDEyIEBACiB2b2lkIExWTV9TZXRUcmVibGVCb29zdChMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyNlbHNlCiAgICAgZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE9mZnNldDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IDA7CiAKQEAgLTI5OCw2ICszMTAsMjAgQEAKICAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQogICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CkBAIC0zMDksNiArMzM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgLyogRGVzdGluYXRpb24uXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtMzQyLDYgKzM2OSw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwogICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwogICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgVGVtcDsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCkBAIC00MDEsMjIgKzQzMSw0NiBAQAogICAgICAqLwogICAgIGlmKGRCU2hpZnRzID09IDApCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7Ci0gICAgfQorI2VuZGlmCisgICAgICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFRlbXAgPSBMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdOworICAgICAgICB3aGlsZShkQlNoaWZ0cykgeworICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOworICAgICAgICAgICAgZEJTaGlmdHMtLTsKKyAgICAgICAgfQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pPj5kQlNoaWZ0cykpOworI2VuZGlmCiAgICAgfQogICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAscEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZW5kaWYKICAgICB9CiB9CiAKQEAgLTU1NCw4ICs2MDgsMjMgQEAKICAgICAgICAgLyogQ29uZmlndXJlIE1peGVyIG1vZHVsZSBmb3IgZ3JhZHVhbCBjaGFuZ2VzIHRvIHZvbHVtZSovCiAgICAgICAgIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPCAwKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogRHJvcCBpbiByaWdodCBjaGFubmVsIHZvbHVtZSovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTYzLDExICs2MzIsMjcgQEAKICAgICAgICAgICAgIFRhcmdldCA9IGRCX3RvX0xpbjMyKChMVk1fSU5UMTYpKExvY2FsUGFyYW1zLlZDX0JhbGFuY2U8PDQpKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPjApCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyNlbHNlCiAgICAgICAgICAgICBMVk1fSU5UMzIgVGFyZ2V0OworI2VuZGlmCiAgICAgICAgICAgICAvKiBEcm9wIGluIGxlZnQgY2hhbm5lbCB2b2x1bWUqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTc1LDE3ICs2NjAsMzYgQEAKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogTm8gZHJvcCovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CiAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KICAgICAvKgpAQCAtMTAwOCwxOCArMTExMiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSkKIHsKICAgICBMVk1fSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICBUYXJnZXQ7CisjZWxzZQogICAgIExWTV9JTlQzMiAgICBUYXJnZXQ7CisjZW5kaWYKIAogICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CiAgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CiAKICAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKICAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0pOworICAgIGlmKFRhcmdldCA9PSAxLjBmKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CisgICAgfQorI2Vsc2UKICAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7CiAKICAgICBpZihUYXJnZXQgPT0gMHg3RkZGKQogICAgIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CiAgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwppbmRleCA1NDJjM2M4Li4yNmMxYzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTIzMiw3ICsyMzIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKIApAQCAtMjY1LDcgKzI2OSwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CkBAIC01NDIsMTAgKzU1MCwxNSBAQAogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAvKiBTY3JhdGNoIDEgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilCdW5kbGVTY3JhdGNoU2l6ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZWxzZQogICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCkBAIC01OTgsMTQgKzYxMSwyNiBAQAogICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLwogICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsMCk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgfQogCisjaWZkZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2VuZGlmCiAKICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCICAgICAgICAgICAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgICAgICAgICAgICA9IDA7CkBAIC02MTUsMTUgKzY0MCwyNCBAQAogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CiAKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGRlZmF1bHQgRVFOQiBwcmUtZ2FpbiBhbmQgcG9pbnRlciB0byB0aGUgYmFuZCBkZWZpbml0aW9ucwogICAgICAqLwpAQCAtNzA5LDcgKzc0MywxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogCkBAIC03NjMsNyArODAxLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKQEAgLTg2OCw5ICs5MTAsMTQgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fSU5UMTYpKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwwKTsKIAogCkBAIC05OTQsNyArMTA0MSw2IEBACiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CiAKLQogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggMmU4NWY3Ny4uYjQ1MzIyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0xMzgsNiArMTM4LDIzIEBACiAKIAogLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLworfSBMVk1fQnVmZmVyX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwpAQCAtMTUwLDIyICsxNjcsMjggQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCiB9IExWTV9CdWZmZXJfdDsKLQorI2VuZGlmCiAKIC8qIEZpbHRlciB0YXBzICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCisjZW5kaWYKIH0gTFZNX1RFX0RhdGFfdDsKIAotCiAvKiBDb2VmZmljaWVudHMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2VuZGlmCiB9IExWTV9URV9Db2Vmc190OwogCi0KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KQEAgLTE4MSwxNSArMjA0LDI0IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KICAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJhdGlvbiBudW1iZXIgKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTnVtYmVyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgKi8KICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCkBAIC0yMDksOCArMjQxLDE2IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICBWQ19Wb2x1bWU7ICAgICAgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCkBAIC0yMzQsNyArMjc0LDExIEBACiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCiAgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwUFNBSW5wdXQ7ICAgICAgICAgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOb1Ntb290aFZvbHVtZTsgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBzbW9vdGggdm9sdW1lIGNoYW5nZXMqLwogCkBAIC0yNjEsMTYgKzMwNSwyOCBAQAogCiB2b2lkICAgIExWTV9TZXRIZWFkcm9vbSggICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgIExWTV9CdWZmZXJJbiggICBMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOworI2Vsc2UKIHZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCmluZGV4IGY1YTAxZjMuLjRhMTlhMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwpAQCAtNTEsNyArNTEsMjMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgorICAgICAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBhIGdvb2QgbXVsdGlwbGUgKHVubWFuYWdlZCBtb2RlIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZigoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZXcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisKKyAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgZnJvbSBNb25vIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCisgICAgeworICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOworICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBwcm9jZXNzaW5nCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVySW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgJnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAmcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgorICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+Q1NfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICh2b2lkKUxWQ1NfUHJvY2VzcyhwSW5zdGFuY2UtPmhDU0luc3RhbmNlLCAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJ5cGFzcyBtb2RlIG9yIGV2ZXJ5dGhpbmcgb2ZmLCBzbyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPT0gTFZNX1BTQV9PTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworCisgICAgICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEQyByZW1vdmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI3MywzICs0OTcsNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCBlMTRmOTA5Li4xOTlkZGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yOSw3ICsyOSwzNDIgQEAKIC8qICAgIFRyZWJsZSBCb29zdCBGaWx0ZXIgQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogCitGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0NGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCiBGT19DMTZfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CiAKICAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLwpAQCAtMzQwLDggKzY3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwogICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9TaGlmdH19OwotCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9CisgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MCw2ICs2ODYsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXSA9IHsKKyAgICAxLjAwMGYsICAgICAgICAgICAgIC8qICAwZEIgKi8KKyAgICAwLjg5MWYsICAgICAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAwLjc5NGYsICAgICAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjcwOGYsICAgICAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAwLjYzMWYsICAgICAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjU2MmYsICAgICAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjUwMWZ9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg3RkZGLCAgICAgICAgICAgICAvKiAgMGRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCkBAIC0zNTgsNiArNzA0LDcgQEAKICAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KICAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KICAgICAweDQwMDB9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAppbmRleCBhNzYwMWZmLi40Y2Y3MTE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCkBAIC0zNywxNiArMzcsMjMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2V4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZWxzZQogZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdOworI2Vsc2UKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107CisjZW5kaWYKKwogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW107CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAppbmRleCAyMDgwZDY0Li45YTNkMzVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApAQCAtMzcsNyArMzcsNyBAQAogLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KQEAgLTUyLDIwICs1MiwzOSBAQAogICAgIExWTV9JTlQxNiAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19NYXhHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICBWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgQUdDX1RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgQUdDX0F0dGFjazsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19EZWNheTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBkZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIFZvbHVtZVRDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCit9IEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdDsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDdhYzdmYmQuLjNlZTdmNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0yNywxOSArMjcsMzQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKIAorfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOwogCiB9IEJpcXVhZF9JbnN0YW5jZV90OwotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENPRUZGSUNJRU5UIFRZUEUgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIEJpcXVhZCBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEEyOyAgIC8qICBhMiAgKi8KKyAgICBMVk1fRkxPQVQgIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMjsgICAvKiAgYTIgICovCkBAIC01Nyw4ICs3MiwxNyBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUV9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTE7ICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KK30gRk9fRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAvKiAgYTEgICovCkBAIC03Miw4ICs5NiwxNyBAQAogICAgIExWTV9JTlQzMiAgQTA7ICAgLyogIGEwICAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBGT19DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyB3aXRoIFNoaWZ0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEExOyAgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgICAvKiAtYjEhICovCit9IEZPX0ZMT0FUX0xTaHhfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAgLyogIGExICAqLwpAQCAtODEsOCArMTE0LDE2IEBACiAgICAgTFZNX0lOVDE2IEIxOyAgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2IFNoaWZ0OyAvKiBTaGlmdCAqLwogfSBGT19DMTZfTFNoeF9Db2Vmc190OwotCisjZW5kaWYKIC8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLworfSBCUF9GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTk2LDggKzEzNywxOCBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUF9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIFBlYWtpbmcgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KKyAgICBMVk1fRkxPQVQgIEc7ICAgLyogR2FpbiAqLworfSBQS19GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTExMywxNiArMTY0LDI2IEBACiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KIH0gUEtfQzMyX0NvZWZzX3Q7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgVEFQUyBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSoyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8xSV9PcmRlcjFfVGFwc190OwogCkBAIC0xMzAsMTIgKzE5MSwyMiBAQAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMioyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdDsKLQorI2VuZGlmCiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogeworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSo0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdDsKIApAQCAtMTQzLDcgKzIxNCw3IEBACiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKLQorI2VuZGlmCiAvKiBUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byBzYXRpc2Z5IFFBQyBydWxlczogTmFtZSBzaG91bGQgYmUgVW5pcXVlIHdpdGhpbmcgMTYgY2hhcmFjdGVycyovCiAjZGVmaW5lIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgIEluaXRfQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDEKICNkZWZpbmUgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgICAgICAgVFdPX0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyCkBAIC0xNTQsNTkgKzIyNSwxNDggQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yMTUsMzMgKzM3NSw2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjUwLDEzICs0NDMsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQkFORCBQQVNTIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjc0LDEwICs0ODIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yODYsNDIgKzUwMSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIAogLyoqKiAzMiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCiB2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogREMgUkVNT1ZBTCBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAppbmRleCA0Y2I4YWEyLi40OThmYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCkBAIC02NiwxMyArNjYsMTcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7CisjZWxzZQogdm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZJbiwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0ZXJCZk91dCwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7Ci0KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAppbmRleCAyMjk3MDFhLi4wYzg5NTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMzMsMTEgKzMzLDMyIEBACiAgICBERUZJTkVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRklMVEVSX0xPU1MgICAgIDMyNzMwICAgICAgIC8qIC0wLjAxZEIgbG9zcyB0byBhdm9pZCB3cmFwcGluZyBkdWUgdG8gYmFuZCByaXBwbGUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIEZJTFRFUl9MT1NTX0ZMT0FUICAgIDAuOTk4ODQ5ZgorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CisKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIFgpOworI2lmZGVmIEhJR0hFUl9GUworTFZNX0ZMT0FUICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMzIgIEZjLAorI2Vsc2UKK0xWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGUpOworCitMVk1fRkxPQVQgTFZNX0ZPX0xQRiggICAgTFZNX0ZMT0FUICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKKworTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgIExWTV9GTE9BVCAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcyk7CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgWCk7CkBAIC01Miw3ICs3Myw3IEBACiAKIExWTV9JTlQzMiAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA2OGM1NWY3Li5jYjE1YjYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtNDQsNiArNDQsOSBAQAogCiAjZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KICNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLjBmCisjZW5kaWYKICNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwogI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3CiAKQEAgLTk1LDcgKzk4LDkgQEAKIHR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNzaW9uIGZsb2F0aW5nIHBvaW50Ki8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTMzLDYgKzEzOCwxMCBAQAogICAgIExWTV9GU18zMjAwMCA9IDYsCiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAorI2lmZGVmIEhJR0hFUl9GUworICAgIExWTV9GU185NjAwMCA9IDksCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9Gc19lbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IDg5ZGViMGQuLjA3YzUzY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMzAsNiArMzAsNDMgQEAKICAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZhbHVlLiAgU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBDdXJyZW50OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZS4gIFNldCBieSB0aGUgbWl4ZXIgZnVuY3Rpb24uICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTsgICAgICAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit9IE1peF8xU3RfQ2xsX0ZMT0FUX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEFscGhhMTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQxOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQxOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMTsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMTsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMTsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMTsKKworICAgIExWTV9GTE9BVCAgIEFscGhhMjsgICAgICAgICAgICAgICAgICAgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gTWl4XzFTdF9DbGxfdCBpbiBzb21lIGZ1bmN0aW9ucyAqLworICAgIExWTV9GTE9BVCAgIFRhcmdldDI7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDI7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0yOworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUyOworICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UyOworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOworfSBNaXhfMlN0X0NsbF9GTE9BVF90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCkBAIC02NCw5ICsxMDEsMzUgQEAKIAogfSBNaXhfMlN0X0NsbF90OwogCisjZW5kaWYKIAogLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKKwordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCAgICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKQEAgLTg4LDEwICsxNTEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwogCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKExPVyBMRVZFTCBTVUJGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC0xMDcsNiArMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCkBAIC0xMTUsMTMgKzE5NSwzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8qIF9fTUlYRVJfSF9fICovCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAppbmRleCAzZDYyNzA0Li5jZGIzODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCkBAIC0zNCw3ICszNCwxMiBAQAogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiAKIC8qIEFic29sdXRlIHZhbHVlIGluY2x1ZGluZyB0aGUgY29ybmVyIGNhc2UgZm9yIHRoZSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICAgaW5wdXQpOworI2Vsc2UKIExWTV9JTlQzMiAgIEFic18zMihMVk1fSU5UMzIgICAgIGlucHV0KTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQpAQCAtNDgsOCArNTMsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKICAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpOworI2Vsc2UKIExWTV9JTlQzMiBkQl90b19MaW4zMihMVk1fSU5UMTYgIGRiX2ZpeCk7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMmI3OTFiZC4uMGJhMjBhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtMjksNiArMjksMTEgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMb2FkQ29uc3RfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIExvYWRDb25zdF8xNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtMzYsMTAgKzQxLDE3IEBACiB2b2lkIExvYWRDb25zdF8zMiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbm90ZTogSW4gTXVsdDNzXzE2eDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgpAQCAtNDksMTAgKzYxLDE3IEBACiAgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE11bHQzc19GbG9hdCggICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIE11bHQzc18xNngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTY2LDIwICs4NSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgRGVsYXlNaXhfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogdm9pZCBEZWxheVdyaXRlXzMyKCAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtODcsNyArMTE3LDEzIEBACiB2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNYWMzc19TYXRfMTZ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC05Nyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiB2b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKCAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgY29lZmYsICAgICAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLwpAQCAtMTA5LDcgKzE0NSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBTSElGVCBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKTsKKyNlbHNlCiB2b2lkIFNoaWZ0X1NhdF92MTZ4djE2ICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTExOSwxMSArMTYwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQVVESU8gRk9STUFUIENPTlZFUlNJT04gRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNb25vVG8ySV8xNiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKQEAgLTEzMSwyOSArMTc2LDUyIEBACiB2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgTVNUbzJpX1NhdF8xNngxNiggICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQogdm9pZCBKb2luVG8yaV8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIERBVEEgVFlQRSBDT05WRVJTSU9OIEZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCA5MjBiNTE1Li5mYTlmMDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzMsNyArMzMsMTAgQEAKIAogI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSw3ICs3Miw3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCkBAIC0xOTMsNCArMTk2LDExMyBAQAogCiAgICAgcmV0dXJuOwogfQorI2Vsc2UKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworewogCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIFJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE51bVNhbXBsZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIExlZnQgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7CisgICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKKyAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisgICAgICAgICpwRHN0KysgPSBSaWdodDsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAqLworICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCmluZGV4IDkxMjhiODIuLjg0ZmFiZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCkBAIC00Nyw0ICs0NywxNCBAQAogICAgIH0KICAgICByZXR1cm4gaW5wdXQ7CiB9Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIC8qIE5lZ2F0aXZlIGlucHV0LCBzbyBpbnZlcnQgKi8KKyAgICAgICAgaW5wdXQgPSAoTFZNX0ZMT0FUKSgtaW5wdXQpOworICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCmluZGV4IDY5ZDM1N2UuLmUzZWRjY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwpAQCAtNTcsNCArNTcsMzMgQEAKICAgICByZXR1cm47CiB9CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBZGQyX1NhdF9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpICpzcmMpICsgKChMVk1fRkxPQVQpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IGY0YzU3NTcuLjg4Zjk5ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNTEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKIAorCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiAoKCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMiw1IEBACiAgICAgICAgIH0KIAogICAgIH0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggODg5MTRhZC4uMjdhYjU3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC00OSw2ICs2Miw3IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09cENvZWYtPkIyOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKICAgfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5ODA1MzljLi5lMTk0ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggYmExYTQyZi4uM2FiZGQ0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw0OCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCit7CisgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CiAKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD0gKEEwICogKHgobilMIC0geChuLTIpTCApKQorICAgICAgICB0ZW1wbCA9IChMVk1fRkxPQVQpICpwRGF0YUluIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkpCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgIH0KK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC04MCw0ICsxMjEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGU4MzMyMTguLmQ2ZTA0N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTQ4LDYgKzQ4LDIwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKKworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU5LDYgKzczLDcgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5Y2NhNjI3Li5hYTllNjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNiw1ICsyNiwxMiBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwppbmRleCBiMDljMWFhLi5hYmRiMmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKQEAgLTMzLDcgKzMzLDUyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAgKiAoeChuKUwgIC0geChuLTIpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSB5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKaW5kZXggOTM2NzkxMi4uNTU5MGMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpAQCAtMzcsNiArMzcsMjEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUwLDYgKzY1LDcgQEAKIAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKaW5kZXggNWNjMWNlMi4uODBjMzkyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApAQCAtMjYsNSArMjYsMTMgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0KiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogCiAjZW5kaWYgLypfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBmMmY4YzZiLi5lZTliZjdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTMyLDcgKzMyLDU2IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODIsNCArMTMxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiYWYwYzFhLi4zZDViZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyA7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDkwOWM2OTkuLjgxMWRhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDQgKzI3LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggOTJmNmNhZi4uYzc0YTEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw1NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODEsNCArMTI4LDQgQEAKIAogICAgICAgICB9CiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBhZWExMGYwLi45ODEyMjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCAxZDZiZTRlLi5mZWFlMjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Nyw2ICs3OCw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDk3MmU3MDQuLjliMGZkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsODEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTCAgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKworICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTIsMyArMTg2LDQgQEAKIAogICAgIH0KIAorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZTA1NjM3My4uZjI0ZGI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw4MSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTEsNCArMTg1LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCAwYThhYzM1Li4zOWUxYmRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTcsNiArNzgsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3ZDQyY2VkLi4wNjkxYjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1s1XTsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYwppbmRleCA0YTBjY2U0Li42MWMwN2M3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDc5IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9QTIgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEqIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAqIHgobilMICAgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKiB5bkwrPS1CMip5KG4tMilMICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MKz0tQjEqeShuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCogeChuKVIgICAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPS1CMiAqIHkobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPS1CMSAqIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTUsNCArMTg3LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDA1MmUyYTAuLmNmMTllMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsODIgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgICkpKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiAgKSkqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpICAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE4OSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYwppbmRleCA4Yzc0MWUxLi4yNjExYjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDg0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpIGluIFExNSAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgLyogVXBkYXRlIHkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE5MSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNGYwY2Y2Ny4uYzAzMTljOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCA0NTkxZWUwLi40ZDliYmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU2LDYgKzc2LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggZmQ4MjEyZTQuLjk2MGRlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsOTQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCiAKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx5blIsdGVtcGwsdGVtcGQ7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCisgICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMjMsNCArMjEwLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTcwOWY3MS4uZmZmMDVlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDc0N2FmNmEuLmMwZjBkY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI5LDQgKzI5LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKaW5kZXggMjA0MDRhZC4uZTQ4OTAzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtNTQsNSArNTQsMzUgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCBiZjY5ZTM1Li5lYTk4MDQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDFTaG9ydDsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDJTaG9ydDsKIAorICAgIEN1cnJlbnQxU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50MSk7CisgICAgQ3VycmVudDJTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQyKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjMSsrOworICAgICAgICBUZW1wMyA9IFRlbXAxICogQ3VycmVudDFTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAqc3JjMisrOworICAgICAgICBUZW1wMSA9IFRlbXAyICogQ3VycmVudDJTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAoVGVtcDEgLyAyLjBmKSArIChUZW1wMyAvIDIuMGYpOworICAgICAgICBpZiAoVGVtcDIgPiAwLjVmKQorICAgICAgICAgICAgVGVtcDIgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmICkKKyAgICAgICAgICAgIFRlbXAyID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyID0gKFRlbXAyICogMik7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCkBAIC01NSw2ICs4NSw1IEBACiAgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCAzNDcxZjA1Li4yODE0ZjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0yNiw2ICsyNiw3MCBAQAogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7CisgICAgTFZNX0lOVDE2ICAgICBpaSxqajsKKworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLXBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQpOworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9KExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgVGVtcDIgPSAqZHN0OworCisgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOworCisgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTg5LDYgKzE1Myw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKaW5kZXggNzA5YzMwNC4uODE0Y2NlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTI1LDcgKzI1LDc5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9GTE9BVCBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9GTE9BVCBDdXJyZW50VGltZXNBbHBoYTsKIAorICAgIExWTV9JTlQxNiBpaTsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKKyAgICB7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCAhPSAwKQorICAgIHsKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSAocEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYSk7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC05OCw2ICsxNzAsNSBAQAogICAgICAgICAgICAgZHN0Kys7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwppbmRleCA0OWZhMTg0Li5kMjYxYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTE4LDcgKzE4LDUzIEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIExlZnREQyxSaWdodERDOworICAgICAgICBMVk1fRkxPQVQgRGlmZjsKKyAgICAgICAgTFZNX0lOVDMyIGo7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKIAorICAgICAgICBMZWZ0REMgPSBwQmlxdWFkU3RhdGUtPkxlZnREQzsKKyAgICAgICAgUmlnaHREQyA9IHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKKyAgICAgICAgZm9yKGogPSBOclNhbXBsZXMtMTsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgTGVmdERDIC09IERDX0ZMT0FUX1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExlZnREQyArPSBEQ19GTE9BVF9TVEVQOyB9CisKKworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworICAgICAgICB9CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOworICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOworCisKKyAgICB9CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNjQsNCArMTEwLDQgQEAKIAogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0NjhhODhkLi40ZjRmY2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNywxMSArMTcsMTggQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKK30KKyNlbHNlCiB2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKIHsKICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDA7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMDsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggODlhNGU2OC4uZmE2YjcyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMTgsMTEgKzE4LDIzIEBACiAjaWZuZGVmIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAjZGVmaW5lIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNlbHNlCiAjZGVmaW5lIERDX0QxNl9TVEVQICAgICAweDIwMDsKKyNlbmRpZgogCiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfCit7CisgICAgTFZNX0ZMT0FUICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCisgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLworfUZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCkBAIC0zMCw1ICs0Miw1IEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCisjZW5kaWYKICNlbmRpZiAvKiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKaW5kZXggN2UzMTgyZC4uZjUwMjcxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCkBAIC0zNiwxMCArMzYsNTUgQEAKICAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgdGVtcDsKIAorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIG9mZnNldCAqLworICAgICpwT2Zmc2V0ID0gT2Zmc2V0OworCisgICAgcmV0dXJuOworfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKwogICAgIGZvciAoaT0wOyBpPG47IGkrKykKICAgICB7CiAgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNDksNyArOTQsNyBAQAogCiAKICAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNjksNSArMTE0LDUgQEAKIAogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGRlNzczNjEuLjAzOWM4OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzEsNiArMzEsNDYgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03MSw0ICsxMTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDk2MjUyY2MuLmIyMWI4YTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDIyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Myw2ICs2OSw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDUxNmNhODMuLjZmZGIwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKaW5kZXggMGYxZDViYy4uNDE2ZThlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCkBAIC0zMSw3ICszMSw0NyBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2ICBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTcxLDQgKzExMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTM2ZTRmNi4uZjMzZDI0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUyLDYgKzY5LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTRhZDQ4Yy4uZmRiNTI4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjksNCArMjksMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUXworeworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwppbmRleCA4Mzg4MDUwLi4xOTI5MjdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw5MiBAQAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW5MLHluUjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgTmVnU2F0VmFsdWU7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOwogCisgICAgICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBOZWdTYXRWYWx1ZSA9IC0xLjBmOworCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8vIHluTCA9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAgICAgLy8geW5SID1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilMCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCoocERhdGFJbisxKSk7CisKKworICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5MICs9IFRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IFRlbXA7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSB5blI7IC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgaWYoeW5MID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5bkwgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluTCA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5MID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih5blIgPiAxLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHluUiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoeW5SIDwgTmVnU2F0VmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5blIgPSBOZWdTYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTI1LDQgKzIxMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGExOWMzMmMuLjMzY2E2Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyMyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKQEAgLTU1LDYgKzcyLDcgQEAKICAgdGVtcD1wQ29lZi0+U2hpZnQ7CiAgIHBCaXF1YWRTdGF0ZS0+U2hpZnQgPSB0ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA0NjQwNzQzLi4zNjhiZmNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsNiArMjAsMTUgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICAgIExWTV9GTE9BVCAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9GbG9hdF9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfRmxvYXRfU3RhdGUgKiBQRmlsdGVyX0Zsb2F0X1N0YXRlIDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewogICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpAQCAtMjgsNSArMzcsNSBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCmluZGV4IDRkMzJkZjEuLmIxZmRlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKQEAgLTM0LDYgKzM0LDcgQEAKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEsIEEyLCBCMSBhbmQgQjIgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgICAgICBMVk1fSU5UMTYgICBBMDsKQEAgLTQzLDEyICs0NCwyMiBAQAogICAgICAgICBMVk1fSU5UMTYgICBCMjsKICAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQTA7CisgICAgTFZNX0ZMT0FUICAgQTE7CisgICAgTFZNX0ZMT0FUICAgQTI7CisgICAgTFZNX0ZMT0FUICAgQjE7CisgICAgTFZNX0ZMT0FUICAgQjI7CisgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisjZW5kaWYKIC8qCiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExIGFuZCBCMSBjb2VmZmljaWVudHMKICAqLwogLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgICAgIExWTV9JTlQxNiAgIEEwOwpAQCAtNTYsOCArNjcsMTUgQEAKICAgICAgICAgTFZNX0lOVDE2ICAgQjE7CiAgICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDFCMUNvZWZzU1BfdDsKLQotCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBMDsKKyAgICBMVk1fRkxPQVQgICBBMTsKKyAgICBMVk1fRkxPQVQgICBCMTsKKyAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK30gQmlxdWFkQTAxQjFDb2Vmc1NQX3Q7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKaW5kZXggNzk3NWU4Yi4uMmM2ZTZjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtNTMsNSArNTMsMzQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01TX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAxLGxlZnQscmlnaHQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbGVmdCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgc3JjKys7CiAKKyAgICAgICAgcmlnaHQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0TSsrOworCisgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RTID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0UysrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IDhiYjI5MmYuLmFjMWVlYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC00Niw1ICs0NiwyNyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBUZW1wOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKCpzcmMpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgKmRzdCA9IFRlbXAgLyAyLjBmOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKaW5kZXggOWI5MzhiZC4uZWJjNDc3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCkBAIC00OSw2ICs0OSwzMSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBzcmNMICs9IG4gLSAxOworICAgIHNyY1IgKz0gbiAtIDE7CisgICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyY1I7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmNSLS07CisKKyAgICAgICAgKmRzdCA9ICpzcmNMOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjTC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCAzZDM5YjkzLi5lYjU3NTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0yNyw3ICsyNywzOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKIAorICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTItPkN1cnJlbnQpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgIH0KKworCit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLApAQCAtNjYsNCArOTgsNSBAQAogCiAKIH0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKaW5kZXggMmRhZjc0YS4uZWMwYmFhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMjQsNyArMjQsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworICAgIExWTV9GTE9BVCBDdXJyZW50MjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorCisgICAgQ3VycmVudDEgPSAocEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgQ3VycmVudDIgPSAocEluc3RhbmNlMi0+Q3VycmVudCk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAgPSAoKChMVk1fRkxPQVQpKihzcmMxKyspICogKExWTV9GTE9BVClDdXJyZW50MSkpICsKKyAgICAgICAgICAgICAgICgoKExWTV9GTE9BVCkqKHNyYzIrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQyKSk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLApAQCAtNTQsNiArODQsNSBAQAogICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggY2FhMDk1MS4uZDI2OTRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNSw3ICsyNSw5NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQorewogCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudCA8IFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEyMyw2ICsyMTIsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCmluZGV4IDA5ZWM0MjcuLjY1NmExMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDEyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIEFERDJfU0FUX0ZMT0FUKExWTV9GTE9BVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGMpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgdGVtcCA9IGEgKyBiIDsKKyAgICBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICBjID0gLTEuMGY7CisgICAgZWxzZSBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIGMgPSAxLjBmOworICAgIGVsc2UKKyAgICAgICAgYyA9IHRlbXA7CisgICAgcmV0dXJuIGM7Cit9Cit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZUwgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZVIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorICAgIExWTV9GTE9BVCAgIERlbHRhTCA9IHBJbnN0YW5jZUwtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnRMID0gcEluc3RhbmNlTC0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRMID0gcEluc3RhbmNlTC0+VGFyZ2V0OworCisgICAgTFZNX0ZMT0FUICAgRGVsdGFSID0gcEluc3RhbmNlUi0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudFIgPSBwSW5zdGFuY2VSLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldFIgPSBwSW5zdGFuY2VSLT5UYXJnZXQ7CisKKyAgICBMVk1fRkxPQVQgICBUZW1wID0gMDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZiAoT3V0TG9vcCkKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIDI7IGlpICE9IDA7IGlpIC09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcCAqIDI7IGlpICE9IDA7IGlpLT0yKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgfQorICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQgPSBDdXJyZW50TDsKKyAgICBwSW5zdGFuY2VSLT5DdXJyZW50ID0gQ3VycmVudFI7CisKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCkBAIC0xNDAsNCArMjYwLDUgQEAKICAgICBwSW5zdGFuY2VSLT5DdXJyZW50PUN1cnJlbnRSOwogCiB9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGYxYTljYTMuLmI1ZTdmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDg2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOwogCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEwMSw2ICsxODAsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAwMDUyZGQ3Li4xOTJmMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsODAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTEwOCw1ICsxODEsNSBAQAogICAgIH0KIAogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKaW5kZXggZjQ0M2M4Zi4uYmQ1YTkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0zMyw3ICszMywxMzggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykKKyAgICB7CisgICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IDEuMGYpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gMS4wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xNDgsNSArMjc5LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCmluZGV4IGM4ZGNhZDcuLjEwMTdkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsNzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVk1peGVyM19NSVhTT0ZUXzFTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICBlbHNlIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTA3LDUgKzE3Nyw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZi8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCA3MjQwNzA1Li4zYzkwMDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCkBAIC02Niw1ICsxMDgsNSBAQAogICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9Ci0KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCA5ODBjNzgzLi5mOTA0OTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMzEsNiArMzEsMTkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMVk1peGVyM19zdCBzdHJ1Y3R1cmUgc3RvcmVzIEluc3RhbmNlIHBhcmFtZXRlcnMgZm9yIG9uZSBhdWRpbyBzdHJlYW0gKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTFZNaXhlcjNfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCkBAIC00MCwyMiArNTMsMzUgQEAKICAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KICAgICBMVk1fQ2FsbGJhY2sgICAgcENhbGxCYWNrOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19zdDsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK30gTFZNaXhlcjNfMVN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KIH0gTFZNaXhlcjNfMVN0X3N0OwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMl07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KK30gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzJTdF9zdDsKLQorI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVszXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0aHJlZSBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzNTdF9zdDsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoSElHSCBMRVZFTCBGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc1LDU3ICsxMDEsMTE1IEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgVGFyZ2V0R2Fpbik7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSk7CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOworI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZW5kaWYKIAogLyoqKiAxNiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMF0gYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVsxXSBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLQotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwppbmRleCBiNWFlMjY0Li41OTkwNDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKQEAgLTMxLDcgKzMxLDE1IEBACiAvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgQ3VycmVudEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIEN1cnJlbnRHYWluID0gcEluc3RhbmNlLT5DdXJyZW50OyAgLy8gQ3VycmVudEdhaW4KKyAgICByZXR1cm4gQ3VycmVudEdhaW47Cit9CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSkKIHsKICAgICBMVk1fSU5UMzIgICAgICAgQ3VycmVudEdhaW47CkBAIC0zOSwzICs0Nyw0IEBACiAgICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0CiAgICAgcmV0dXJuIEN1cnJlbnRHYWluOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKaW5kZXggZGMyZjhlOS4uYzY3NDU1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpAQCAtMzAsNyArMzAsMTYgQEAKIC8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIAorICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsgIC8vIFRhcmdldEdhaW4KKyAgICByZXR1cm4gVGFyZ2V0R2FpbjsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCiB7CiAgICAgTFZNX0lOVDMyICAgICAgIFRhcmdldEdhaW47CkBAIC00MCwzICs0OSw0IEBACiAKICAgICByZXR1cm4gVGFyZ2V0R2FpbjsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKaW5kZXggNDQ5ZTdiMS4uNzM3ZTI2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCkBAIC00NCw3ICs0NCwxOSBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2FpbikKK3sKKyAgICBMVk1fRkxPQVQgTWF4R2FpbiA9IFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgaWYoQ3VycmVudEdhaW4gPiBNYXhHYWluKQorICAgICAgICBNYXhHYWluID0gQ3VycmVudEdhaW47CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudEdhaW47IC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudEdhaW4pCkBAIC02NCw0ICs3Niw0IEBACiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKICAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCmluZGV4IDI5NGUwNWMuLmQwZDBlMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMjYsNiArMjYsMTUgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKIC8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIFRhcmdldCBHYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCit9IE1peF9Qcml2YXRlX0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogR2VuZXJhbCAqLwpAQCAtMzQsOCArNDMsNyBAQAogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgLyogTGVmdCBTaGlmdCBmb3IgSW50ZWdlciBwYXJ0IG9mIEdhaW4gKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyB0aGUgZnJhY3Rpb25hbCB2YWx1ZSBvZiBEZWx0YSBHYWluICovCiB9IE1peF9Qcml2YXRlX3N0OwotCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKQEAgLTQ5LDIzICs1Nyw0MyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnBJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzMsMTIgKzEwMSwxOSBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NiwxNiArMTIxLDIyIEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0KLQorI2VuZGlmCiAKIC8qKiogMzIgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtMTEyLDcgKzE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCmluZGV4IDVlZmE1MDEuLjU3NzE3OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKQEAgLTQzLDcgKzQzLDE0IEBACiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbikKIHsKQEAgLTY0LDMgKzcxLDQgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudEdhaW48PCgxNi1TaGlmdCk7ICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAogICAgIHBJbnN0YW5jZS0+U2hpZnQ9U2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA0YzFjOGIyLi40OGY1ZDU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCkBAIC00NCw3ICs0NCw1MSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisjZWxzZQorICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2Z9Oy8qNDgwMDAqLworI2VuZGlmCiAKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKKyAgICBEZWx0YSA9IERlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgIGVsc2UKKyAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKQEAgLTczLDMgKzExNyw0IEBACiAKICAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggOGQ1MzA0ZS4uOWRjN2QyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNDUsNyArNDUsNzIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2NmYsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KKyNlbmRpZgorICAgIExWTV9GTE9BVCBUY19taWxsaXNlY19mbG9hdDsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAorICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGEgLyAoTnVtQ2hhbm5lbHMpOworCisgICAgLyogIEdldCBnYWluIHZhbHVlcyAgKi8KKyAgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWNfZmxvYXQgPSAoTFZNX0ZMT0FUKShUY19taWxsaXNlYykgLyAoQ3VycmVudCAtIFRhcmdldCk7CisgICAgICAgIGlmIChUY19taWxsaXNlY19mbG9hdCA8IDApCisgICAgICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAxLjAwMDAwMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihEZWx0YSA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7ICAvKiBNaW5pbXVtIHZhbHVlIGZvciBwcm9wZXIgY2FsbC1iYWNrcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLApAQCAtOTMsMyArMTU4LDQgQEAKIAogICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwppbmRleCA2ZDhmZTQ2Li45MDk0NjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTksIENvZWZmaWNpZW50cywgdyk7CiAKKyAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCisgICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KKyAgICBZID0gWSAtIDAuNWY7ICAgICAgICAgLyogQTA9WT0oQjEvMiAtIDAuNSkqLworCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7ICAgICAgICAgICAgICAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCisgICAgcENvZWZmcy0+QTEgPSAtcENvZWZmcy0+QTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgQTE9LUEwKi8KKworICAgIHJldHVybiAxOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fRk9fSFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQogewpAQCAtOTcsNCArMTI2LDQgQEAKIAogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwppbmRleCA4NmVjOTUxLi45ZmU2N2Y4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTA9KDErQjEpLzI9IEIxLzIgKyAwLjUKKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgIC8vIEEwPVk9QjEvMgorICAgIFkgPSBZICsgMC41ZjsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCiAKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsKKyAgICBwQ29lZmZzLT5BMSA9IHBDb2VmZnMtPkEwOworCisgICAgcmV0dXJuIDE7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCiB7CkBAIC05NCw0ICsxMjAsNCBAQAogICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOwogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKaW5kZXggZjNiOWIzYy4uNzg0NmNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKQEAgLTMyLDE2ICszMiw0NSBAQAogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwICwgLyogOGtIeiBpbiBRNDEsIDE2a0h6IGluIFE0MiwgMzJrSHogaW4gUTQzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1LCAgLyogMTEwMjUgSHogaW4gUTQxLCAyMjA1MEh6IGluIFE0MiwgNDQxMDAgSHogaW4gUTQzKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTIwMDB9OyAvKiAxMmtIeiBpbiBRNDEsIDI0a0h6IGluIFE0MiwgNDhrSHogaW4gUTQzICovCi0KKyNlbmRpZgogCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDBfZiAgICAgICAgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgICAgICAgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgICAgICAgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgICAgICAgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgICAgICAgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgICAgICAgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgICAgICAgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgICAgICAgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKKyNlbmRpZgorY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjVfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xNjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjIwNTBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzI0MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8zMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE5MjAwMF9mCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OSw3ICs4OCwyMCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBISUdIRVJfRlMKK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCisjZWxzZQorTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKKyNlbmRpZgoreworICAgIExWTV9GTE9BVCAgIHc7CisgICAgdyA9IChMVk1fRkxPQVQpRmMgKiBMVlZETF8yUGlPbkZzVGFibGVbRnNdOworICAgIHJldHVybiB3OworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCiB7CkBAIC02Nyw0ICsxMDksNCBAQAogICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCiAgICAgcmV0dXJuIHc7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCmluZGV4IDY4NDZkNDkuLmYxZTQ1ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKQEAgLTg3LDUgKzg3LDU4IEBACiAjZGVmaW5lIEFMUEhBXzQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwogI2RlZmluZSBBTFBIQV81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF81ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzYgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF84ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzkgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTU3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMSAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5MzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEyICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODc5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MjlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE1ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NjU4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk1MTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE4ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MDMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTg2MzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIxICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjY4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTYxMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMjk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNiAgICAgICAgICAgICAgICAgICAgICAgMC45ODkxMjNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI3ICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MzcwZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yOSAgICAgICAgICAgICAgICAgICAgICAgMC45Njk1NTNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMwICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwMDUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMiAgICAgICAgICAgICAgICAgICAgICAgMC45MTYyOTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMzICAgICAgICAgICAgICAgICAgICAgICAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgICAgICAgICAgICAgICAgICAgICAgIDAuODM5NjQ1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNSAgICAgICAgICAgICAgICAgICAgICAgMC43ODEwMzZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM2ICAgICAgICAgICAgICAgICAgICAgICAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgICAgICAgICAgICAgICAgICAgICAgIDAuNjEwMTA4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOCAgICAgICAgICAgICAgICAgICAgICAgMC40OTcyMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM5ICAgICAgICAgICAgICAgICAgICAgICAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQ3MzUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MSAgICAgICAgICAgICAgICAgICAgICAgMC4xMzg3MjJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQyICAgICAgICAgICAgICAgICAgICAgICAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgICAgICAgICAgICAgICAgICAgICAgIDAuMDE5MjY3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM3NTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ1ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NyAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ4ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF81MCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKaW5kZXggODA5ZDkwNC4uMThiMjc4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwpAQCAtNTcsNyArNTcsMTEwIEBACiAvKiAgQWxwaGEgICAtIHRoZSBmaWx0ZXIgY29lZmZpY2llbnQgUTMxIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgRnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKK3sKIAorICAgIExWTV9VSU5UMzIgIFByb2R1Y3Q7CisgICAgTFZNX0ZMT0FUICBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2ICAgSW50ZXJwb2xhdGVTaG9ydDsKKyAgICBMVk1fRkxPQVQgICBJbnRlcnBvbGF0ZTsKKyAgICBMVk1fVUlOVDE2ICBTaGlmdDsKKyAgICBMVk1fRkxPQVQgICBEaWZmOworICAgIExWTV9GTE9BVCAgVGFibGVbXSA9IHtBTFBIQV9GbG9hdF8wLCAgICAgICAgICAgICAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUwfTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9IFByb2R1Y3QgKyAoKCh0YyAmIDB4MDAwMEZGRkYpICogKExWTV9VSU5UMzIpRnMpID4+IDMpOworCisgICAgaWYgKE51bUNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA+PiAxOyAgIC8qIE1vbm8gdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KKyAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0IDw8IDE7CisgICAgfQorICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CisKKyAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKKyAgICB7CisgICAgICAgIFNoaWZ0Kys7CisgICAgfQorCisgICAgSW50ZXJwb2xhdGVTaG9ydCA9IChMVk1fSU5UMTYpKChQcm9kdWN0ID4+IDE1KSAmIDB4MDAwMDdGRkYpOworICAgIEludGVycG9sYXRlID0gKExWTV9GTE9BVClJbnRlcnBvbGF0ZVNob3J0IC8gMzI3NjguMGY7CisKKyAgICBEaWZmID0gKFRhYmxlW1NoaWZ0XSAtIFRhYmxlW1NoaWZ0ICsgMV0pOworICAgIERpZmYgPSBEaWZmICogSW50ZXJwb2xhdGU7CisgICAgUHJvZHVjdEZsb2F0ID0gVGFibGVbU2hpZnQgKyAxXSArIERpZmY7CisKKyAgICByZXR1cm4gUHJvZHVjdEZsb2F0OworfQorI2Vsc2UKIExWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKQEAgLTE1NCwzICsyNTcsNCBAQAogCiAgICAgcmV0dXJuIFByb2R1Y3Q7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCmluZGV4IGE2ZDdkYjIuLmNkNTc3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwpAQCAtMjUsNyArMjUsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcG9seW5vbWlhbCBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwLDcgKzQwLDQ4IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSBwb2x5bm9taWFsIGV4cGFuc2lvbiBpbiBRMS4zMSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpwQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICBYKQoreworICAgIExWTV9JTlQzMiBpOworICAgIExWTV9GTE9BVCBZLEEsWFRlbXAsVGVtcCxzaWduOwogCisgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZihYID09IC0xLjBmKQorICAgIHsKKyAgICAgICAgVGVtcCA9IC0xOworICAgICAgICBzaWduID0gVGVtcDsKKyAgICAgICAgZm9yKGkgPSAxOyBpIDw9IE47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWSArPSAoKCpwQ29lZmZpY2llbnRzKSAqIHNpZ24pOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworICAgICAgICAgICAgc2lnbiAqPSBUZW1wOworICAgICAgICB9CisKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBYVGVtcCA9IFg7CisgICAgICAgIGZvcihpID0gTi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworCisgICAgICAgICAgICBUZW1wID0gQSAqIFhUZW1wOworICAgICAgICAgICAgWSArPSBUZW1wOworCisgICAgICAgICAgICBUZW1wID0gWFRlbXAgKiBYOworICAgICAgICAgICAgWFRlbXAgPSBUZW1wOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBZOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKQpAQCAtOTMsNCArMTM0LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIFk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKaW5kZXggNmNhMTA3Ny4uODc4NTU5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCkBAIC00NCw3ICs0NCw3IEBACiAvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNyArNTQsMjggQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoZSByZXN1bHQgb2YgdGhlIDEweCBleHBhbnNpb24gaW4gUTguMjQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCisgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICBYKTsKKyAgICByZXR1cm4gWTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQogewogICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCkBAIC03NSw0ICs5Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBYKTsKICAgICByZXR1cm4gWTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCmluZGV4IDJmMWU1OTEuLjllMTRjM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCkBAIC0yNCw3ICsyNCwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSB2YWw7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbHNlCiB2b2lkIExvYWRDb25zdF8zMihjb25zdCBMVk1fSU5UMzIgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCkBAIC0zOSw1ICs1NCw2IEBACiAKICAgICByZXR1cm47CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKaW5kZXggMjYyOTdlNy4uMDJjOTA2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpAQCAtNzcsNCArNzcsNTggQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgKnNyY00sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgdGVtcCxtVmFsLHNWYWw7CisgICAgTFZNX0lOVDE2IGlpOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIG1WYWwgPSAoTFZNX0ZMT0FUKSpzcmNNOworICAgICAgICBzcmNNKys7CisKKyAgICAgICAgc1ZhbCA9IChMVk1fRkxPQVQpKnNyY1M7CisgICAgICAgIHNyY1MrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgLSBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwppbmRleCBmMjhmMzY2Li5lM2ZiNDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwpAQCAtNjQsNyArNjQsNDQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIHNyY3ZhbDsKKyAgICBMVk1fRkxPQVQgVGVtcCxkSW5WYWw7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbCA9ICpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgPSBzcmN2YWwgKiB2YWw7CisKKyAgICAgICAgZEluVmFsICA9IChMVk1fRkxPQVQpKmRzdDsKKyAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCA3M2MyNmVkLi4xNmUzNjdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTMyLDcgKzMyLDcxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQorICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgY29yZSBmdW5jdGlvbiB3b3VsZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfdCAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAqZHN0LApAQCAtOTEsNSArMTU1LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwppbmRleCBjYTg4YjA0Li44NjkyOTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0zNCw3ICszNCw2OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopc3JjLCAoTFZNX0ZMT0FUKilkc3QsIChMVk1fSU5UMTYpKG4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCBwSW5zdGFuY2UtPkN1cnJlbnQsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtOTEsNSArMTUyLDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCAyZTBhMDk5Li42ZmMxYjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCkBAIC0yNiw3ICsyNiw0NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKXBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKHZvaWQgKikmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCh2b2lkICopICZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOworICAgIH0KK30KKyNlbHNlCiB2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKQEAgLTYxLDUgKzk4LDYgQEAKICAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggcEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCmluZGV4IDYwNzA3M2MuLjAwZDU1ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKQEAgLTI2LDYgKzI2LDEwIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUIDAuMDAxMTUyIC8qIDAuMDEgZEIgb24gYSBmdWxsIHNjYWxlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwppbmRleCBjMDllYzBmLi43OTZhMTVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKQEAgLTQ1LDUgKzQ1LDI2IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBzcmMgKz0gKG4gLSAxKTsKKyAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworCisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjLS07CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKaW5kZXggYTVkYzUwZi4uYzc1ODU2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKQEAgLTQ3LDUgKzQ3LDIzIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTXVsdDNzX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgdGVtcDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICgqc3JjKSAqIHZhbDsKKyAgICAgICAgc3JjKys7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCmluZGV4IDczMzQzY2QuLjUxNTZlZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpAQCAtMTE0LDQgKzExNCw1NCBAQAogICAgIH0KIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCkKK3sKIAorICAgIExWTV9GTE9BVCAgICAgICAgICAgIFNhbXBsZTsgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICBTYW1wbGVObzsgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgVGVtcDsKKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcworICAgICAqLworICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47CisgICAgICAgIHBEYXRhSW4rKzsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBjb21wYW5kZXIsIHRoaXMgY29tcHJlc3NlcyB0aGUgc2lnbmFsIGF0IHRoZSBleHBlbnNlIG9mCisgICAgICAgICAqIGhhcm1vbmljIGRpc3RvcnRpb24uIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgY29udHJvbCBieSB0aGUKKyAgICAgICAgICogZ2FpbiBmYWN0b3IKKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOworICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2F2ZSB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAqcERhdGFPdXQgPSBTYW1wbGU7CisgICAgICAgIHBEYXRhT3V0Kys7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwppbmRleCBjOGMxNTI3Li45YzE3YTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDg4IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix5bkxPLHluUk8sdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoQTAgICogKHgobilMIC0geChuLTIpTCAgKSApKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCisgICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCisgICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gICogeW5SICkpICovCisgICAgICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5STz0oIHluUk8gKyB4KG4pUiAgKSovCisgICAgICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSB5bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE4LDQgKzIwMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwppbmRleCA2N2E1NzBiLi5mNzA1Y2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDcgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNiw0ICsxMTcsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDFkNjE0MmMuLjY1NDc1YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM1LDQgKzM1LDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiOWY2NGU2Li5hMzYzMzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNyw3ICsxNywyMyBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CiAKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gcENvZWYtPkc7Cit9CisjZWxzZQogdm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM0LDQgKzUwLDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBlMjA1MGUwLi4xZTMyMDYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMSw2ICsyMSwxNiBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GbG9hdF8KK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0Zsb2F0IDsKKyNlbmRpZgogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYwppbmRleCA4MzYzMjcwLi4yOGZlYTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKQEAgLTI0LDcgKzI0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjE2eHYxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgKmRzdCwKQEAgLTc3LDUgKzc3LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKaW5kZXggZmJkMTMyZS4uZmFjOWRlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0yNCw3ICsyNCw2MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICBpaSxpajsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CiAKKyAgICBpZih2YWwgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgdmFsOyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICogMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGVtcCA+IDEuMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMS4wOworICAgICAgICAgICAgaWYodGVtcCA8IC0xLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IC0xLjA7CisKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbCA8IDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisjZWxzZQogdm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LApAQCAtNzksNSArMTM0LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKaW5kZXggYWMwMzQzZi4uOWE3MjZmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0yOSw2ICsyOSw5IEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIAogI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NCw2ICs2NywxOCBAQAogI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CiAjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKK3sKKyAgICBMVk1fRkxPQVQgICAgZEJfRmxvYXQ7CisgICAgTFZNX0ZMT0FUICAgIExpbkZsb2F0OworCisgICAgZEJfRmxvYXQgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKWRiX2ZpeCAvIDE2LjBmKTsKKyAgICBMaW5GbG9hdCA9IHBvdygxMCwgZEJfRmxvYXQgLyAyMC4wKTsKKworICAgIHJldHVybiBMaW5GbG9hdDsKK30KKyNlbHNlCiBMVk1fSU5UMzIgICBkQl90b19MaW4zMihMVk1fSU5UMTYgICAgZGJfZml4KQogewogICAgIExWTV9JTlQzMiBMaW5fdmFsXzMyOwpAQCAtMTA2LDQgKzEyMSw0IEBACiAKICAgICByZXR1cm4gTGluX3ZhbF8zMjsgIC8qIGZvcm1hdCAxLjE2LjE1ICovCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggZGI2YWFiZS4uOGUwYjczOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0yMDAsNiArMjAwLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0CisjZW5kaWYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTIsNiArMjE2LDEwIEBACiAgICAgTFZFUU5CX0ZTXzMyMDAwID0gNiwKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKKyAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKIApAQCAtMjY4LDYgKzI3Niw3IEBACiB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJhbmRzOwpAQCAtNDYwLDExICs0NjksMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCmluZGV4IGZkZGVkYjkuLmZmNTJiN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpAQCAtMjIsNyArMjIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc3LDYgKzc5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCkBAIC0xNjgsNyArMTcxLDcgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA1LDcgKzIwOCw2NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZpY2llbnRzKQorewogCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfR2FpblRhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIC8qIEFzIG1lbnRpb25lZCBpbiBlZmZlY3RidW5kbGUuaCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgUUZhY3RvciAgICAgPSAoTFZNX0ZMT0FUKXBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yIC8gMTAwLjBmOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4gKyAxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyLEIxLEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIyID0gLTAuNSAqICgyICogUUZhY3RvciAtIEQgKiBUMCkgLyAoMiAqIFFGYWN0b3IgKyBEICogVDApOworICAgIEIxID0gKDAuNSAtIEIyKSAqIGNvcyhUMCk7CisgICAgQTAgPSAoMC41ICsgQjIpIC8gMi4wOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIC8qIGFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBtdWx0aXBsaWVkIHdpdGggMiB0byBtYWtlIHRoZW0gYWxpZ24gd2l0aCBmaXhlZCBwb2ludCB2YWx1ZXMqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gMiAqIEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gMiAqIEIxOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gMiAqIEIyOworICAgIHBDb2VmZmljaWVudHMtPkcgID0gTFZFUU5CX0dhaW5UYWJsZVtHYWluICsgMTVdOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKQpAQCAtMjk2LDMgKzM1OSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA5NTIxMmYyLi5mMGRlYjZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMjUsNyArMjUsMzkgQEAKIC8qIEdhaW4gdGFibGUgZm9yICgxMF4oR2Fpbi8yMCkgLSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjIxNzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MDA0NzRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NzYxMjhmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NDg4MTFmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MTgxNjJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42ODM3NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NDUxODdmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NTMzMTZmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTg4MTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40Mzc2NTlmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNjkwNDNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTIwNTRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDU2NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMDg3NDlmCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIExWRVFOQl9HYWluXzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIExWRVFOQl9HYWluXzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIExWRVFOQl9HYWluXzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfR0FJTlNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTY4NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgyMjE3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTYzOSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgwMDQ3NCAqLwpAQCAtNTgsMTQgKzkwLDMwIEBACiAjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjAxMTg3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3ODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDU3MGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI0ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzOTNmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjYyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxOTZmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE0MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgorI2VuZGlmCisKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9GUkVRU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA3ODUgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDU3MCAqLwpAQCAtNzYsMTQgKzEyNCwzMSBAQAogI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA1MEQgdGFibGUgZm9yIDUwIC8gKCAxICsgR2FpbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS42MjM0MTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy45ODEwNzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTgzODNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45OTUyNjJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40MTI1MzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDBmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfMTAwRFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzk5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuNjIzNDEzICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS4wMTE4NzIgKi8KQEAgLTEwMSw2ICsxNjYsNiBAQAogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjU4OTI1ICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4xMjIwMTggKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAqLwotCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKaW5kZXggMTBlN2Q3NC4uYzI5MGFlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpAQCAtMTQwLDggKzE0MCwxMiBAQAogdm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewotCisjaWZkZWYgSElHSEVSX0ZTCisgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbHNlCiAgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0xNTgsMTEgKzE2MiwxNSBAQAogICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2Vsc2UKICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyIHNldCB0aGUgdHlwZSBvZiBiaXF1YWQgcmVxdWlyZWQKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uOyAgICAgICAgIC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKICAgICAgICAgewogICAgICAgICAgICAgLyoKQEAgLTE3Nyw3ICsxODUsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKICAgICAgICAgfQotCisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBmb3Igb3V0IG9mIHJhbmdlIGZyZXF1ZW5jaWVzCkBAIC0yMzAsNiArMjM4LDI1IEBACiAgICAgICAgIEJpcXVhZFR5cGUgPSBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldOwogICAgICAgICBzd2l0Y2ggIChCaXF1YWRUeXBlKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbHNlCiAgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb246CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CkBAIC0yNjksNiArMjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODgsNyArMzE2LDcgQEAKIC8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQogewogICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CkBAIC0zMDUsOCArMzMzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwogICAgIH0KIH0KKyNlbHNlCit2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCit7CisgICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKIAorICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwogCisgICAgaWYgKE51bVRhcHMgIT0gMCkKKyAgICB7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIH0KK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIyLDkgKzQ2NiwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKICAgICAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAuMGYpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7Ci0KKyNlbmRpZgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICB9CkBAIC00MzIsMTUgKzQ4MCwxOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAxLjBmKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotCiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgICAgIH0KIApAQCAtNDcwLDggKzUyMSwxMyBAQAogICAgICAvKgogICAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAogICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyNlbHNlCiAgICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDB4MDAwMDAwMDApICYmCiAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworI2VuZGlmCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgICAgICBpZiAoQ2FsbEJhY2sgIT0gTFZNX05VTEwpewogICAgICAgICAgICAgQ2FsbEJhY2socEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwgQUxHT1JJVEhNX0VRTkJfSUR8TFZFUU5CX0VWRU5UX0FMR09GRik7CkBAIC00ODUsOSArNTQxLDMgQEAKIAogICAgIHJldHVybiAxOwogfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGUwMWMxYzUuLmRlMWJiYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTk3LDYgKzk3LDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkpOworICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7CisgICAgICAgIC8qIEJpcXVhZCB0eXBlcyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwpAQCAtMTA3LDYgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7ICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOyAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7CkBAIC0xMTcsMTIgKzEzMywyMiBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWRVFOQl9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfQ09FRjsKQEAgLTEzMyw4ICsxNTksMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CkBAIC0yNDgsOCArMjgwLDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAKIAogCkBAIC0yNTksOSArMjk4LDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyNlbHNlCiAgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwogICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisjZW5kaWYKICAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwpAQCAtMjc5LDggKzMyNCwxMyBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fSU5UMTYgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwpAQCAtMzA4LDE1ICszNTgsMjIgQEAKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKIAorCiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgMS4wZik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9NQVhJTlRfMTYpOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fRlNfODAwMCwyKTsKKyNlbmRpZgogCiAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgID0gTFZNX0ZBTFNFOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggOWRmOTgwYy4uNTZiMDJlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtNjAsNiArNjAsOSBAQAogLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0ID0gLTEsCisjZW5kaWYKICAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uID0gMCwKICAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uID0gMSwKICAgICBMVkVRTkJfT3V0T2ZSYW5nZSAgICAgID0gMiwKQEAgLTg0LDExICs4NywyMCBAQAogICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcEVRTkJfVGFwc19GbG9hdDsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQ7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZWxzZQogICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgICAgICAqcEVRTkJfVGFwczsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGU7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZW5kaWYKIAogICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwpAQCAtOTYsNyArMTA4LDEyIEBACiAgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgICAgICAgICAqcEJpcXVhZFR5cGU7ICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIAogICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICBCeXBhc3NNaXhlcjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB1c2VkIGluIHRyYW5zaXRpb25zICovCisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KIAogfSBMVkVRTkJfSW5zdGFuY2VfdDsKQEAgLTExNCw3ICsxMzEsMTEgQEAKIHZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlKTsKIAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICpwSW5zdGFuY2UpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CkBAIC0xMjIsNiArMTQzLDcgQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworI2VuZGlmCiAKIExWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkICpwR2VuZXJhbFB1cnBvc2UsIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDU4ZjU4ZWQuLjYzMjgxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTU3LDcgKzU3LDEyMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworCisKKyAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLworICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKKyAgICB9CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKworICAgIC8qCisgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKKyAgICAgICAgICovCisKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQorI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMTk4LDMgKzMxMiw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwppbmRleCA4ZTJlMGU4Li41NjMxODFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpAQCAtMzYsNiArMzYsMjAgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCit9OworI2Vsc2UKIGNvbnN0IExWTV9VSU5UMTYgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCkBAIC00NCw4ICs1OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAKK307CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01Niw2ICs3MSwyMiBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCkBAIC02NSwxMCArOTYsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMH07ICAgIC8qIDQ4a1MvcyAqLworI2VuZGlmCiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfR2FpblRhYmxlW10gPSB7TFZFUU5CX0dhaW5fTmVnMTVfZEIsICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMF9kQiwgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8zX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl82X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl85X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKQEAgLTEwMSwxMCArMTY2LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCi0KKyNlbmRpZgogLyoKICAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCkBAIC0xMjIsNyArMjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KIAotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCmluZGV4IDI4ZTMzNjkuLjljMmUyOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtMTA3LDggKzEwNywxNCBAQAogCiAgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbHNlCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFQ2MDsgICAgICAgICAgICAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQsIGluIG1zICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERlbnNpdHk7ICAgICAgICAgICAgICAgIC8qIEVjaG8gZGVuc2l0eSwgMCB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBkZW5zaXR5ICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERhbXBpbmc7ICAgICAgICAgICAgICAgIC8qIERhbXBpbmcgKi8KQEAgLTI5NywxMSArMzAzLDE3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwppbmRleCBhYzJlZjlkLi5lNzEwODQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCkBAIC00MSw2ICs0MSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSkKIHsKIApAQCAtNTkzLDggKzU5NCw1ODkgQEAKIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQorI2Vsc2UgLyogQlVJTERfRkxPQVQqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCit7CisKKyAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKKyAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOwogCiAKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fRk9fSFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgIENvZWZmcy5BMSA9IDA7CisgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7CisgICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKworICAgICAgICAgICAgICAgIFRlbXAxPShMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX1VJTlQzMikoVGVtcDEgKiBTY2FsZVRhYmxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKKyNlbHNlCisgICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyA0ODAwMDsKKyNlbmRpZgorICAgICAgICAgICAgcFByaXZhdGUtPkRlbGF5X0FQW2ldID0gcFByaXZhdGUtPlRbaV0gLSBUZW1wOworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIHRhcCBzZWxlY3Rpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEIgdG8gdGFwIEEgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDEuMGY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDE7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIExpbWl0IHRoZSBtYXhpbXVtIGJsb2NrIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7CisgICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EYW1waW5nKSAgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fSU5UMzIgICAgICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBpOworICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgICAgICAgICAgQ29lZmZzLkExID0gMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1tpXSwgJkNvZWZmcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIEFsbC1wYXNzIGZpbHRlciBtaXhlciB0aW1lIGNvbnN0YW50cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgIExWTV9GTE9BVCAgIEFscGhhOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKKworICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgQWxwaGFUYXAgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEFQX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSAgICAgICA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhICAgID0gQWxwaGE7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdbNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBHWzNdID0gMDsKKyAgICAgICAgICAgIEdbMl0gPSAwOworICAgICAgICAgICAgR1sxXSA9IDA7CisgICAgICAgICAgICBHWzBdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAxOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDI7CisgICAgICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOworICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcEc7CisgICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgICAgICBMVk1fRkxPQVQgSW5kZXhfRkxPQVQ7CisgICAgICAgIExWTV9JTlQzMiBpPTA7CisgICAgICAgIExWTV9GTE9BVCBHYWluPTA7CisgICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZT0wOworICAgICAgICBMVk1fRkxPQVQgVDYwOworICAgICAgICBMVk1fRkxPQVQgQ29lZnNbNV07CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplOworICAgICAgICB9CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRha2UgdGFibGUgdmFsdWVzIGlmIHRoZSByb29tIHNpemUgaXMgaW4gdGFibGUgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisgICAgICAgICAgICBHYWluID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLworCisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsR2FpbjI7CisgICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKKworICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKKworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKworICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworCisgICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisKKyAgICAgICAgICAgIC8qIExpbmVhciBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiAqLworICAgICAgICAgICAgR2FpbiA9IEdhaW4xICsgKCgoR2FpbjIgLSBHYWluMSkgKiBEaXN0KSAvIChUb3RfRGlzdCkpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQorICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKKyAgICAgICAgICovCisgICAgICAgIGlmKEdhaW4gPCAxKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgPSBiOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uVGFyZ2V0ID0gYjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50CisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpICAgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLworICAgICAgICBMVk1fRkxPQVQgICAgQWxwaGE7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uQWxwaGEgPSBBbHBoYTsKKworICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQllQQVNTTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCBOdW1DaGFubmVscyk7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKKyAgICB7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMC4wMzEyNWY7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCisgICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zOworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlOworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBmbGFnCisgICAgICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKKyAgICB9CisKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKaW5kZXggNmJiMWU4OC4uOTQ5MTAxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCkBAIC02MSwxNiArNjEsMjYgQEAKICAgICAgKiBDbGVhciBhbGwgZmlsdGVyIHRhcCBkYXRhLCBkZWxheS1saW5lcyBhbmQgb3RoZXIgc2lnbmFsIHJlbGF0ZWQgZGF0YQogICAgICAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgMik7CisjZWxzZQogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwotCisjZW5kaWYKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CkBAIC04MCwyNCArOTAsNDYgQEAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMl9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KIAogICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9CiAKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMSkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KLQogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYwppbmRleCBmZmE1MTM4Li4zMzY2YmNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKQEAgLTEwOCwxMSArMTA4LDI5IEBACiAgICAgLyoKICAgICAgKiBaZXJvIGFsbCBtZW1vcnkgcmVnaW9ucwogICAgICAqLwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworI2Vsc2UKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwpAQCAtMTQ2LDcgKzE2NCw3IEBACiAgICAgICogU2V0IHRoZSBkYXRhLCBjb2VmZmljaWVudCBhbmQgdGVtcG9yYXJ5IG1lbW9yeSBwb2ludGVycwogICAgICAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBkYXRhIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKQEAgLTE5MCw3ICsyMDgsNjcgQEAKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwogICAgIH0KKyNlbHNlCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKIAorICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKyNlbmRpZgogICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCiAgICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKICAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwpAQCAtMjAwLDEwICsyNzgsMTkgQEAKIAogCiAgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCiAgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLwogICAgIExvYWRDb25zdF8zMigwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplKjIpKTsKLQorI2Vsc2UKKyAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSAqIDIpKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKQEAgLTI1Miw5ICszMzksMTMgQEAKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAweDAzZmZmZmZmOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKLQorI2Vsc2UKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKQEAgLTI3Nyw3ICszNjgsMTEgQEAKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKKyNlbHNlCisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDE7CisjZW5kaWYKICAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYwppbmRleCAyMDEyNDMyLi5mNmQ0NDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKQEAgLTE2MSwyMSArMTYxLDM3IEBACiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7CkBAIC0xOTUsMTQgKzIxMSwyNSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBUZW1wb3JhcnkgZmFzdCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyKnNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwotCisjZWxzZQorICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTAsNyArMjM3LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxOCw3ICsyNTAsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTwxOyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZiZmE0MzcuLmZmNzQ3NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTQyLDE2ICs0MiwyNyBAQAogLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogR2VuZXJhbCAqLwogI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAgICAgICAgICAgICAgIDIzMTcwICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgMTcxNzk4NjkgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KICNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgODE5MiAgICAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAgICAgICAgICAgMTU4Mzc2OTE5MEwgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCiAjZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAgICAweDVBODIgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2Vsc2UKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAwLjcwNzEwN2YgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAgICAwLjAwOGYgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KKyNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgMC4yNWYgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLworI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgICAgICAgICAgMi45ZiAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgIDAuNzA3OTQ1N2YgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2VuZGlmCiAKIC8qIEludGVuYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgMzI3NjgKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgICA0MzEyNQogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgIDU2NzU1CkBAIC02MSwxNCArNzIsNDcgQEAKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgICAyNDg5OCAgICAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAgMTg5MTkgICAgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgIDE0Mzc1ICAgICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZWxzZS8qQlVJTERfRkxPQVQqLworI2RlZmluZSBMVlJFVl9UNjBfU0NBTEUgICAgICAgICAgICAgICAgMC4wMDAxNDJmICAgICAgICAgICAvKigxLzcwMDApICovCisKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAgICAgMS4wZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgMS4zMTYwNzRmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAxLjczMjA1MWYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAgICAgICAgIDIuMjc5NTA3ZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgICAgICAxLjBmICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgIDAuNzU5ODM2ZiAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAwLjU3NzM1MGYgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgMC40Mzg2OTFmICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAgMzMyNiAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICAgNDM3NyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAgMTY4NSAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAgMjIxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAgMzg0MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2Vsc2UKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAxMDEwOAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDEzMzA0CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgMTc1MDgKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAyMzA0MAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICA2NzQwCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDg4NzIKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAxMTY3MgorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDE1MzYwCisjZW5kaWYKKwogI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDICAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgZGVseSB0YXAgY2hhbmdlICovCkBAIC03Niw3ICsxMjAsMTIgQEAKICNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCAgICAgICAgICAgICAgNSAgICAgICAgICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLwogCiAvKiBQYXJhbWV0ZXIgbGltaXRzICovCisjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2Vsc2UKKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNlbmRpZgorCiAjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KICNkZWZpbmUgTFZSRVZfTUFYX0xFVkVMICAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBsZXZlbCwgMTAwJSAqLwogI2RlZmluZSBMVlJFVl9NSU5fTFBGX0NPUk5FUiAgICAgICAgICAgICAgIDUwICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCkBAIC05NSw2ICsxNDQsNyBAQAogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTE2MSw3ICsyMTEsODEgQEAKIAogfSBMVlJFVl9JbnN0YW5jZV9zdDsKIAorI2Vsc2UgLyogQlVJTERfRkxPQVQgKi8KIAorLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBIUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgTFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgUmV2TFBUYXBzWzRdOyAgICAgICAgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIHRhcHMgKi8KKworfSBMVlJFVl9GYXN0RGF0YV9zdDsKKworCisvKiBGYXN0IGNvZWZmaWNpZW50IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEhQQ29lZnM7ICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIExQQ29lZnM7ICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2TFBDb2Vmc1s0XTsgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIGNvZWZmaWNpZW50cyAqLworCit9IExWUkVWX0Zhc3RDb2VmX3N0OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiB0aW1lIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICBNZW1vcnlUYWJsZTsgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyBmcm9tIHRoZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIG5ldyBwYXJhbWV0ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUgKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRmlyc3RDb250cm9sOyAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1peCBsZXZlbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgUm9vbVNpemVJbm1zOyAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGZvciBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworCisgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KKyAgICBMVlJFVl9GYXN0RGF0YV9zdCAgICAgICAqcEZhc3REYXRhOyAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2hEZWxheUxpbmVbNF07ICAgIC8qIERlbGF5IGxpbmUgc2NyYXRjaCBtZW1vcnkgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbmcqLworCisgICAgLyogRmVlZGJhY2sgbWF0cml4ICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgRmVlZGJhY2tNaXhlcls0XTsgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCisKKworICAgIC8qIEFsbC1QYXNzIEZpbHRlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFRbNF07ICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byBkZWxheSBidWZmZXJzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgRGVsYXlfQVBbNF07ICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gQVAgZGVsYXkgYnVmZmVyIHN0YXJ0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQUJfU2VsZWN0aW9uOyAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBBIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQl9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBCIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRBWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQiBkZWxheSB0YXAgKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9BUFRhcHNbNF07ICAgICAgICAgIC8qIFNtb290aGVkIEFQIGRlbGF5IG1peGVyICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkYmFja1s0XTsgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgIC8qIFNtb290aGVkIEFQIGZlZWRmb3J3YXJkIGdhaW4gKi8KKworICAgIC8qIE91dHB1dCBnYWluICovCisgICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBEcnkvd2V0IG1peGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIHNpZ25hbCBwb3dlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEdhaW5NaXhlcjsgICAgICAgICAgICAgICAgLyogR2FpbiBzbW9vdGhpbmcgKi8KKworfSBMVlJFVl9JbnN0YW5jZV9zdDsKKworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjksMTIgKzI5MywxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExWUkVWX1JldHVyblN0YXR1c19lbiAgIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fSU5UMzIgICAgICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQgICAgICAgKnBDYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIEdlbmVyYWxQdXJwb3NlICk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNWM3YThhMC4uNTY2ZDg0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNDYsMTQgKzQ2LDI2IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2Vsc2UKIExWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2VuZGlmCiB7CiAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworI2Vsc2UKICAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fSU5UMzIgKilwSW5EYXRhOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisjZW5kaWYKICAgIExWTV9JTlQzMiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgIGZvcm1hdCA9IDE7CiAKQEAgLTEwNSw3ICsxMTcsNyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGNvbnZlcnQgdG8gc3RlcmVvIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKICAgICAgICAgICAgICAgICBNb25vVG8ySV8zMihwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTExMyw2ICsxMjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAyKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8peworICAgICAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTQzLDkgKzE2NCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgUmV2ZXJiQmxvY2socElucHV0LCBwT3V0cHV0LCBwTFZSRVZfUHJpdmF0ZSwgKExWTV9VSU5UMTYpU2FtcGxlc1RvUHJvY2Vzcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOworICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyNlbHNlCiAgICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CkBAIC0xNzUsNyArMjAwLDcgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBSZXZlcmJCbG9jayhMVk1fSU5UMzIgKnBJbnB1dCwgTFZNX0lOVDMyICpwT3V0cHV0LCBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKICAgICBMVk1fSU5UMTYgICBqLCBzaXplOwpAQCAtNDc5LDcgKzUwNCwzMjIgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbHNlCit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQoreworICAgIExWTV9JTlQxNiAgIGosIHNpemU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBJbjsKKyAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKKyAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgorICAgICAqIHRoZW4gYmUgbWl4ZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gY3JlYXRlIHRoZSBmaW5hbCBvdXRwdXQuICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogV2hlbiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQgdGhpcyBtdXN0IGJlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgICAgKgorICAgICAqIGhlbmNlIHRoaXMgaXMgdGhlIHdvcnN0IGNhc2UsIHNvIGZvciBzaW1wbGljaXR5IHRoaXMgd2lsbCBBTFdBWVMgYmUgc28gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bnRvdWNoZWQgdW50aWwgdGhlIG91dHB1dCBvZiB0aGUgbWl4ZXIgaWYgICAgKgorICAgICAqIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIHRlbXAgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE51bVNhbXBsZXMgaW4gc2l6ZSByZWdhcmRsZXNzIG9mIE1PTk8gb3IgICAgKgorICAgICAqIFNURVJFTyBpbnB1dC4gSW4gdGhlIGNhc2Ugb2Ygc3RlcmVvIGlucHV0IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gTU9OTyAgICoKKyAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBwSW4gPSBwVGVtcDsKKyAgICB9CisKKyAgICBNdWx0M3NfRmxvYXQocEluLAorICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAorICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgIC8qCisgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgCisgICAgLyoKKyAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKKyAgICAgKi8KKworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKyAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKKyAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCisgICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBBcHBseSByb3RhdGlvbiBtYXRyaXggYW5kIGRlbGF5IHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKKyAgICB7CisKKyAgICAgICAgQ29weV9GbG9hdChwVGVtcCwKKyAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworICAgICAgICAvKgorICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICBTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBEZWxheSBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICB9CiAKIAorICAgIC8qCisgICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0CisgICAgICovCisgICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCisgICAgeworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6CisKKyAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworCisgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKKyAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvKgorICAgICAqICBEcnkvd2V0IG1peGVyCisgICAgICovCisKKyAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKKyAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgLyogQXBwbHkgR2FpbiovCisKKyAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyogRW5kIG9mIGZpbGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKaW5kZXggZjU4OTVhNy4uYTcxOTA1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC02MSwxMCArNjEsMTUgQEAKICAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KICAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgICAgKAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8Ci0gICAgICAgICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCmluZGV4IDVhNmQ0M2QuLmIzZWRjNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiBMVk1fRnNUYWJsZVtdID0gewogICAgIDgwMDAgLAogICAgIDExMDI1LApAQCAtNDAsMTQgKzQxLDM3IEBACiAgICAgNDQxMDAsCiAgICAgNDgwMDAKIH07Ci0KKyNlbHNlCitjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7CisgICAgODAwMCAsCisgICAgMTEwMjUsCisgICAgMTIwMDAsCisgICAgMTYwMDAsCisgICAgMjIwNTAsCisgICAgMjQwMDAsCisgICAgMzIwMDAsCisgICAgNDQxMDAsCisgICAgNDgwMDAsCisgICAgOTYwMDAsCisgICAgMTkyMDAwCit9OworI2VuZGlmCiAvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiBMVk1fVUlOVDE2IExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CiAgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfNDgwMDApCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7CiB9CisjZWxzZQorTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKK30KKyNlbmRpZgogCiAvKiBJbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0YW50IGlucHV0IGFuZCBvdXQgcHV0IHNpZ25hbCBzdHJlbmd0aHMKICAgIG91dHB1dCBnYWluL2F0dGVudWF0aW9uIGlzIGFwcGxpZWQuIFRoaXMgZ2FpbiBkZXBlbmRzIG9uIFQ2MCBhbmQgUm9vbXMKQEAgLTY5LDYgKzkzLDcgQEAKICAgKi8KIAogLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxNzU0NzQzNCwxMjg4Njc0MzQsLTEyMDk4ODg5Niw1MDc2MTIyOCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxODI1Njg2OSwxNzI2NjY5MDIsLTE5MzE2OTI5Miw4ODM0NTc0NCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywxNjU5MTMxMSwxMzkyNTAxNTEsLTE0OTY2NzIzNCw2Njc3MDA1OSx9LApAQCAtOTQsNiArMTE5LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwxNjAwMzMyMiw0ODMyMzY2MSwtMzU2MDczNzgsMTMxNTM4NzIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwxNTk1NTIyMyw0ODU1ODIwMSwtMzM3MDY4NjUsMTE3MTU3OTIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQorI2Vsc2UKK2NvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMS4wNDU5MDlmLDcuNjgxMDk4ZiwtNy4yMTE1MDBmLDMuMDI1NjA1Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxLjA4ODE5NGYsMTAuMjkxNzQ5ZiwtMTEuNTEzNzg3Ziw1LjI2NTgxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMC45ODg5MTlmLDguMjk5OTU2ZiwtOC45MjA4NjJmLDMuOTc5ODA2Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxLjAzNTkyN2YsMTAuMTgyNTY3ZiwtMTAuMzQ2MTM0Ziw0LjU0NjUzM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUsMS4xMzAzMTNmLDEyLjUzODcyN2YsLTEzLjYyNzAyM2YsNi4xNjUyMDhmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LDEuMDYwNzQzZiw4LjA5MTcxM2YsLTguNTg4MDc5ZiwzLjgzNDIzMGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMS4wNDAzODFmLDEwLjQwNjU2NmYsLTExLjE3NjY1MGYsNS4wNzUxMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4LDEuMDI2OTQ0Ziw4LjM4NzMwMmYsLTguNjg5Nzk2ZiwzLjg5NTg2M2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMS4wMTMzMTJmLDkuNzI3MjM2ZiwtMTAuNTM0MTY1Ziw0Ljc0MjI3MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDAuOTk2MDk1Ziw4LjQ5MjI0OWYsLTcuOTQ3Njc3ZiwzLjQ3ODkxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEzLDEuMDc5MzQ2Ziw4Ljg5NDQyNWYsLTkuNjQxNzY4Ziw0LjQzNDQ0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE1LDAuOTk0MzI3Ziw3LjQ0MTMzNWYsLTguMDAzOTc5ZiwzLjU4MTE3N2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDAuOTkxMDY3Ziw3LjIwODM3M2YsLTcuMjU3ODU5ZiwzLjE2Nzc3NGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIwLDEuMDMzNDQ1Ziw3LjQ3NjM3MWYsLTcuNTQ2OTYwZiwzLjM2OTcwM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI1LDAuOTgyODMwZiw1LjkxMzg2N2YsLTUuNjM4NDQ4ZiwyLjQyMDkzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwLDAuOTI4NzgyZiw1LjAzNTM0M2YsLTQuNDkyMTA0ZiwxLjg0NDkwNGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDAuOTUzNzE0Ziw1LjA2MDIzMmYsLTQuNDcyMjA0ZiwxLjgyOTY0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUwLDAuODk5MjU4Ziw0LjI3MzM1N2YsLTMuNTM3NDkyZiwxLjM4NzU3NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYwLDAuOTQzNTg0Ziw0LjA5MzIyOGYsLTMuNDY5NjU4ZiwxLjQxMDkxMWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDAuOTI2MDIxZiwzLjk3MzEyNWYsLTMuMzMxOTg1ZiwxLjM0NDY5MGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezc1LDAuODk0ODUzZiwyLjg3MTc0N2YsLTEuNDM4NzU4ZiwwLjMxMTg1NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDAuOTM1MTIyZiwyLjk5MTg1N2YsLTIuMDM4ODgyZiwwLjY4NjM5NWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezkwLDAuOTUzODcyZiwyLjg4MDMxNWYsLTIuMTIyMzY1ZiwwLjc4NDAzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwwLjk1MTAwNWYsMi44OTQyOTRmLC0yLjAwOTA4NmYsMC42OTgzMTZmLH0sCit9OworI2VuZGlmCiAvKiBFbmQgb2YgZmlsZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCmluZGV4IDVmOTkzYmQuLjA2NTgxODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCkBAIC0zNywxMCArMzcsMTkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgSElHSEVSX0ZTCiBleHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKIGV4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOwotZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiBjb25zdCAgICBMVk1fVUlOVDMyICBMVk1fRnNUYWJsZVtdOworZXh0ZXJuICAgICAgICAgIExWTV9VSU5UMzIgIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiAgICAgICAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKaW5kZXggYTY3NWNiMi4uMjAzOGZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTIxNiwxMSArMjE2LDE3IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOworI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCmluZGV4IGNkNWY2OWMuLmY2YzRlYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsMTUgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKQEAgLTM5LDcgKzQ4LDcgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWZmaWNpZW50cyk7Ci0KKyNlbmRpZgogTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKIApAQCAtMTc5LDcgKzE4OCwxMSBAQAogICAgIExWTV9VSU5UMTYgRnJlcTsKICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisjZW5kaWYKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKIAogCkBAIC0yNjcsOCArMjgwLDExIEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKIHsKLQorI2lmbmRlZiBISUdIRVJfRlMKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZWxzZQorICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0zNDIsMjYgKzM1OCw0MiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKQEAgLTM3NCw5ICs0MDYsMjYgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQwOSwxOCArNDU4LDMxIEBACiB7CiAgICAgTFZNX1VJTlQxNiAgICAgaWk7CiAgICAgTFZNX0ZzX2VuICAgICAgRnMgPSBwUGFyYW1zLT5GczsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBRUERfQzMyX0NvZWZzICAqcENvZWZmaWNpZW50czsKICAgICBleHRlcm4gICAgICAgICBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXTsKIAotCiAgICAgcENvZWZmaWNpZW50cyA9ICZMVlBTQV9RUERfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CisjZWxzZQorICAgIFFQRF9GTE9BVF9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworI2VuZGlmCiAKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQogICAgIHsKLSAgICAgICAgICAgIExWUFNBX1FQRF9Jbml0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZWxzZQorICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZQU0FfT0spOwpAQCAtNDYwLDYgKzUyMiw4NyBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ09TX1QwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOworICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CisgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvcyArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNgorICAgICAqLworICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gVDAgOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDT1NfVDAgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiAgICA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgID0gKGZhY3RvciAqIHQwKSA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAgICAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMCAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCkBAIC01NDEsNyArNjg0LDcgQEAKIAogICAgIHJldHVybihMVlBTQV9PSyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTg0LDYgKzcyNyw5MCBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CisgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKKyAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgZXJyb3IgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0CisgICAgICovCisgICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICB0MCA9IFQwOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENvc0VyciArPSBmYWN0b3IgKiBjb2VmOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gQjEgKiBDb3NFcnIgOyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KKyAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKQpAQCAtNjY2LDcgKzg5Myw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5MCwxMSArOTE3LDE3IEBACiAKICAgICAvKiBCYW5kIFBhc3MgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cEJQX1RhcHM7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKyNlbHNlCiAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCk7IGkrKykKICAgICB7CiAgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKICAgICB9Ci0KKyNlbmRpZgogICAgIC8qIFF1YXNpLXBlYWsgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cFFQRF9UYXBzOwogICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCk7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCmluZGV4IDI3YTRiYzMuLjFjMjY4NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpAQCAtNDcsNyArNDcsMTEgQEAKICAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICAgKnBMVlBTQV9JbnN0OwogICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBlcnJvckNvZGUgICAgICAgPSBMVlBTQV9PSzsKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgaWk7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgICAgIExWUFNBX0dhaW5UYWJsZVtdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgICAgICAgICAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CisjZW5kaWYKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gMDsKIAogICAgIC8qIEludHNfQWxsb2MgaW5zdGFuY2VzLCBuZWVkZWQgZm9yIG1lbW9yeSBhbGlnbm1lbnQgbWFuYWdlbWVudCAqLwpAQCAtMTQxLDE5ICsxNDUsMzcgQEAKIAogCiAgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UMTYpICk7CisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7CiAgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOworICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOwogCisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOworI2VuZGlmCiAKICAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLwogICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKQEAgLTE2NCw3ICsxODYsMTIgQEAKICAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPShMVk1fVUlOVDE2KSBMVlBTQV9HYWluVGFibGVbcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiArIDE1XTsKKyNlbHNlCisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9IExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2Fpbl07CisjZW5kaWYKICAgICB9CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKaW5kZXggMDk4NGIxMC4uMDZhOGY5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwpAQCAtMTA2LDcgKzEwNiwxMSBAQAogICAgICAgICAgKi8KIAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworI2VuZGlmCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogCiAgICAgICAgIHsKQEAgLTEzNCw3ICsxMzgsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9JTlQxNikgKTsKKyNlbHNlCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE0Miw4ICsxNTAsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBjb2VmZmljaWVudHMgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1N0YXRlX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE1MSw4ICsxNjQsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBkYXRhIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkRhdGEpOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggMDM1MjJmYi4uYTc1MGJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC00Myw4ICs0MywxMSBAQAogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiovCisjZWxzZQorI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNlbmRpZgogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAjZGVmaW5lIExWUFNBX01BWEJVRkZFUkRVUkFUSU9OICAgICAgICAgIDQwMDAgICAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtcyBvZiB0aGUgbGV2ZWxzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05MywxMiArOTYsMjcgQEAKICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CiAKICAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqcEJQRmlsdGVyc1ByZWNpc2lvbjsgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgKi8KICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAqcEJQX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgKi8KICAgICBRUERfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgKi8KICAgICBRUERfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKyNlbHNlCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBCUF9UYXBzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgKi8KKyAgICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsKKyNlbmRpZgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisjZWxzZQorICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7CisjZW5kaWYKICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwppbmRleCA5ZTI5ZjY4Li5lYTVmNzRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKQEAgLTQzLDYgKzQzLDk2IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKKworeworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENIRUNLIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKKyAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQUk9DRVNTIFNBTVBMRVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCisgICAgQ29weV9GbG9hdChwTFZQU0FfSW5wdXRTYW1wbGVzLCBwU2NyYXRjaCwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgU2hpZnRfU2F0X0Zsb2F0KC0xLCBwU2NyYXRjaCwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICBzd2l0Y2gocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICAgKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWkpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBVUERBVEUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKEF1ZGlvVGltZSArIChMVk1fSU5UMzIpKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50KjEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KQorICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLApAQCAtMTMwLDcgKzIyMCw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKaW5kZXggODM2YmZkNy4uOTlkODQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApAQCAtMzEsNiArMzEsMTUgQEAKICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfVFQRF9GTE9BVF9TdGF0ZV90LCAqcFFQRF9GTE9BVF9TdGF0ZV90OworI2VuZGlmCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCkBAIC0zOCwxMiArNDcsMzAgQEAKIAogfSBRUERfQzMyX0NvZWZzLCAqUFFQRF9DMzJfQ29lZnM7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KKyAgICBMVk1fRkxPQVQgS007ICAgIC8qc2hvdWxkIHN0b3JlIGIyKi8KKworfSBRUERfRkxPQVRfQ29lZnMsICpQUVBEX0ZMT0FUX0NvZWZzOworI2VuZGlmCisKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsxXTsKIAogfSBRUERfVGFwc190LCAqcFFQRF9UYXBzX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsxXTsKKworfSBRUERfRkxPQVRfVGFwc190LCAqcFFQRF9GTE9BVF9UYXBzX3Q7CisKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNiArODksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgwLDggKzExMywxMiBAQAogdm9pZCBMVlBTQV9RUERfSW5pdCAoICAgUVBEX1N0YXRlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9UYXBzX3QgICAgICAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgICpwQ29lZiAgICAgKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAogCi0KK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAqcENvZWYgICAgICk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCmluZGV4IDUwZTBhODAuLjJjYzMyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC00MCwzICs0MCwxNCBAQAogICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9IHBDb2VmLT5LUDsKICAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSBwQ29lZi0+S007CiB9CisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgcFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgICpwQ29lZiAgICAgKQoreworICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LTSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKaW5kZXggNjcxOTdjMS4uZTIzMzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKQEAgLTM1LDEyICszNSwxNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBWYWx1ZSAgICk7CiAKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKTsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNiArNTgsNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLApAQCAtMTczLDcgKzE3OCwxMzEgQEAKICAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7CiAgICAgfQogfQorI2Vsc2UKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKK3sKIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfRkxPQVRfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfRkxPQVRfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOworCisgICAgLyogUG9pbnRlciB0byB0YXBzICovCisgICAgTFZNX0ZMT0FUKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7CisKKyAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgICBYMDsKKyAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOworICAgIExWTV9GTE9BVCAgIGFjY3U7CisgICAgTFZNX0ZMT0FUICAgWGcwOworICAgIExWTV9GTE9BVCAgIEQwOworICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CisKKyAgICAvKiBGaWx0ZXIncyBjb2VmICovCisgICAgTFZNX0ZMT0FUICAgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOworICAgIExWTV9GTE9BVCAgIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKKworICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKworICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBJTklUSUFMSVpBVElPTgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLworICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKKyAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKKworICAgIHdoaWxlIChpaSA+IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KKyAgICAgICAgLyogLSAxIHRvIGNvbXBlbnNhdGUgc2NhbGluZyBpbiBwcm9jZXNzIGZ1bmN0aW9uKi8KKyAgICAgICAgWDAgPSAoKnBJblNhbXBzKSAqIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW0JhbmRJbmRleF07CisgICAgICAgIHBJblNhbXBzID0gcEluU2FtcHMgKyBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgLyogU2F0dXJhdGUgYW5kIHRha2UgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgaWYoWDAgPCAwLjBmKQorICAgICAgICAgICAgWDAgPSAtWDA7CisgICAgICAgIGlmIChYMCA+IDEuMGYpCisgICAgICAgICAgICBYZzAgPSAxLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBYZzAgPVgwOworCisKKyAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgRDAgID0gWGcwIC0gVjA7CisKKyAgICAgICAgdGVtcDIgPSBEMDsKKworICAgICAgICBhY2N1ID0gdGVtcDIgKiBLcDsKKyAgICAgICAgRDAgICAgPSBEMCAvIDIuMGY7CisgICAgICAgIGlmIChEMCA8IDAuMGYpeworICAgICAgICAgICAgRDAgPSAtRDA7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wMiA9IEQwOworCisgICAgICAgIHRlbXAgPSBEMCAqIEttOworICAgICAgICBhY2N1ICs9IHRlbXAgKyBYZzA7CisKKyAgICAgICAgaWYgKGFjY3UgPiAxLjBmKQorICAgICAgICAgICAgYWNjdSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYoYWNjdSA8IDAuMGYpCisgICAgICAgICAgICBhY2N1ID0gMC4wZjsKKworICAgICAgICBWMCA9IGFjY3U7CisKKyAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOworCisgICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgLT0gcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlOworICAgICAgICAgICAgcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ID0gKExWTV9VSU5UMTYpKG51bVNhbXBsZXMgLSBpaSk7CisgICAgICAgIH0KKyAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ICs9IERvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gRG93blNhbXBsaW5nRmFjdG9yKTsKKworICAgIH0KKworICAgIC8qIFN0b3JlIGxhc3QgdGFwcyBpbiBtZW1vcnkgKi8KKyAgICAqcERlbGF5ID0gVjA7CisKKyAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGFmdGVyIGxhc3QgYmFuZCBwcm9jZXNzaW5nLAorICAgICAgIHVwZGF0ZSB0aGUgcGFyYW1ldGVycy4gKi8KKyAgICBpZihCYW5kSW5kZXggPT0gKHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzIC0gMSkpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCisgICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKKyAgICB9Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwOSw0ICszMzgsMjMgQEAKICAgICAqcHBXcml0ZSA9IHBXcml0ZTsKIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOwogCisgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSAqIDI1Nik7CisgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisgICAgfQorCisgICAgKnBwV3JpdGUgPSBwV3JpdGU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAyMWE1ZDhkLi4xMjg3NTAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKQEAgLTQzLDYgKzQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworI2Vsc2UKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw3ICs3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5fTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCiAKIApAQCAtODQsNyArMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTkyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzg0MCAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDIsNyArMTI2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAvKiAyNDAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAgICAgICAgICAgICAgICAgICAvKiAzMjAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyfTsgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyMiw4ICsxNTEsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyfTsgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW10gPSB7ICAwLjgwNDI4NDdmLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4MzYwNTRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MzYxNzk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDAyMTQyM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5MTc4NzRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjgxMDUxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjAxMDU1OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NTkwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMzQwMzcyZgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNjcwMTg2ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzM1MDkzZiAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyNlbmRpZgogLyoKICAqIEdhaW4gdGFibGUKICAqLwpAQCAtMTU5LDYgKzIxMCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NzZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4MSw3ICsyNjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAzOGYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA5ODZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxOTc3NWYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wODE1MTQ5ZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworI2VuZGlmCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgogICoKQEAgLTIwMSw3ICsyOTMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDgzMTFmLCAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwNjE3OTk5ZiwgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgICAgICAgICAgICAgICAgLyogYTMgKi8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM5LDMgKzMzNyw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdID0geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM1ODMzMzMyMTI4ODIzZiwwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMzY4NjYzMzU5NDMzNGYsMC4wMDY1MjIxNjcwMDgzNzAyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzA5NTgxMzUzMzI5MTIyZiwwLjIzMzE1NjgyMjYyMTgyMjRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCAwZDYyMjc0Li5lNzU2OTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMzc0LDEyICszNzQsMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwppbmRleCAzZTQ4YzdlLi4yOWUzYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCkBAIC03MCwxMSArNzAsMTcgQEAKIHsKIAogICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7CisjZW5kaWYKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX0J5cGFzc01peF90ICAgICpwQ29uZmlnICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudDsKKwogCiAKICAgICAvKgpAQCAtODUsNyArOTEsMTEgQEAKICAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KICAgICAgICAgKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IHBQYXJhbXMtPkVmZmVjdExldmVsOworI2Vsc2UKKyAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9ICgoTFZNX0ZMT0FUKXBQYXJhbXMtPkVmZmVjdExldmVsIC8gMzI3NjcpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMDIsMjMgKzExMiw0NiBAQAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKyNlbHNlCisgICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworI2VuZGlmCiAKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMHg3RkZGIC0gcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwogICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sKExWTV9JTlQzMikoR2FpbiA+PiAxNSksQ3VycmVudCk7CiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDEuMCAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOworICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKKyAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOwpAQCAtMTM0LDcgKzE2Nyw3IEBACiAgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCiAgICAgICovCiAgICAgewotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbkNvcnJlY3Q7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjE7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjI7CkBAIC0xNzIsNiArMjA1LDQzIEBACiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yPj4xNik7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW5Db3JyZWN0OworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4xOworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4yOworCisgICAgICAgIEdhaW4xID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgICAgICBHYWluMiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKKyAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZ2FpbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPk91dHB1dF9TaGlmdCA9IHBDb25maWctPk91dHB1dF9TaGlmdDsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sR2FpbjEpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CkBAIC0yMDYsOSArMjc2LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwVW5wcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQogewogCkBAIC0yMjMsNiArMjk5LDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFVucHJvY2Vzc2VkLApAQCAtMjM2LDYgKzMxMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZWxzZQorICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikgcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAorICAgICAgICAgKi8KKyAgICAgICAgU2hpZnRfU2F0X0Zsb2F0KChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCmluZGV4IGQxZWY3MGEuLmY2OWJhMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKQEAgLTQyLDEyICs0MiwxNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBNaXhlciBzZXR0aW5ncyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLworI2VuZGlmCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KIAogfSBMVkNTX0J5cGFzc01peF90OwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIE91dHB1dCBnYWluIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC01Niw4ICs2MCwxNSBAQAogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLwogfSBHYWluX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCit9IEdhaW5fdDsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY3LDEzICs3OCwxOSBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnVuUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnVuUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYwppbmRleCBjZTZkNDEwLi4zYmY2ZWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKQEAgLTEyMCwxMSArMTIwLDEzIEBACiAgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKICAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAgICAgICAgICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogTFZNX01BWElOVF8xNik7CkBAIC0xNDAsNyArMTQyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgR2FpbjsKKyAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MpOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2Fpbik7CiAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdhaW4gPSAoR2FpbiAqIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluKTsKKworICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCBHYWluKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgICAgIH0KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKaW5kZXggMjViMGQ4Ni4uZWM1MzEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpAQCAtNTMsNyArNTMsNzIgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDEgKyBMVk1fRlNfNDgwMDApKSk7CisgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMTIsNyArMTc3LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMiw3ICsxOTcsMzcgQEAKIC8qICAxLiAgQWx3YXlzIHByb2Nlc3NlcyBpbiBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCkBAIC0xNTcsNCArMjUyLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAppbmRleCBjZjk2ZjViLi4wZTc1NmU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCkBAIC0zMiw4ICszMiwxMSBAQAogLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIHZvaWQgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19FcXVhbGlzZXJfdDsKIAogCkBAIC00NSwxMiArNDgsMTUgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggM2U2NDBjYi4uNGY1MjIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0yNCw3ICsyNCw0NjMgQEAKIC8qIFRoZSBTdGVyZW8gRW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjEyNTggKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyNzcyMAorI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE1MTI1CisjZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkyMTg5OQorI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYxMTQ0MQorI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ0CisjZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMzEwOTcKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYyMjQ3MAorI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTMwNzU5CisjZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2Mjk0MyAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwODM4CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE1NTkKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTQzMDU2CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU3MzcyCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTE0OTAKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NTg4MQorI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODgwNjA4CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzIzOTcKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyOTkzMgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTQzNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0wLjk0NzYxNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU4Mzk4CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTIyMTEKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NjE4NworI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkyNTUwCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzI4NTYKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDYzOAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MjMyCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk2MDU1MAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC40OTk2OTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM1NTU0MworI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTQ0MTUyCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTA3ODgKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NDEwNAorI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDc4MSAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NzQ5CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQxMjgKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTcxMjYyCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDAxMTIKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjEwOTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNzkwMTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMTY3ODYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODI1MDcKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjE4ODIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwMzk1CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNjExNworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczNTczCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTQ3NzAKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg3MTgyCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEyNzU4OAorI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjk2NDgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgyMTc3CisjZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwMzIyICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg0MDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNTIxNAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC45ODAxMjYKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzY0NTc5CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDczNTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE1NzIyNAorI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjc0MjMxCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTI0OTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM1OTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzEyMjUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODU1NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yODQ1NzMKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yNTg5MTAKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMjU2NjIKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS41NzIyNDgKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41ODgzOTkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM0NDQ1CisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMyMjYxCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg2NzEzCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI3MjYwNgorI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNjY5NTIKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA1NjU0CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjYxNzE0MQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC42MzA0MDUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2lmZGVmIEhJR0hFUl9GUworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KKy8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjM0NDMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTkzMzM0CisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNworI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDE2NzI3CisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjc5MzM3MgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjI0MDY1NgorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTk2NjYxCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKy8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDg5OTEKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjg5MjUwOQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFJldmVyYiBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2ODE3OQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAtMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAtMC43NDkwOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgIC0wLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuODIwNjc5CisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjUxODUxMgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjI5MDk5MAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC40Nzk1NjUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC42Mzc3NDUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIC0wLjE5ODkxMgorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0OQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC45NTA4NzMKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDQ5MTI3CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjk3Mzg5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIwMDQyMworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTY1MjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI3ODY2MQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjI1NDk5MworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMzAzMzQ3CisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNpZmRlZiBISUdIRVJfRlMKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMTYwMjQ4OAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTg1NDEzCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjc3NjU3NjQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjZW5kaWYKKworCisvKiBSZXZlcmIgR2FpbiBTZXR0aW5ncyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gICAgICAgICAgICAgICAwLjgwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAgICAgICAgICAgICAgMS4wMDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4gICAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBQcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4gICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU5DT1JSRUNUICAgICAgICAgICAgIDEuMDA5MzQzICAgICAgICAgLyogRGVsYXkgbWl4ZXIgZ2FpbiBjb3JyZWN0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIEVxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjYzMzEyCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC42MDE3NDgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjI4MDY4MQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC45NDMzNTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMC40NDkzNDUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAtMC4yMDk1OTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAxLjEwMTE0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIDAuMTM5MDIwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC44NjQ0MjMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAwLjAyNDU0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuOTA4OTMwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAwLjk3NjA1OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAtMC42OTUzMjYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTAuMDkwODA5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgIC0wLjYxMDU5NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAtMC4zMTExNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDEuMjc2NjYxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0xLjAxNzUxOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wNDQxMjgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuNzI5NjE2CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0wLjIwNDUzMgorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgMS4wMDcwOTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgLTAuODcxOTEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAwLjAyMzIzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAtMC43NDU4NTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgLTAuMTg5MTcxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDMxMzc4IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcwMTY0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjgxNjI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuMDc1ODcyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDQxMzY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNzI1MjM5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMjI0MzU4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgMS4wODEwOTEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgIC0wLjg2NzE4MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgLTAuMDcwMjQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAtMC41MTUxMjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjQyNTg5MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjA0MTU3NiBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3Nzc3OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4zODg2MDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzA1Nzk5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjAzOTkyMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAtMC43MTk0OTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMjQzMjQ1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMjcyOTEwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzQxMDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMTY3NDYyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNjE0MjE5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMzQ1Mzg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDM0NDk1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcyNDkxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS40MDk4MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgIC0xLjQ1NjUwNgorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTUxNDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC44MDQyMDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC0wLjE2Mzc4MworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMjk5MTk4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAtMS40NTI0NDcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAwLjI0MDQ4OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjY5MzAzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAtMC4yOTQ5ODQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDQ1NTkgYW5kIENTRVggc2NhbGVkIHdpdGggMC43ODAwMDYgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS41NjA5ODgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMS44Nzc3MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4zODk3NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45MDc0MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4wNzA0ODkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAxLjc4NTA0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjMzNDk3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgMC41MjY0MzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjQ0NTkzOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuNTIyNDQ2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgIDEuNjIzOTkzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjcwNzQzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgIDAuNjg4ODI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgLTEuMTE3MTkwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIDAuMTMwMjA4CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDIuMDI4MzE1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgLTIuODgyNDU5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgIDAuOTA0NTM1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgLTAuNTkzMzA4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgLTAuMzg1ODE2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS42NDExNzcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgIC0yLjM2NDY4NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuNzU5OTEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS4xNjY3NzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjE3ODA3NAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgIDIuMDk5NjU1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAtMy4wNjUyMjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAxLjAxMDQxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjM0MDIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAtMC4zNDczMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjAwMTQzNQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuMjI4NDIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS40Nzc4MDQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjQ4MTM2OQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgIDIuNzU3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgLTQuNjcyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgIDEuOTMxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuOTcxNzE4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAtMC4wMjEyMTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjQ1NjE0MAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjU2OTg2NAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjcwMDc5OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjcwMTgyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgMy40MjczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgLTYuMjkzNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAyLjg3MjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAtMS4zMTA3NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgIDAuMzEzMTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZW5kaWYKKworCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMC44NDc3NzM1ICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgIDAuMjA4NzQ2NSAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAwLjU2OTIyNSAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgMC4wNzc5NDQyNSAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2Vsc2UKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjc3MjAgKi8KICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTcwNDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTUxMjUgKi8KQEAgLTM5NCw1ICs4NTAsNiBAQAogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgIDE4NjAwICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLwogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgNTEwOCAgICAgICAgICAgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0KICNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCmluZGV4IDE5MDRlNDYuLmQ0Yzc2MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwpAQCAtOTgsNyArOTgsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2Vsc2UKICAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZDU19TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOyAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xOTAsNiArMTk2LDcgQEAKICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKwogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBmM2FkYjhkLi5hOTdlNGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTk1LDEwICs5NSwxNyBAQAogLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgQ29tcEZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgQ29tcE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIEdhaW5GdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgR2Fpbk1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworI2VuZGlmCiB9IExWQ1NfVm9sQ29ycmVjdF90OwogCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KQEAgLTExMiw4ICsxMTksMTMgQEAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KICAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLwogICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFRyYW5zaXRpb25HYWluOyAgICAgLyogVHJhbnNpdGlvbiBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgQ29tcHJlc3NHYWluOyAgICAgICAvKiBMYXN0IHVzZWQgY29tcHJlc3NvciBnYWluKi8KKyNlbmRpZgogCiAgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCiAgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLwpAQCAtMTM0LDI0ICsxNDYsMzUgQEAKIC8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7CisjZWxzZQogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0NvZWZmaWNpZW50X3Q7CiAKIC8qIERhdGEgU3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7CiAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOwogICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0RhdGFfdDsKIAotCiB2b2lkIExWQ1NfVGltZXJDYWxsQmFjayAoICAgdm9pZCogaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwppbmRleCA1ZDk5NDYxLi4zOTU2ZDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKQEAgLTY2LDcgKzY2LDc3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKIAorICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCisgICAgICovCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCisgICAgICovCisgICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0xMzMsNyArMjAzLDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2MCw3ICsyMzAsMTcwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWQ1NfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsIENTIHByb2Nlc3MgZnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CisgICAgICAgICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKKworICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBHYWluU3RlcDsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcE91dFB0cjsKKworICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAorICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KKworICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ09NUEdBSU5GUkFNRSkgLyBOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKKyAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47CisgICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOworCisgICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShHYWluICsgR2FpblN0ZXApOworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTFZDU19DT01QR0FJTkZSQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyICs9ICgyICogTFZDU19DT01QR0FJTkZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IChMVk1fSU5UMTYpKFNhbXBsZVRvUHJvY2VzcyAtIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogU2FtcGxlVG9Qcm9jZXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3JlIGdhaW4gdmFsdWUqLworICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOworICAgICAgICB9CisKKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlLWluaXQgYnlwYXNzIG1peCB3aGVuIHRpbWVyIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTFZNX1RpbWVyICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMzIxLDEzICs1NTQsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCmluZGV4IGVlMjU3YjguLjEwODUxMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTU3LDcgKzU3LDk4IEBACiAvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6CisgICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCisgICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KKworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGRlbGF5CisgICAgICAgICAqLworICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKKworCisgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSAgICAgID0gKExWTV9JTlQxNikoMiAqIERlbGF5KTsKKyAgICAgICAgcENvbmZpZy0+RGVsYXlPZmZzZXQgICAgPSAwOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwQ29uZmlnLT5TdGVyZW9TYW1wbGVzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXJzCisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1JldmVyYkNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIyOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7CisgICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgICAgIFJldmVyYlBlcmNlbnRhZ2UgKj0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWw7ICAvLyBBY3R1YWwgUmV2ZXJiIExldmVsIGluIFEgMjMgZm9ybWF0CisgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsID0gKChMVk1fRkxPQVQpKFJldmVyYlBlcmNlbnRhZ2U+PjgpKSAvIDMyNzY3LjBmOworICAgIH0KKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQogewpAQCAtMTQwLDcgKzIzMSw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzksNyArMjcwLDkxIEBACiAvKiAgMi4gIFRoZSBHYWluIGlzIGNvbWJpbmVkIHdpdGggdGhlIExQRiBhbmQgaW5jb3Jwb3JhdGVkIGluIHRvIHRoZSBjb2VmZmljaWVudHMgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGluIG91dHBsYWNlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldmVyYiBub3QgcmVxdWlyZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgLyogRGlzYWJsZSB3aGVuIENTNE1TIGluIHN0ZXJlbyBtb2RlICovCisgICAgaWYgKCgocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19IRUFEUEhPTkUpIHx8IFwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gc2NyYXRjaCBtZW1vcnkgYW5kIGZpbHRlciBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgaW5wdXQgZGF0YSB0byB0aGUgc2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsdGVyIHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgTXVsdDNzX0Zsb2F0KCAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjU3LDggKzQzMiw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2ZTAyNmZmLi42OTg5MmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC01OCwxNCArNTgsMjAgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFByb2NHYWluOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBVbnByb2NHYWluOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syKkxWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFpdOwotCiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwotCiAgICAgLyogRmlsdGVyICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CisgICAgLyogRmlsdGVyICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKIAogCkBAIC03NywxMiArODMsMTcgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwppbmRleCBiOWI4YjA1Li4yOTkyYzM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpAQCAtNDksNyArNDksMTAzIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzU2lkZTsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwU0VTaWRlQ29lZnM7CisKKworICAgIHBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHVwZGF0ZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgKi8KKyAgICAgICAgLyogTWlkIGZpbHRlciAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fRkxPQVQpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSA9PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCAgPSBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgfQorCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlKTsKKyAgICAgICAgcFNFU2lkZUNvZWZzID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1NFU2lkZUNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBTaWRlIGZpbHRlciAqLworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc1NpZGUuQTAgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNTaWRlLkEyID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmc1NpZGUuQjEgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzU2lkZS5CMiA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIyOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMzgsNyArMjM0LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3Nyw3ICsyNzMsOTAgQEAKIC8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQorICAgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01TX0Zsb2F0KHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgZmlsdGVyIHRvIHRoZSBtaWRkbGUgc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNdWx0M3NfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKKyAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICovCisgICAgICAgIE1TVG8yaV9TYXRfRmxvYXQocFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNTQsNyArNDMzLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKaW5kZXggMTViYzQwNy4uNDEyNWYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKQEAgLTQzLDE4ICs0MywzMSBAQAogLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIC8qCiAgICAgICogTWlkZGxlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCiAgICAgLyoKICAgICAgKiBTaWRlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KKyNlbHNlCisgICAgLyoKKyAgICAgKiBNaWRkbGUgZmlsdGVyCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfTWlkKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwogCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KLQorICAgIC8qCisgICAgICogU2lkZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisjZW5kaWYKIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCiAKQEAgLTY3LDEyICs4MCwxNyBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAqcFBhcmFtcyk7CiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwppbmRleCA5NzRkZTIxLi5lMTU0ZTI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCkBAIC03MSw3ICs3MSwxOSBAQAogICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV80ODAwMF9BMSwKICAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfX07CisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV85NjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCisgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTkyMDAwX1NDQUxFfQorI2VuZGlmCisgICAgfTsKIAogLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLwogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdID0gewpAQCAtMTMwLDYgKzE0MiwyMSBAQAogICAgICBDU19TSURFXzQ4MDAwX0IxLAogICAgICBDU19TSURFXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgLAorICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzk2MDAwX0ExLAorICAgICBDU19TSURFXzk2MDAwX0EyLAorICAgICBDU19TSURFXzk2MDAwX0IxLAorICAgICBDU19TSURFXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCisgICAgIENTX1NJREVfMTkyMDAwX0EyLAorICAgICBDU19TSURFXzE5MjAwMF9CMSwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0xOTUsNiArMjIyLDIwIEBACiAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAorI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIEVYIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KICAgICB7Q1NFWF9FUVVBTElTRVJfODAwMF9BMCwgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yNTEsNiArMjkyLDIxIEBACiAgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMzM0LDYgKzM5MCwyMSBAQAogICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCiAgICAgIENTX1JFVkVSQl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTX1JFVkVSQl85NjAwMF9BMCwgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl85NjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0EyLAorICAgICBDU19SRVZFUkJfOTYwMDBfQjEsCisgICAgIENTX1JFVkVSQl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19SRVZFUkJfMTkyMDAwX0EwLCAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTIsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTM4NSw2ICs0NTYsMjQgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezAuNDMzMzYyZiwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHsxLjAwMDAwMGYsICAgICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0KKyNlbHNlCiAgICAgezE0MjAwLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCiAgICAgIDAsCiAgICAgIDQwOTYsCkBAIC00MDEsNiArNDkwLDcgQEAKICAgICAgMCwKICAgICAgNDA5NiwKICAgICAgNTc4Nn0KKyNlbmRpZgogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxOCw4ICs1MDgsMjUgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2VuZGlmCiAKLQorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxMV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyMjA1MCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0NDEwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxOTIwMDAKK307CisjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLApAQCAtNDI4LDE1ICs1MzUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwCit9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTFdID0gezgwMDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisJCQkJCQkJCQkJCSAgMTIwMDAsCisJCQkJCQkJCQkJCSAgMTYwMDAsCisJCQkJCQkJCQkJCSAgMjIwNTAsCisJCQkJCQkJCQkJCSAgMjQwMDAsCisJCQkJCQkJCQkJCSAgMzIwMDAsCisJCQkJCQkJCQkJCSAgNDQxMDAsCisJCQkJCQkJCQkJCSAgNDgwMDAsCisJCQkJCQkJCQkJCSAgOTYwMDAsCisJCQkJCQkJCQkJCSAgMTkyMDAwCit9OworI2Vsc2UKK2NvbnN0IExWTV9JTlQxNiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCkBAIC00NDQsNSArNTY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggZWZkMzBmYi4uZjEwNmFhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCUJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJidW5kbGV3cmFwcGVyCkBAIC00Myw3ICs0Myw3IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnJldmVyYndyYXBwZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IGRmNjUwMWIuLjRmMWZlZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMTQsNyArMTQsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBMVk1fRkxPQVQKK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOworI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCkBAIC0yNzEsNyArMjczLDEwIEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxICAgICA9IDA7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgICAgICAgICAgICAgPSBOVUxMOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICAgICAgICAgICAgPSBOVUxMOworI2VuZGlmCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKICAgICAgICAgfQpAQCAtNDM5LDYgKzQ0NCwxNCBAQAogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwogICAgICAgICB9CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAgICAgfQpAQCAtNjk1LDcgKzcwOCw0NyBAQAogICAgIHJldHVybiAwOwogfSAgIC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQxNkxUT0ZMT0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG86IG5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgSW50MTZUb0Zsb2F0KGNvbnN0IExWTV9JTlQxNiAqc3JjLCBMVk1fRkxPQVQgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICpkc3QgPSAoKExWTV9GTE9BVCkoKExWTV9JTlQxNikqc3JjKSkgLyAzMjc2OC4wZjsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRkxPQVRUT0lOVDE2X1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvIDogTmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBGbG9hdFRvSW50MTZfU0FUKGNvbnN0IExWTV9GTE9BVCAqc3JjLCBMVk1fSU5UMTYgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CiAKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKCgqc3JjKSAqIDMyNzY4LjBmKTsKKyAgICAgICAgaWYgKHRlbXAgPj0gMzI3NjcpIHsKKyAgICAgICAgICAgICpkc3QgPSAzMjc2NzsKKyAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDw9IC0zMjc2OCkgeworICAgICAgICAgICAgKmRzdCA9IC0zMjc2ODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTHZtQnVuZGxlX3Byb2Nlc3MoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MTMsNyArNzY2LDk5IEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBCVUlMRF9GTE9BVAoraW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RDb250ZXh0ICAgICpwQ29udGV4dCl7CiAKKworICAgIC8vTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRUbXA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmOworCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSAoTFZNX0ZMT0FUICopbWFsbG9jKGZyYW1lQ291bnQgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICB9CisKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBmbG9hdCBidWZmZXIncyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcElucHV0QnVmZiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcjsKKyAgICBwT3V0cHV0QnVmZiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXI7CisKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CisgICAgICAgIHBPdXRUbXAgPSBwT3V0OworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgIT0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICB9CisgICAgICAgIHBPdXRUbXAgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBpbnZhbGlkIGFjY2VzcyBtb2RlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAjZW5kaWYKKworICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCisgICAgSW50MTZUb0Zsb2F0KHBJbiwgcElucHV0QnVmZiwgZnJhbWVDb3VudCAqIDIpOworCisgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0QnVmZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZG8gVGltZSAqLworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9Qcm9jZXNzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCisgICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgcE91dFRtcCwgKExWTV9VSU5UMTYpZnJhbWVDb3VudCAqIDIpOworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAjZW5kaWYKKworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspeworICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilwT3V0W2ldICsgKExWTV9JTlQzMilwT3V0VG1wW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCisjZWxzZQogaW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKQEAgLTc3MSw3ICs5MTYsNyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCi0KKyNlbmRpZgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcygpCkBAIC0xMTI2LDYgKzEyNzEsMTYgQEAKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCBlZTYwNGViLi5jYWQ4OWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMTAzLDYgKzEwMywxMCBAQAogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOwogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKICAgICAjZW5kaWYKKyAgICAjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRCdWZmZXI7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmZlcjsKKyAgICAjZW5kaWYKIH07CiAKIC8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IDEyYTAzOGYuLmFiNmI2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMTQsNyArMTQsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBMVk1fRkxPQVQKK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOworI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIlJldmVyYiIKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCkBAIC0xNTIsNiArMTU0LDggQEAKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqSW5GcmFtZXMzMjsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpPdXRGcmFtZXMzMjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVJbjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVPdXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXhpbGlhcnk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXQ7CiAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBjdXJQcmVzZXQ7CkBAIC0xNzIsOCArMTc2LDExIEBACiAKICNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUFJFU0VUIFJFVkVSQl9QUkVTRVRfTk9ORQogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgIDAuNzVmIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKKyNlbHNlCiAjZGVmaW5lIFJFVkVSQl9TRU5EX0xFVkVMICAgKDB4MEMwMCkgLy8gMC43NSBpbiA0LjEyIGZvcm1hdAorI2VuZGlmCiAjZGVmaW5lIFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKQEAgLTI2OSw4ICsyNzYsMTUgQEAKIAogCiAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciByZXZlcmIgcHJvY2VzcyAoKjIgaXMgZm9yIFNURVJFTykKLSAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKLSAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihmbG9hdCkgKiAyOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gcENvbnRleHQtPmJ1ZmZlclNpemVJbjsKKyNlbHNlCisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gcENvbnRleHQtPmJ1ZmZlclNpemVJbjsKKyNlbmRpZgorICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbik7CisgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CkBAIC0yOTIsNiArMzA2LDggQEAKICAgICAjZW5kaWYKICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lczMyKTsKICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMzMik7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IDA7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSAwOwogICAgIFJldmVyYl9mcmVlKHBDb250ZXh0KTsKICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgcmV0dXJuIDA7CkBAIC0zODgsNiArNDA0LDQ4IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIExWTV9JTlQzMiB0ZW1wOworCisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgoKnNyYykgKiAzMjc2OC4wZik7CisgICAgICAgIGlmICh0ZW1wID49IDMyNzY3KSB7CisgICAgICAgICAgICAqZHN0ID0gMzI3Njc7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8PSAtMzI3NjgpIHsKKyAgICAgICAgICAgICpkc3QgPSAtMzI3Njg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQogewogICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCkBAIC00MjEsOCArNDc5LDMxIEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTsKICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBMVk1fSU5UMTYgKk91dEZyYW1lczE2OworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmOworI2VuZGlmCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMikgeworICAgICAgICBpZiAocENvbnRleHQtPk91dEZyYW1lczMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CisgICAgfQorICAgIHBJbnB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+SW5GcmFtZXMzMjsKKyAgICBwT3V0cHV0QnVmZiA9IChmbG9hdCAqKXBDb250ZXh0LT5PdXRGcmFtZXMzMjsKKyNlbmRpZgogICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewogICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAyOwpAQCAtNDQ4LDQ5ICs1MjksODQgQEAKICAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOwogICAgIH0KIAotCi0KICAgICAvLyBDb252ZXJ0IHRvIElucHV0IDMyIGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEludDE2VG9GbG9hdChwSW4sIHBJbnB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBzYW1wbGVzUGVyRnJhbWUpOworI2Vsc2UKICAgICAgICAgZm9yKGludCBpPTA7IGk8ZnJhbWVDb3VudCpzYW1wbGVzUGVyRnJhbWU7IGkrKyl7CiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMltpXSA9IChMVk1fSU5UMzIpcEluW2ldPDw4OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaV0gPSAocEluWzIqaV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorI2Vsc2UKKyAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGldID0gKExWTV9GTE9BVClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGkgKyAxXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnByZXNldCAmJiBwQ29udGV4dC0+Y3VyUHJlc2V0ID09IFJFVkVSQl9QUkVTRVRfTk9ORSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIG1lbXNldChwT3V0cHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisjZWxzZQogICAgICAgICBtZW1zZXQocENvbnRleHQtPk91dEZyYW1lczMyLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UgJiYgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgbWVtc2V0KHBJbnB1dEJ1ZmYsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZWxzZQogICAgICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5JbkZyYW1lczMyLDAsZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbmRpZgogICAgICAgICAgICAgQUxPR1YoIlx0WmVyb2luZyAlZCBzYW1wbGVzIHBlciBmcmFtZSBhdCB0aGUgZW5kIG9mIGNhbGwiLCBzYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICB9CiAKICAgICAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcywgcHJvZHVjaW5nIGEgc3RlcmVvIG91dHB1dCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmLCAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyNlbHNlCiAgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiwgICAgIC8qIElucHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgIH0KKyNlbmRpZgorICAgICAgICB9CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfUHJvY2VzcyIsICJwcm9jZXNzIikKICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIE91dEZyYW1lczE2LCAoc2l6ZV90KWZyYW1lQ291bnQgKiAyKTsKKyNlbHNlCiAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCiAgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCkgKyAoTFZNX0lOVDMyKXBJbltpXSk7Ci0gICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspIHsvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgICAgIC8vcE91dHB1dEJ1ZmYgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlciwgc28gYmV0dGVyIHRvCisgICAgICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIHBJbnB1dEJ1ZmYsIHdoaWNoIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZbaV0gPSBwT3V0cHV0QnVmZltpXSArIChMVk1fRkxPQVQpcEluW2ldIC8gMzI3NjguMGY7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocElucHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOworI2Vsc2UKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOworICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCkBAIC02NDMsNiArNzU5LDE0IEBACiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOworICAgICAgICBicmVhazsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dWKCJcclJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDEwLDcgKzExMzQsNyBAQAogICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKICAgICAvLyAgICAgImNvbnZlcnRlZCBsZXZlbDogJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwsIGxldmVsKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpeworICAgIGlmKChpbnQxNl90KUFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IGJiZTk3ZWUuLjA0M2M4NGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMSw3ICsxLDcgQEAKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIiwgIm9teC8xLjAvaW5jbHVkZSJdLAogfQogCiBjY19saWJyYXJ5IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGYwOGZhYmIuLjE5YjAwZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgpAQCAtMTE3LDEyICsxMTYsMTIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmIGNhcykgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgewogICAgICAgICBBTE9HVigic2V0TWVkaWFDYXMiKTsKIAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhRXh0cmFjdG9yOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNhcykpOworICAgICAgICBkYXRhLndyaXRlQnl0ZVZlY3RvcihjYXNUb2tlbik7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVE1FRElBQ0FTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CkBAIC0yMDYsMTUgKzIwNSwxNCBAQAogICAgICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGNhc0JpbmRlcjsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZjYXNCaW5kZXIpOworICAgICAgICAgICAgSEludGVyZmFjZVRva2VuIGNhc1Rva2VuOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkQnl0ZVZlY3RvcigmY2FzVG9rZW4pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhcyBmcm9tIHBhcmNlbCIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhc1Rva2VuIGZyb20gcGFyY2VsIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPElDYXM+IGNhcyA9IGludGVyZmFjZV9jYXN0PElDYXM+KGNhc0JpbmRlcik7CiAKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhcykpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFDYXMoY2FzVG9rZW4pKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCA0MzEzMGViLi5hMDczMDgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKLSNpbmNsdWRlIDxvbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggYWI0MGY1My4uMWUxM2I2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCkBAIC0yMCwxNCArMjAsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWV0YURhdGE7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEhJbnRlcmZhY2VUb2tlbjsKIAogY2xhc3MgSU1lZGlhRXh0cmFjdG9yIDogcHVibGljIElJbnRlcmZhY2UgewogcHVibGljOgpAQCAtNjUsNyArNjMsNyBAQAogICAgIC8vIGZvciBEUk0KICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pICA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKSAgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmggYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvb214LzEuMC9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYm1lZGlhL29teC8xLjAvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9vbXgvMS4wL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggNmEwOTIyNy4uZGYzNjA0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0xMTcxLDcgKzExNzEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSBhdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKQEAgLTExODIsNyArMTE4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBhZDc4OGY3Li4wZmMxYWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTYzOSwxMSArNjM5LDYgQEAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKICAgICB9CiAKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKLSAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwotICAgICAgICBkdW1wKC0xLCBhcmdzKTsKLSAgICB9Ci0KICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CiAKQEAgLTkzNSw3ICs5MzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgICAgICAgICAgICAgZHVtcCgtMSwgYXJncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDc1OGRiMWYuLjQ4M2E5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewpAQCAtOTE3LDEwICs5MTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CiAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCiAgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOwotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKQEAgLTE0MDgsNiArMTQwOCwxMSBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUVPU19sKGF1ZGlvLCBmaW5hbFJlc3VsdCwgZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CiAgICAgaWYgKGF1ZGlvICYmIGRlbGF5VXMgPiAwKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1MsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpb0VPU0dlbmVyYXRpb24iLCBtQXVkaW9FT1NHZW5lcmF0aW9uKTsKQEAgLTE0MjAsNiArMTQyNSwxMSBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKICAgICBub3RpZnktPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKICAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgLy8gVmlkZW8gbWlnaHQgb3V0bGl2ZSBhdWRpby4gQ2xlYXIgYW5jaG9yIHRvIGVuYWJsZSB2aWRlbyBvbmx5IGNhc2UuCisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGU2ODUwYjUuLmY1OGI3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAgICAgdm9pZCBvbkNoYW5nZUF1ZGlvRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwogICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKICAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CiAgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IGY1MTE4NzYuLjAyZjc1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtMSwxMyArMSw0OCBAQAorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk1vbm9QaXBlLmNwcCIsCisgICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAorICAgICAgICAiTkJBSU8uY3BwIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlX21vbm8iXSwKK30KKworLy8gbGlibmJhaW9fbW9ubyBpcyB0aGUgcGFydCBvZiBsaWJuYmFpbyB0aGF0IGlzIGF2YWlsYWJsZSBmb3IgdmVuZG9ycyB0byB1c2UuIFZlbmRvciBtb2R1bGVzIGNhbid0CisvLyBsaW5rIGFnYWluc3QgbGlibmJhaW8gYW5kIHN5c3RlbSBtb2R1bGVzIGNhbid0IGxpbmsgYWdhaW5zdCBsaWJuYmFpb19tb25vLiBUaGUgcmVzdCBvZiBsaWJuYmFpbworLy8gcHVsbHMgaW4gdG9vIG1hbnkgb3RoZXIgZGVwZW5kZW5jaWVzLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJuYmFpb19tb25vIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGlibmJhaW9fbW9ub19kZWZhdWx0cyJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm5iYWlvIiwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWwogICAgICAgICAiQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCIsCi0gICAgICAgICJNb25vUGlwZS5jcHAiLAotICAgICAgICAiTW9ub1BpcGVSZWFkZXIuY3BwIiwKLSAgICAgICAgIk5CQUlPLmNwcCIsCiAgICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAogICAgICAgICAiUGlwZS5jcHAiLAogICAgICAgICAiUGlwZVJlYWRlci5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLApAQCAtMjQsOCArNTksOCBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMzUsNyArNzAsNSBAQAogCiAgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCiAKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAppbmRleCBjYmZmODdkLi44NTY0ODk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmg+CiAKQEAgLTgyLDggKzgzLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gcG9zaXRpb242NDsKLSAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9Ci0gICAgICAgICAgICB0aW1lLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHRpbWUudHZfbnNlYzsKKyAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWUpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCmluZGV4IGViYjkwYzguLmEzNTJiMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKQEAgLTE4LDE0ICsxOCwxNCBAQAogKiBEb2N1bWVudGF0aW9uOiBXb3JrZmxvdyBzdW1tYXJ5IGZvciBoaXN0b2dyYW0gZGF0YSBwcm9jZXNzaW5nOgogKiBGb3IgbW9yZSBkZXRhaWxzIG9uIEZJRk8sIHBsZWFzZSBzZWUgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzOyBkb3h5Z2VuCiAqIFRPRE86IGFkZCB0aGlzIGRvY3VtZW50YXRpb24gdG8gZG94eWdlbiBvbmNlIGl0IGlzIGZ1cnRoZXIgZGV2ZWxvcGVkCi0qIDEpIHdyaXRpbmcgdGhlIGRhdGEgdG8gYSBidWZmZXIKLSogb25Xb3JrCisqIDEpIFdyaXRpbmcgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgdG8gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorKiBvbldvcmsoKQogKiAgICAgQ2FsbGVkIGV2ZXJ5IHBlcmlvZCBsZW5ndGggKGUuZy4sIDRtcykKICogICAgIENhbGxzIExPR19ISVNUX1RTCiAqIExPR19ISVNUX1RTCi0qICAgICBIYXNoZXMgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgotKiAgICAgY2FsbHMgTkJMT0c6OldyaXRlcjo6bG9nSGlzdFRTIG9uY2UKLSogTkJMT0c6OldyaXRlcjo6bG9nSGlzdFRTCisqICAgICBIYXNoZXMgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIHdyaXRlcyBzaW5nbGUgdGltZXN0YW1wIHRvIGJ1ZmZlcgorKiAgICAgY2FsbHMgTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMgb25jZQorKiBOQkxPRzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUUwogKiAgICAgY2FsbHMgTkJMT0c6OldyaXRlcjo6bG9nIG9uIGhhc2ggYW5kIGN1cnJlbnQgdGltZXN0YW1wCiAqICAgICB0aW1lIGlzIGluIENMT0NLX01PTk9UT05JQyBjb252ZXJ0ZWQgdG8gbnMKICogTkJMT0c6OldyaXRlcjo6bG9nKEV2ZW50LCBjb25zdCB2b2lkKiwgc2l6ZV90KQpAQCAtNDQsNiArNDQsOCBAQAogKiBzc2l6ZV90IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpvYnRhaW4KICogICAgIERldGVybWluZXMgcmVhZGFibGUgYnVmZmVyIHNlY3Rpb24gdmlhIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiByZWFkZXIKICogICAgIGFuZCB3cml0ZXIgcG9pbnRlcnMKKyogU2ltaWxhcmx5LCBMT0dfQVVESU9fU1RBVEUoKSBpcyBjYWxsZWQgYnkgb25TdGF0ZUNoYW5nZSB3aGVuZXZlciBhdWRpbyBpcworKiB0dXJuZWQgb24gb3Igb2ZmLCBhbmQgd3JpdGVzIHRoaXMgbm90aWZpY2F0aW9uIHRvIHRoZSBGSUZPLgogKgogKiAyKSByZWFkaW5nIHRoZSBkYXRhIGZyb20gc2hhcmVkIG1lbW9yeQogKiBUaHJlYWQ6OnRocmVhZGxvb3AoKQpAQCAtNTEsNiArNTMsNyBAQAogKiBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKQogKiAgICAgY2FsbHMgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UKICogTkJMb2c6Ok1lcmdlcjo6bWVyZ2UKKyogICAgIE1lcmdlcyBzbmFwc2hvdHMgc29ydGVkIGJ5IHRpbWVzdGFtcAogKiAgICAgZm9yIGVhY2ggcmVhZGVyIGluIHZlY3RvciBvZiBjbGFzcyBOYW1lZFJlYWRlciwKICogICAgIGNhbGxzTmFtZWRSZWFkZXI6OnJlYWRlcigpLT5nZXRTbmFwc2hvdAogKiAgICAgVE9ETzogY2hlY2sgd2hldGhlciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50CkBAIC01OSwxMSArNjIsMTIgQEAKICogICAgIGNhbGxzIG1GaWZvUmVhZGVyLT5vYnRhaW4gdG8gZmluZCByZWFkYWJsZSBkYXRhCiAqICAgICBzZXRzIHNuYXBzaG90LmJlZ2luKCkgYW5kIC5lbmQoKSBpdGVyYXRvcnMgdG8gYm91bmRhcmllcyBvZiB2YWxpZCBlbnRyaWVzCiAqICAgICBtb3ZlcyB0aGUgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgdGhlIGxhc3QgZW50cnkgcmVhZAotKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICgzKSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCisqICAgICBpbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgaXMgaW4gc2hhcmVkIG1lbW9yeS4gaW4gKDQpLCB0aGUgYnVmZmVyIGlzIHByaXZhdGUKICoKICogMykgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHByaXZhdGUgYnVmZmVyCiAqIE1lZGlhTG9nU2VydmljZTo6ZHVtcAotKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQpIG9uIGluc3RhbmNlIG9mIHN1YmNsYXNzIG1lcmdlUmVhZGVyCisqICAgICBjYWxscyBOQkxvZzo6UmVhZGVyOjpkdW1wKENPTlNPTEUpCisqICAgICBUaGUgcHJpdmF0ZSBidWZmZXIgY29udGFpbnMgYWxsIGxvZ3MgZm9yIGFsbCByZWFkZXJzIGluIHNoYXJlZCBtZW1vcnkKICogTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQpCiAqICAgICBjYWxscyBnZXRTbmFwc2hvdCBvbiB0aGUgY3VycmVudCByZWFkZXIKICogICAgIGNhbGxzIGR1bXAoaW50LCBzaXplX3QsIFNuYXBzaG90KQpAQCAtNzIsOSArNzYsMTAgQEAKICogICAgIChzdHJpbmcsIHRpbWVzdGFtcCwgZXRjLi4uKQogKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCBhZGRzIGEgbGlzdCBvZiB0aW1lc3RhbXAgc2VxdWVuY2VzCiAqICAgICAoaGlzdG9ncmFtIGVudHJ5KSB0byBOQkxvZzo6bUhpc3RzCi0qICAgICBJbiB0aGUgY2FzZSBvZiBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsIGNhbGxzIGRyYXdIaXN0b2dyYW0gb24gZWFjaCBlbGVtZW50IGluCi0qICAgICB0aGUgbGlzdCBhbmQgZXJhc2VzIGl0Ci0qICAgICBUT0RPOiB3aGVuIGRvIHRoZXNlIGV2ZW50cyBvY2N1cj8KKyogICAgIFRPRE86IGFkZCBldmVyeSBISVNUT0dSQU1fRU5UUllfVFMgdG8gdHdvCisqICAgICBjaXJjdWxhciBidWZmZXJzOiBvbmUgc2hvcnQtdGVybSBhbmQgb25lIGxvbmctdGVybSAoY2FuIGFkZCBldmVuIGxvbmdlci10ZXJtCisqICAgICBzdHJ1Y3R1cmVzIGluIHRoZSBmdXR1cmUpLiBXaGVuIGR1bXAgaXMgY2FsbGVkLCBwcmludCBldmVyeXRoaW5nIGN1cnJlbnRseQorKiAgICAgaW4gdGhlIGJ1ZmZlci4KICogTkJMb2c6OmRyYXdIaXN0b2dyYW0KICogICAgIGlucHV0OiB0aW1lc3RhbXAgYXJyYXkKICogICAgIGJ1Y2tldHMgdGhpcyB0byBhIGhpc3RvZ3JhbSBhbmQgcHJpbnRzCkBAIC04Miw3ICs4Nyw3IEBACiAqLwogCiAjZGVmaW5lIExPR19UQUcgIk5CTG9nIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjbGltaXRzPgpAQCAtMTAyLDYgKzEwNyw3IEBACiAjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KIC8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMzQsNyArMTQwLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOgorICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTEzLDcgKzUxOSw3IEBACiAgICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwogfQogCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCiB7CiAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMjIgKzUyOCw3IEBACiAgICAgZGF0YS5oYXNoID0gaGFzaDsKICAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwogICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwogICAgIH0KQEAgLTc3MSwxNSArNzYyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKIGNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRkxVU0h9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzg2LDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05NDEsMzEgKzg5OSwxMiBAQAogCiB2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCiB7Ci0gIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7Ci0jaWYgMAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0aW1lX3QgbWF4U2VjID0gLTE7Ci0gICAgd2hpbGUgKGVudHJ5IC0gc3RhcnQgPj0gKGludCkgRW50cnk6OmtPdmVyaGVhZCkgewotICAgICAgICBpZiAocHJldkVudHJ5IC0gc3RhcnQgPCAwIHx8ICFwcmV2RW50cnkuaGFzQ29uc2lzdGVudExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldkVudHJ5LT50eXBlID09IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgaWYgKHByZXZFbnRyeS0+bGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29ycnVwdAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkVudHJ5LmNvcHlEYXRhKCh1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGlmICh0cy50dl9zZWMgPiBtYXhTZWMpIHsKLSAgICAgICAgICAgICAgICBtYXhTZWMgPSB0cy50dl9zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLS1lbnRyeTsKLSAgICAgICAgLS1wcmV2RW50cnk7Ci0gICAgfQotI2VuZGlmCisgICAgLy8gIENhbGxTdGFjayBjcyhMT0dfVEFHKTsKICAgICBtRmQgPSBmZDsKICAgICBtSW5kZW50ID0gaW5kZW50OwogICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OworICAgIC8vIEZJWE1FOiB0aGlzIGlzIG5vdCB0aHJlYWQgc2FmZQorICAgIHN0YXRpYyBQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHlzaXM7IC8vIHVzZWQgdG8gc3RvcmUgZGF0YSBhbmQgdG8gY2FsbCBhbmFseXNpcyBmdW5jdGlvbnMKICAgICBzaXplX3QgbG9zdCA9IHNuYXBzaG90Lmxvc3QoKSArIChzbmFwc2hvdC5iZWdpbigpIC0gRW50cnlJdGVyYXRvcihzbmFwc2hvdC5kYXRhKCkpKTsKICAgICBpZiAobG9zdCA+IDApIHsKICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGxvc3QgJXp1IGJ5dGVzIHdvcnRoIG9mIGV2ZW50cyIsIGxvc3QpOwpAQCAtOTczLDg1ICs5MTIsOSBAQAogICAgICAgICAvLyAgICAgIGxvZyB0byBwdXNoIGl0IG91dC4gIENvbnNpZGVyIGtlZXBpbmcgdGhlIHRpbWVzdGFtcC9ib2R5IGJldHdlZW4gY2FsbHMgdG8gY29weUVudHJ5RGF0YUF0KCkuCiAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQotI2lmIDAKLSAgICBzaXplX3Qgd2lkdGggPSAxOwotICAgIHdoaWxlIChtYXhTZWMgPj0gMTApIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgbWF4U2VjIC89IDEwOwotICAgIH0KLSAgICBpZiAobWF4U2VjID49IDApIHsKLSAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyUqc10iLCAoaW50KSB3aWR0aCArIDQsICIiKTsKLSAgICB9Ci0gICAgYm9vbCBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwotI2VuZGlmCiAKICAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKICAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotI2lmIDAKLSAgICAgICAgY2FzZSBFVkVOVF9TVFJJTkc6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJS4qcyIsIChpbnQpIGVudHJ5Lmxlbmd0aCgpLCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfVElNRVNUQU1QOiB7Ci0gICAgICAgICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYyk7Ci0gICAgICAgICAgICBlbnRyeS5jb3B5RGF0YSgoY29uc3QgdWludDhfdCopICZ0cyk7Ci0gICAgICAgICAgICBsb25nIHByZXZOc2VjID0gdHMudHZfbnNlYzsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFNaW4gPSBMT05HX01BWDsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFNYXggPSAtMTsKLSAgICAgICAgICAgIGxvbmcgZGVsdGFUb3RhbCA9IDA7Ci0gICAgICAgICAgICBhdXRvIGF1eChlbnRyeSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgKythdXg7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZCAtIGF1eCA+PSAwIHx8IGF1eC50eXBlKCkgIT0gRVZFTlRfVElNRVNUQU1QKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdHNOZXh0OwotICAgICAgICAgICAgICAgIGF1eC5jb3B5RGF0YSgoY29uc3QgdWludDhfdCopICZ0c05leHQpOwotICAgICAgICAgICAgICAgIGlmICh0c05leHQudHZfc2VjICE9IHRzLnR2X3NlYykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9uZyBkZWx0YSA9IHRzTmV4dC50dl9uc2VjIC0gcHJldk5zZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgZGVsdGFNaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFNaW4gPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gZGVsdGFNYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFNYXggPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsdGFUb3RhbCArPSBkZWx0YTsKLSAgICAgICAgICAgICAgICBwcmV2TnNlYyA9IHRzTmV4dC50dl9uc2VjOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IG4gPSAoYXV4IC0gZW50cnkpIC8gKHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpICsgMyAvKkVudHJ5OjprT3ZlcmhlYWQ/Ki8pOwotICAgICAgICAgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAobiA+PSBrU3F1YXNoVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMudHZfbnNlYyArIGRlbHRhVG90YWwpIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoZGVsdGFNaW4gLyAxMDAwMDAwKSwgKGludCkgKGRlbHRhTWF4IC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgICAgIGVudHJ5ID0gYXV4OwotICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgdHMudHZfc2VjLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0lOVEVHRVI6Ci0gICAgICAgICAgICBhcHBlbmRJbnQoJmJvZHksIGVudHJ5LmRhdGEoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9GTE9BVDoKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfUElEOgotICAgICAgICAgICAgYXBwZW5kUElEKCZib2R5LCBlbnRyeS5kYXRhKCksIGVudHJ5Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgogICAgICAgICAgICAgZW50cnkgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoZW50cnkpLCAmdGltZXN0YW1wLCAmYm9keSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwNjMsNDAgKzkyNiwxNSBAQAogICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwogICAgICAgICAgICAgaW50NjRfdCB0czsKICAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50PiBrZXkoaGFzaCwgZGF0YS0+YXV0aG9yKTsKLSAgICAgICAgICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCi0gICAgICAgICAgICAvLyBieSB0aGUgdGhyZWFkIGJlaW5nIGluYWN0aXZlLgotICAgICAgICAgICAgbUhpc3RzW2tleV0ucHVzaF9iYWNrKHRzKTsKKyAgICAgICAgICAgIHBlcmZvcm1hbmNlQW5hbHlzaXMubG9nVHNFbnRyeShkYXRhLT5hdXRob3IsIHRzKTsKICAgICAgICAgICAgICsrZW50cnk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAvLyBkcmF3cyBoaXN0b2dyYW1zIHN0b3JlZCBpbiBnbG9iYWwgUmVhZGVyOjptSGlzdHMgYW5kIGVyYXNlcyB0aGVtCi0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOiB7Ci0gICAgICAgICAgICBIaXN0b2dyYW1FbnRyeSBoaXN0RW50cnkoZW50cnkpOwotICAgICAgICAgICAgLy8gTG9nIHRpbWVzdGFtcAotICAgICAgICAgICAgLy8gVGltZXN0YW1wIG9mIGNhbGwgdG8gZHJhd0hpc3RvZ3JhbSwgbm90IHdoZW4gYXVkaW8gd2FzIGdlbmVyYXRlZAotICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGhpc3RFbnRyeS50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLSAgICAgICAgICAgIC8vIExvZyBoaXN0b2dyYW1zCi0gICAgICAgICAgICBzZXRGaW5kR2xpdGNoKHRydWUpOwotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkhpc3RvZ3JhbSBmbHVzaCAtICIpOwotICAgICAgICAgICAgaGFuZGxlQXV0aG9yKGhpc3RFbnRyeSwgJmJvZHkpOwotICAgICAgICAgICAgZm9yIChhdXRvIGhpc3QgPSBtSGlzdHMuYmVnaW4oKTsgaGlzdCAhPSBtSGlzdHMuZW5kKCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhpc3QtPmZpcnN0LnNlY29uZCA9PSBoaXN0RW50cnkuYXV0aG9yKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiVYIiwgKGludCloaXN0LT5maXJzdC5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5kR2xpdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGVydElmR2xpdGNoKGhpc3QtPnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGZpbGUgdG8gZW1wdHkgYW5kIHdyaXRlIGRhdGEgZm9yIGFsbCBoaXN0b2dyYW1zIGluIHRoaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlSGlzdFRvRmlsZShoaXN0LT5zZWNvbmQsIGhpc3QgIT0gbUhpc3RzLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgICAgICBkcmF3SGlzdG9ncmFtKCZib2R5LCBoaXN0LT5zZWNvbmQsIHRydWUsIGluZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGhpc3QgPSBtSGlzdHMuZXJhc2UoaGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKytoaXN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChTdGF0ZVRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7CisgICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCisgICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmhhbmRsZVN0YXRlQ2hhbmdlKGRhdGEtPmF1dGhvcik7CiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTAsMTAgKzk0OCwxMCBAQAogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgfQorICAgIH0KKyAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5KTsKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogfQogCkBAIC0xMTM5LDE2ICs5NzcsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMTExLDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9PV05FUlMgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYTRjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKy8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1BlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7CisgICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKKyAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCisgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKKyAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Cit9CisKKy8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50CitzdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgeworICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07CisgICAgfQorICAgIHJldHVybiBidWNrZXRzOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisvLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCisvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKGludCBhdXRob3IpIHsKKyAgICAvLyAxKSBhbmFseXplIHRoZSBzZXJpZXMgdG8gc3RvcmUgYWxsIG91dGxpZXJzIGFuZCB0aGVpciBleGFjdCB0aW1lc3RhbXBzOgorICAgIHN0b3JlT3V0bGllckRhdGEobVRpbWVTdGFtcFNlcmllc1thdXRob3JdKTsKKworICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKKyAgICBkZXRlY3RQZWFrcygpOworCisgICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdGhpcyB0byBtUmVjZW50SGlzdHMgYW5kIGVyYXNlIHRoZSB0aW1lIHNlcmllcworICAgIC8vIEZJWE1FOiBuZWVkIHRvIHN0b3JlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGhpc3RvZ3JhbQorICAgIC8vIEZJWE1FOiBSZXN0b3JlIExPR19ISVNUX0ZMVVNIIHRvIHNlcGFyYXRlIGhpc3RvZ3JhbXMgYXQgZXZlcnkgZW5kLW9mLXN0cmVhbSBldmVudAorICAgIC8vIEEgaGlzdG9ncmFtIHNob3VsZCBub3Qgc3BhbiBkYXRhIGJldHdlZW4gYXVkaW8gb2ZmL29uIHRpbWVzcGFucworICAgIG1SZWNlbnRIaXN0cy5lbXBsYWNlX2JhY2soYXV0aG9yLCBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllc1thdXRob3JdKSk7CisgICAgLy8gZG8gbm90IGxldCBtUmVjZW50SGlzdHMgZXhjZWVkIGNhcGFjaXR5CisgICAgLy8gQUxPR0QoIm1SZWNlbnRIaXN0cyBzaXplOiAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOworICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpID49IGtSZWNlbnRIaXN0c0NhcGFjaXR5KSB7CisgICAgICAgIC8vICBBTE9HRCgicG9wcGVkIGJhY2sgbVJlY2VudEhpc3RzIik7CisgICAgICAgIG1SZWNlbnRIaXN0cy5wb3BfZnJvbnQoKTsKKyAgICB9CisgICAgbVRpbWVTdGFtcFNlcmllc1thdXRob3JdLmNsZWFyKCk7Cit9CisKKy8vIGZvcmNlcyBzaG9ydC10ZXJtIGhpc3RvZ3JhbSBzdG9yYWdlIHRvIGF2b2lkIGFkZGluZyBpZGxlIGF1ZGlvIHRpbWUgaW50ZXJ2YWwKKy8vIHRvIGJ1ZmZlciBwZXJpb2QgZGF0YQordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpoYW5kbGVTdGF0ZUNoYW5nZShpbnQgYXV0aG9yKSB7CisgICAgQUxPR0QoImhhbmRsZVN0YXRlQ2hhbmdlIik7CisgICAgcHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKGF1dGhvcik7CisgICAgcmV0dXJuOworfQorCisvLyBUYWtlcyBhIHNpbmdsZSBidWZmZXIgcGVyaW9kIHRpbWVzdGFtcCBlbnRyeSB3aXRoIGF1dGhvciBpbmZvcm1hdGlvbiBhbmQgc3RvcmVzIGl0CisvLyBpbiBhIHRlbXBvcmFyeSBzZXJpZXMgb2YgdGltZXN0YW1wcy4gT25jZSB0aGUgc2VyaWVzIGlzIGZ1bGwsIHRoZSBkYXRhIGlzIGFuYWx5emVkLAorLy8gc3RvcmVkLCBhbmQgZW1wdGllZC4KKy8vIFRPRE86IGRlY2lkZSB3aGV0aGVyIGF1dGhvciBvciBmaWxlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIG1vcmUgaW1wb3J0YW50IHRvIHN0b3JlCisvLyBmb3Igbm93LCBvbmx5IHN0b3JlcyBhdXRob3IgKHRocmVhZCkKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6bG9nVHNFbnRyeShpbnQgYXV0aG9yLCBpbnQ2NF90IHRzKSB7CisgICAgLy8gVE9ETyBtaWdodCB3YW50IHRvIGZpbHRlciBleGNlc3NpdmVseSBoaWdoIG91dGxpZXJzLCB3aGljaCBhcmUgdXN1YWxseSBjYXVzZWQKKyAgICAvLyBieSB0aGUgdGhyZWFkIGJlaW5nIGluYWN0aXZlLgorICAgIC8vIFN0b3JlIHRpbWUgc2VyaWVzIGRhdGEgZm9yIGVhY2ggcmVhZGVyIGluIG9yZGVyIHRvIGJ1Y2tldCBpdCBvbmNlIHRoZXJlCisgICAgLy8gaXMgZW5vdWdoIGRhdGEuIFRoZW4sIHdyaXRlIHRvIHJlY2VudEhpc3RzIGFzIGEgaGlzdG9ncmFtLgorICAgIG1UaW1lU3RhbXBTZXJpZXNbYXV0aG9yXS5wdXNoX2JhY2sodHMpOworICAgIC8vIGlmIGxlbmd0aCBvZiB0aGUgdGltZSBzZXJpZXMgaGFzIHJlYWNoZWQga1Nob3J0SGlzdFNpemUgc2FtcGxlcywKKyAgICAvLyBhbmFseXplIHRoZSBkYXRhIGFuZCBmbHVzaCB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeQorICAgIGlmIChtVGltZVN0YW1wU2VyaWVzW2F1dGhvcl0uc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcyhhdXRob3IpOworICAgIH0KK30KKworLy8gR2l2ZW4gYSBzZXJpZXMgb2Ygb3V0bGllciBpbnRlcnZhbHMgKG1PdXRsaWVyIGRhdGEpLAorLy8gbG9va3MgZm9yIGNoYW5nZXMgaW4gZGlzdHJpYnV0aW9uIChwZWFrcyksIHdoaWNoIGNhbiBiZSBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisvLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgbWVhbiB0byB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIHNpZ21hIHRvIDAsIGFuZCB1cGRhdGVzCisvLyB0aGVtIGFzIGxvbmcgYXMgbm8gcGVhayBpcyBkZXRlY3RlZC4gV2hlbiBhIHZhbHVlIGlzIG1vcmUgdGhhbiAndGhyZXNob2xkJworLy8gc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLCBhIHBlYWsgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBtZWFuIGFuZCBzaWdtYQorLy8gYXJlIHNldCB0byB0aGUgcGVhayB2YWx1ZSBhbmQgMC4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6ZGV0ZWN0UGVha3MoKSB7CisgICAgaWYgKG1PdXRsaWVyRGF0YS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJwZWFrIGRldGVjdG9yIGNhbGxlZCBvbiBlbXB0eSBhcnJheSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCisgICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKKyAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKyAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOworCisgICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7CisgICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAorICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCisgICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgeworICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKKyAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICB9CisgICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07CisgICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKKyAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgorICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKKyAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCisgICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgorICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKKyAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7CisgICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047CisgICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCisgICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKKyAgICAgICAgICAgIC8vIEFMT0dEKCJ2YWx1ZSwgbWVhbiwgc2Q6ICVmLCAlZiwgJWYiLCBzdGF0aWNfY2FzdDxkb3VibGU+KGl0LT5maXJzdCksIG1lYW4sIHNkKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInBvcHBlZCBiYWNrIG1QZWFrVGltZXN0YW1wcyIpOworICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ID0gaXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy9mb3IgKGNvbnN0IGF1dG8gJml0IDogbVBlYWtUaW1lc3RhbXBzKSB7CisgICAgLy8gICAgQUxPR0UoIm1QZWFrVGltZXN0YW1wcyAlZiIsIHN0YXRpY19jYXN0PGRvdWJsZT4oaXQpKTsKKyAgICAvL30KKyAgICByZXR1cm47Cit9CisKKy8vIENhbGxlZCBieSBMb2dUc0VudHJ5LiBUaGUgaW5wdXQgaXMgYSB2ZWN0b3Igb2YgdGltZXN0YW1wcy4KKy8vIEZpbmRzIG91dGxpZXJzIGFuZCB3cml0ZXMgdG8gbU91dGxpZXJkYXRhLgorLy8gRWFjaCB2YWx1ZSBpbiBtT3V0bGllcmRhdGEgY29uc2lzdHMgb2Y6IDxvdXRsaWVyIHRpbWVzdGFtcCwgdGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXI+LgorLy8gZS5nLiB0aW1lc3RhbXBzIChtcykgMSwgNCwgNSwgMTYsIDE4LCAyOCB3aWxsIHByb2R1Y2UgcGFpcnMgKDQsIDUpLCAoMTMsIDE4KS4KKy8vIFRoaXMgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgdGltZSBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGEgaGlzdG9ncmFtLgordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZ0aW1lc3RhbXBzKSB7CisgICAgaWYgKHRpbWVzdGFtcHMuc2l6ZSgpIDwgMSkgeworICAgICAgICBBTE9HRSgic3RvcmVPdXRsaWVyRGF0YSBjYWxsZWQgb24gZW1wdHkgdmVjdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZmlyc3QgcGFzczogbmVlZCB0byBpbml0aWFsaXplCisgICAgaWYgKG1FbGFwc2VkID09IDApIHsKKyAgICAgICAgbVByZXZOcyA9IHRpbWVzdGFtcHNbMF07CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmdHM6IHRpbWVzdGFtcHMpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgZGlmZk1zID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGRlbHRhTXMobVByZXZOcywgdHMpKTsKKyAgICAgICAgaWYgKGRpZmZNcyA+PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oa091dGxpZXJNcykpIHsKKyAgICAgICAgICAgIG1PdXRsaWVyRGF0YS5lbXBsYWNlX2JhY2sobUVsYXBzZWQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihtUHJldk5zKSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgb2xkZXN0IHZhbHVlIGlmIHRoZSB2ZWN0b3IgaXMgZnVsbAorICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHBvcF9mcm9udCBvbmNlIGNpcmN1bGFyIGJ1ZmZlciBpcyBpbiBwbGFjZQorICAgICAgICAgICAgLy8gRklYTUU6IGNoYW5nZSBrU2hvcnRIaXN0U2l6ZSB0byBzb21lIG90aGVyIGNvbnN0YW50LiBNYWtlIHN1cmUgaXQgaXMgbGFyZ2UKKyAgICAgICAgICAgIC8vIGVub3VnaCB0aGF0IGRhdGEgd2lsbCBuZXZlciBiZSBsb3N0IGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGEgbG9uZy10ZXJtIEZJRk8KKyAgICAgICAgICAgIGlmIChtT3V0bGllckRhdGEuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInBvcHBlZCBiYWNrIG1PdXRsaWVyRGF0YSIpOworICAgICAgICAgICAgICAgIG1PdXRsaWVyRGF0YS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbGFwc2VkID0gMDsKKyAgICAgICAgfQorICAgICAgICBtRWxhcHNlZCArPSBkaWZmTXM7CisgICAgICAgIG1QcmV2TnMgPSB0czsKKyAgICB9Cit9CisKKworLy8gRklYTUU6IGRlbGV0ZSB0aGlzIHRlbXBvcmFyeSB0ZXN0IGNvZGUsIHJlY3ljbGVkIGZvciB2YXJpb3VzIG5ldyBmdW5jdGlvbnMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6dGVzdEZ1bmN0aW9uKCkgeworICAgIC8vIHByb2R1Y2VzIHZhbHVlcyAoNDogNTAwMDAwMCksICgxMzogMTgwMDAwMDApCisgICAgLy8gbnMgdGltZXN0YW1wcyBvZiBidWZmZXIgcGVyaW9kcworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+a1RlbXBUZXN0RGF0YSA9IHsxMDAwMDAwLCA0MDAwMDAwLCA1MDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMDAwMCwgMTgwMDAwMDAsIDI4MDAwMDAwfTsKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhKGtUZW1wVGVzdERhdGEpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIEFMT0dFKCJQZXJmb3JtYW5jZUFuYWx5c2lzIHRlc3QgJWxsZDogJWxsZCIsCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5maXJzdCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisgICAgZGV0ZWN0UGVha3MoKTsKK30KKworLy8gVE9ETyBNYWtlIGl0IHJldHVybiBhIHN0ZDo6c3RyaW5nIGluc3RlYWQgb2YgbW9kaWZ5aW5nIGJvZHkgLS0+IGlzIHRoaXMgc3RpbGwgcmVsZXZhbnQ/CisvLyBGSVhNRTogYXMgY2FuIGJlIHNlZW4gd2hlbiBwcmludGluZyB0aGUgdmFsdWVzLCB0aGUgb3V0bGllciB0aW1lc3RhbXBzIHR5cGljYWxseSBvY2N1cgorLy8gaW4gdGhlIGZpcnN0IGhpc3RvZ3JhbSAzNSB0byAzOCBpbmRpY2VzIGZyb20gdGhlIGVuZCAobW9zdCBvZnRlbiAzNSkuCisvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Cit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBtYXhIZWlnaHQpIHsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgQUxPR0QoInJlcG9ydFBlcmZvcm1hbmNlOiBtUmVjZW50SGlzdHMgaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IGhpc3RzIHNpemUgJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICAvLyBUT0RPOiBtb3JlIGVsYWJvcmF0ZSBkYXRhIGFuYWx5c2lzCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChjb25zdCBhdXRvICZzaG9ydEhpc3Q6IG1SZWNlbnRIaXN0cykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSA0MDsKKyAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOworICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOworCisgICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKKyAgICBpbnQgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCisgICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKKyAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKKyAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCisgICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7CisgICAgY29uc3QgaW50IGNvbFdpZHRoID0gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihtYXhEZWx0YSkgKyAxLCAzKSwgbGVmdFBhZGRpbmcgKyAyKTsKKyAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7CisgICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0CisgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgeworICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7CisgICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzIiwgbGVmdFBhZGRpbmcgKyAxMSwgIk9jY3VycmVuY2VzIik7CisgICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5zZWNvbmQpOworICAgIH0KKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gYXNjaWkgYXJ0CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICBmb3IgKGludCByb3cgPSBoZWlnaHQgKiBzY2FsaW5nRmFjdG9yOyByb3cgPj0gMDsgcm93IC09IHNjYWxpbmdGYWN0b3IpIHsKKyAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMSA8PCByb3c7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7CisgICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOworICAgICAgICB9CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgfQorICAgIC8vIHByaW50IHgtYXhpcworICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogY29sV2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisKKyAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKKyAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguZmlyc3QpOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKworICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzXG4iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVsbGQ6ICVsbGRcbiIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5maXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorCit9CisKKworLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKKy8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCisvLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAorLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6CisvLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKKy8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgorLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzLgordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjphbGVydElmR2xpdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7CisgICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RNcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDI7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7IC8vIHNraXAgZmlyc3QgdGltZSBlbnRyeQorICAgICAgICBwZXJpb2RzLnB1c2hfZnJvbnQoZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOworICAgICAgICBwZXJpb2RzLnBvcF9iYWNrKCk7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIHRoYXQgYWxsIGdsaXRjaCBjYXNlcyBhcmUgY292ZXJlZAorICAgICAgICBpZiAoc3RkOjphY2N1bXVsYXRlKHBlcmlvZHMuYmVnaW4oKSwgcGVyaW9kcy5lbmQoKSwgMCkgPiBrTnVtQnVmZiAqIGtQZXJpb2RNcyArCisgICAgICAgICAgICBrUGVyaW9kTXMgLSBrUGVyaW9kTXNDUFUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQSBnbGl0Y2ggb2NjdXJyZWQiKTsKKyAgICAgICAgICAgICAgICBwZXJpb2RzLmFzc2lnbihrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggNDc0N2RjZi4uNzExODJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggNTA4ZTBmZS4uOGEzZmZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDU2YTJhMzguLjM0OGI0ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKaW5kZXggOTdhNTdlMC4uNTM1ZTNmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU2luayB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1dSSVRFIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCmluZGV4IDRmYmRiNGIuLmJjNmFhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU291cmNlIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fUkVBRCBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNzg1YjljMi4uM2U0OGVlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNDMsOCArNDQsNiBAQAogY2xhc3MgV3JpdGVyOwogY2xhc3MgUmVhZGVyOwogCi1wcml2YXRlOgotCiBlbnVtIEV2ZW50IDogdWludDhfdCB7CiAgICAgRVZFTlRfUkVTRVJWRUQsCiAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCkBAIC01OSwxMiArNTgsMTMgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAogICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKIAogICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKIH07CiAKK3ByaXZhdGU6CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwpAQCAtMjQ4LDYgKzI0OCw4IEBACiAgICAgaW50IGF1dGhvcjsKIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAordXNpbmcgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciA9IEhpc3RUc0VudHJ5V2l0aEF1dGhvcjsKKwogc3RydWN0IEhpc3RJbnRFbnRyeSB7CiAgICAgbG9nX2hhc2hfdCBoYXNoOwogICAgIGludCB2YWx1ZTsKQEAgLTM0MSw4ICszNDMsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwogCiAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwogCkBAIC00MDcsNiArNDA4LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKICAgICBjbGFzcyBTbmFwc2hvdCB7CiAgICAgcHVibGljOgogICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CkBAIC00NDMsMjAgKzQ0NSwxNyBAQAogCiAgICAgdmlydHVhbCB+UmVhZGVyKCk7CiAKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpOwotCiAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwogICAgIC8vIGR1bXAgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAvLyBUT0RPOiBtb3ZlIGR1bXAgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4gTW9kZWwvdmlldy9jb250cm9sbGVyIGRlc2lnbgogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBTbmFwc2hvdCAmIHNuYXApOwogICAgIC8vIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIChjYWxsIGdldFNuYXBzaG90KCkgYW5kIHByZXZpb3VzIGR1bXAoKSkKICAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOwogICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0gICAgLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKLSAgICB2b2lkICAgICBzZXRGaW5kR2xpdGNoKGJvb2wgcyk7Ci0gICAgYm9vbCAgICAgaXNGaW5kR2xpdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CkBAIC00NjksMTAgKzQ2OCw2IEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAotICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKLSAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KLSAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0ODAsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU1NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJOQkxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMgeworICAgIC8vIFRoaXMgY2xhc3Mgc3RvcmVzIGFuZCBhbmFseXplcyBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzIGZyb20gTkJMb2cKKyAgICAvLyBGSVhNRTogY3VycmVudGx5LCBhbGwgcGVyZm9ybWFuY2UgZGF0YSBpcyBzdG9yZWQgaW4gZGVxdWVzLiBOZWVkIHRvIGFkZCBhIG11dGV4LgorICAgIC8vIEZJWE1FOiBjb250aW51ZSB0aGlzIHdheSB1bnRpbCBhbmFseXNpcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBUaGVuLCB1c2UKKyAgICAvLyB0aGUgZmlmbyB3cml0ZXIgdXRpbGl0aWVzLgorcHVibGljOgorCisgICAgUGVyZm9ybWFuY2VBbmFseXNpcygpOworCisgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCisgICAgdHlwZWRlZiB1aW50NjRfdCBsb2dfaGFzaF90OworCisgICAgLy8gc3RvcmVzIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0gb2Ygc2l6ZSBkZXRlcm1pbmVkIGJ5IGtTaG9ydEhpc3RTaXplCisgICAgLy8ga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kLiB2YWx1ZTogY291bnQKKyAgICAvLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBuYW1lIHRvIGhpc3RvZ3JhbQorICAgIHVzaW5nIHNob3J0X2hpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKworICAgIHVzaW5nIG91dGxpZXJJbnRlcnZhbCA9IHVpbnQ2NF90OworICAgIC8vIGludDY0X3QgdGltZXN0YW1wcyBhcmUgY29udmVydGVkIHRvIHVpbnQ2NF90IGluIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnN0b3JlT3V0bGllckRhdGEsCisgICAgLy8gYW5kIGFsbCBmdXJ0aGVyIGFuYWx5c2lzIGZ1bmN0aW9ucyB1c2UgdWludDY0X3QuCisgICAgdXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7CisgICAgdXNpbmcgdGltZXN0YW1wX3JhdyA9IGludDY0X3Q7CisKKyAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKKyAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcyhpbnQgYXV0aG9yKTsKKworICAgIC8vIENhbGxlZCB3aGVuIGFuIGF1ZGlvIG9uL29mZiBldmVudCBpcyByZWFkIGZyb20gdGhlIGJ1ZmZlcgorICAgIC8vIGNhbGxzIGZsdXNoVGltZVN0YW1wU2VyaWVzIG9uIHRoZSBkYXRhIHVwIHRvIHRoZSBldmVudCwKKyAgICAvLyBlZmZlY3RpdmVseSBza2lwcGluZyBvdmVyIHRoZSBpZGxlIGF1ZGlvIHRpbWUgaW50ZXJ2YWwKKyAgICAvLyB3aGVuIHdyaXRpbmcgYnVmZmVyIHBlcmlvZCBkYXRhIHRvIG1lbW9yeS4KKyAgICB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlKGludCBhdXRob3IpOworCisgICAgLy8gV3JpdGVzIHdha2V1cCB0aW1lc3RhbXAgZW50cnkgdG8gbG9nIGFuZCBydW5zIGFuYWx5c2lzCisgICAgLy8gYXV0aG9yIGlzIHRoZSB0aHJlYWQgSUQKKyAgICAvLyBUT0RPOiBjaGVjay4gaWYgdGhlIHRocmVhZCBoYXMgbXVsdGlwbGUgaGlzdG9ncmFtcywgaXMgYXV0aG9yIGluZm8gY29ycmVjdAorICAgIC8vIEZJWE1FOiByZW1vdmUgYXV0aG9yIGZyb20gYXJnbGlzdC4gV2FudCB0byBjYWxsIHRoZXNlIGZ1bmN0aW9uIHNlcGFyYXRlbHkgb24KKyAgICAvLyBlYWNoIHRocmVhZOKAmXMgZGF0YS4KKyAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gc3RvcmUgdGhlIGhhc2ggKHNvdXJjZSBmaWxlIGxvY2F0aW9uKSBpbnN0ZWFkCisgICAgLy8gRklYTUU6IElmIHRocmVhZCBoYXMgbXVsdGlwbGUgaGlzdG9ncmFtcywgY2hlY2sgdGhhdCBjb2RlIHdvcmtzIGFuZCBjb3JyZWN0CisgICAgLy8gYXV0aG9yIGlzIHN0b3JlZCAodGVzdCB3aXRoIG11bHRpcGxlIHRocmVhZHMpLiBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAvLyBjb2RlIGlzIG5vdCByZWNlaXZpbmcgZGF0YSBmcm9tIG11bHRpcGxlIHRocmVhZHMuIFRoaXMgY291bGQgY2F1c2Ugb2RkIHZhbHVlcy4KKyAgICB2b2lkIGxvZ1RzRW50cnkoaW50IGF1dGhvciwgdGltZXN0YW1wX3JhdyB0cyk7CisKKyAgICAvLyBGSVhNRTogbWFrZSBwZWFrZGV0ZWN0b3IgYW5kIHN0b3JlT3V0bGllckRhdGEgYSBzaW5nbGUgZnVuY3Rpb24KKyAgICAvLyBJbnB1dDogbU91dGxpZXJEYXRhLiBMb29rcyBhdCB0aW1lIGVsYXBzZWQgYmV0d2VlbiBvdXRsaWVycworICAgIC8vIGZpbmRzIHNpZ25pZmljYW50IGNoYW5nZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbgorICAgIC8vIHdyaXRlcyB0aW1lc3RhbXBzIG9mIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gbVBlYWtUaW1lc3RhbXBzCisgICAgdm9pZCBkZXRlY3RQZWFrcygpOworCisgICAgLy8gcnVucyBhbmFseXNpcyBvbiB0aW1lc3RhbXAgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBoaXN0b2dyYW0KKyAgICAvLyBmaW5kcyBvdXRsaWVycworICAgIC8vIHdyaXRlcyB0byBtT3V0bGllckRhdGEgPHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyLCBvdXRsaWVyIHRpbWVzdGFtcD4KKyAgICB2b2lkIHN0b3JlT3V0bGllckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnRpbWVzdGFtcHMpOworCisgICAgLy8gaW5wdXQ6IHNlcmllcyBvZiBzaG9ydCBoaXN0b2dyYW1zLiBHZW5lcmF0ZXMgYSBzdHJpbmcgb2YgYW5hbHlzaXMgb2YgdGhlIGJ1ZmZlciBwZXJpb2RzCisgICAgLy8gVE9ETzogV0lQIHdyaXRlIG1vcmUgZGV0YWlsZWQgYW5hbHlzaXMKKyAgICAvLyBGSVhNRTogbW92ZSB0aGlzIGRhdGEgdmlzdWFsaXphdGlvbiB0byBhIHNlcGFyYXRlIGNsYXNzLiBNb2RlbC92aWV3L2NvbnRyb2xsZXIKKyAgICB2b2lkIHJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBtYXhIZWlnaHQgPSAxMCk7CisKKyAgICAvLyBUT0RPOiBkZWxldGUgdGhpcy4gdGVtcCBmb3IgdGVzdGluZworICAgIHZvaWQgdGVzdEZ1bmN0aW9uKCk7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZWN0IGdsaXRjaGVzIGluIGEgdGltZSBzZXJpZXMKKyAgICAvLyBUT0RPIGluY29ycG9yYXRlIHRoaXMgaW50byB0aGUgYW5hbHlzaXMgKGN1cnJlbnRseSB1bnVzZWQpCisgICAgdm9pZCAgICAgYWxlcnRJZkdsaXRjaChjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmc2FtcGxlcyk7CisKKyAgICB+UGVyZm9ybWFuY2VBbmFseXNpcygpIHt9CisKK3ByaXZhdGU6CisKKyAgICAvLyBzdG9yZXMgb3V0bGllciBhbmFseXNpczogPGVsYXBzZWQgdGltZSBiZXR3ZWVuIG91dGxpZXJzIGluIG1zLCBvdXRsaWVyIHRpbWVzdGFtcD4KKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+IG1PdXRsaWVyRGF0YTsKKworICAgIC8vIHN0b3JlcyBlYWNoIHRpbWVzdGFtcCBhdCB3aGljaCBhIHBlYWsgd2FzIGRldGVjdGVkCisgICAgLy8gYSBwZWFrIGlzIGEgbW9tZW50IGF0IHdoaWNoIHRoZSBhdmVyYWdlIG91dGxpZXIgaW50ZXJ2YWwgY2hhbmdlZCBzaWduaWZpY2FudGx5CisgICAgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+IG1QZWFrVGltZXN0YW1wczsKKworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIGhhc2ggYW5kIHRocmVhZCBkYXRhCisgICAgLy8gVE9ETzogVHVybiBpdCBpbnRvIGEgY2lyY3VsYXIgYnVmZmVyIGZvciBiZXR0ZXIgZGF0YSBmbG93CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8aW50LCBzaG9ydF9oaXN0b2dyYW0+PiBtUmVjZW50SGlzdHM7CisKKyAgICAvLyBtYXAgZnJvbSBhdXRob3IgdG8gdmVjdG9yIG9mIHRpbWVzdGFtcHMsIGNvbGxlY3RlZCBmcm9tIE5CTG9nCisgICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIGFuYWx5c2lzIGlzIHJ1biBhbmQgdGhlIGRhdGEgaXMgZGVsZXRlZAorICAgIHN0ZDo6bWFwPGludCwgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4+IG1UaW1lU3RhbXBTZXJpZXM7CisKKyAgICAvLyBUT0RPOiBtZWFzdXJlIHRoZXNlIGZyb20gdGhlIGRhdGEgKGUuZy4sIG1vZGUpIGFzIHRoZXkgbWF5IGNoYW5nZS4KKyAgICAvLyBjb25zdCBpbnQga0dsaXRjaFRocmVzaE1zID0gNzsKKyAgICAvLyBjb25zdCBpbnQga01zUGVyU2VjID0gMTAwMDsKKworICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycworICAgIC8vIFRPRE86IGxlYXJuIHNvbWUgb2YgdGhlc2UgZnJvbSB0aGUgZGF0YSwgZGVsZXRlIHVudXNlZCBvbmVzCisgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIG1ha2Uga1BlcmlvZE1zIHN0YXRpYy4KKyAgICAvLyBUaGUgbm9uLWNvbnN0IHZhbHVlcyBhcmUgKFRPRE86IHdpbGwgYmUpIGxlYXJuZWQgZnJvbSB0aGUgZGF0YQorICAgIHN0YXRpYyBjb25zdCBpbnQga051bUJ1ZmYgPSAzOyAvLyBudW1iZXIgb2YgYnVmZmVycyBjb25zaWRlcmVkIGluIGxvY2FsIGhpc3RvcnkKKyAgICBpbnQga1BlcmlvZE1zOyAvLyBjdXJyZW50IHBlcmlvZCBsZW5ndGggaXMgaWRlYWxseSA0IG1zCisgICAgc3RhdGljIGNvbnN0IGludCBrT3V0bGllck1zID0gNzsgLy8gdmFsdWVzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhpcyBjYXVzZSBnbGl0Y2hlcworICAgIC8vIERBQyBwcm9jZXNzaW5nIHRpbWUgZm9yIDQgbXMgYnVmZmVyCisgICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUga1JhdGlvID0gMC43NTsgLy8gZXN0aW1hdGUgb2YgQ1BVIHRpbWUgYXMgcmF0aW8gb2YgcGVyaW9kIGxlbmd0aAorICAgIGludCBrUGVyaW9kTXNDUFU7IC8vIGNvbXB1dGUgYmFzZWQgb24ga1BlcmlvZExlbiBhbmQga1JhdGlvCisKKyAgICAvLyBQZWFrIGRldGVjdGlvbjogbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSBtZWFuIGNvbnNpZGVyZWQgYSBzaWduaWZpY2FudCBjaGFuZ2UKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTdGRkZXZUaHJlc2hvbGQgPSA1OworCisgICAgc3RhdGljIGNvbnN0IGludCBrUmVjZW50SGlzdHNDYXBhY2l0eSA9IDEwMDsgLy8gbnVtYmVyIG9mIHNob3J0LXRlcm0gaGlzdG9ncmFtcyBzdG9yZWQgaW4gbWVtb3J5CisgICAgc3RhdGljIGNvbnN0IGludCBrU2hvcnRIaXN0U2l6ZSA9IDUwOyAvLyBudW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHNob3J0LXRlcm0gaGlzdG9ncmFtCisKKyAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KKyAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAorICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOworICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKKyAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKKyAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7CisgICAgaW50NjRfdCBtUHJldk5zID0gLTE7CisKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA1OGI5NzUwLi4wNDMxOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX1BJUEVfSAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGFlNDk5MDMuLmNjMmQwMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAjZGVmaW5lIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggNjBhZTkyZS4uYzUxZDBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlUmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkFJTy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCAwZDk2OTZmLi4zYzdhZTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bnVtZXJpYz4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTM0LDggKzM0LDExIEBACiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci11c2luZyBNZWRpYURlc2NyYW1ibGVyOjpEZXNjcmFtYmxlSW5mbzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKIHVzaW5nIEJ1ZmZlckluZm8gPSBBQ29kZWNCdWZmZXJDaGFubmVsOjpCdWZmZXJJbmZvOwogdXNpbmcgQnVmZmVySW5mb0l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8Y29uc3QgQnVmZmVySW5mbz46OmNvbnN0X2l0ZXJhdG9yOwogCkBAIC0xMTQsNzQgKzExNyw5NyBAQAogICAgICAgICByZXR1cm4gLUVOT0VOVDsKICAgICB9CiAKLSAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNlY3VyZUhhbmRsZSA9IE5VTEw7CiAgICAgaWYgKHNlY3VyZSkgewogICAgICAgICBzcDxTZWN1cmVCdWZmZXI+IHNlY3VyZURhdGEgPQogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlY3VyZUJ1ZmZlciAqPihpdC0+bUNvZGVjQnVmZmVyLmdldCgpKTsKLSAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblR5cGUoKTsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlICE9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKKyAgICAgICAgaWYgKHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uVHlwZSgpICE9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uUG9pbnRlcigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnkgPSBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KLQotICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7Ci0gICAgc291cmNlLm1TaGFyZWRNZW1vcnkgPSBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKLSAgICBzb3VyY2UubUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKLQogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CiAgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9IHNlY3VyZUhhbmRsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnkgPSBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgSUNyeXB0bzo6U291cmNlQnVmZmVyIHNvdXJjZTsKKyAgICAgICAgc291cmNlLm1TaGFyZWRNZW1vcnkgPSBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKKyAgICAgICAgc291cmNlLm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07CisKICAgICAgICAgcmVzdWx0ID0gbUNyeXB0by0+ZGVjcnlwdChrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLAogICAgICAgICAgICAgICAgIHNvdXJjZSwgaXQtPm1DbGllbnRCdWZmZXItPm9mZnNldCgpLAogICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRGVzY3JhbWJsZUluZm8gZGVzY3JhbWJsZUluZm87Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLmRzdFR5cGUgPSBkZXN0aW5hdGlvbi5tVHlwZSA9PQotICAgICAgICAgICAgICAgIElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkgPwotICAgICAgICAgICAgICAgIERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyIDoKLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc2NyYW1ibGluZ0NvbnRyb2wgPSBrZXkgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOgotICAgICAgICAgICAgICAgIERlc2NyYW1ibGVyUGx1Z2luOjprU2NyYW1ibGluZ19VbnNjcmFtYmxlZDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8ubnVtU3ViU2FtcGxlcyA9IG51bVN1YlNhbXBsZXM7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnN1YlNhbXBsZXMgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqKXN1YlNhbXBsZXM7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNyY01lbSA9IGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zcmNPZmZzZXQgPSAwOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5kc3RQdHIgPSBOVUxMOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5kc3RPZmZzZXQgPSAwOwotCi0gICAgICAgIGludDMyX3QgZGVzY3JhbWJsZVJlc3VsdCA9IC0xOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKGRlc2NyYW1ibGVJbmZvLCAmZGVzY3JhbWJsZVJlc3VsdCk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGRlc2NyYW1ibGVSZXN1bHQ7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRlc2NyYW1ibGUgZmFpbGVkLCBleGNlcHRpb25Db2RlPSVkLCBlcnI9JWQsIHJlc3VsdD0lemQiLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpLCByZXN1bHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCByZXN1bHQ9JXpkIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocmVzdWx0ID4gMCAmJiBkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7Ci0gICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeS0+cG9pbnRlcigpLAorICAgICAgICBpZiAoZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgeworICAgICAgICAgICAgbWVtY3B5KGl0LT5tQ29kZWNCdWZmZXItPmJhc2UoKSwgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeS0+cG9pbnRlcigpLCByZXN1bHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSGVyZSB3ZSBjYXN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIHRvIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U3ViU2FtcGxlCisgICAgICAgIC8vIGRpcmVjdGx5LCB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCBhcyBjaGVja2VkIGluIERlc2NyYW1ibGVySW1wbC5jcHAuCisgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gaGlkbFN1YlNhbXBsZXM7CisgICAgICAgIGhpZGxTdWJTYW1wbGVzLnNldFRvRXh0ZXJuYWwoKFN1YlNhbXBsZSAqKXN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGZhbHNlIC8qb3duKi8pOworCisgICAgICAgIHNzaXplX3Qgb2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXItPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIHNyY0J1ZmZlciA9IHsKKyAgICAgICAgICAgICAgICAuaGVhcEJhc2UgPSBtSGlkbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQsCisgICAgICAgICAgICAgICAgLnNpemUgPSBzaXplCisgICAgICAgIH07CisKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEU7CisgICAgICAgICAgICBkc3RCdWZmZXIuc2VjdXJlTWVtb3J5ID0gaGlkbF9oYW5kbGUoc2VjdXJlSGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBzcmNCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAga2V5ICE9IE5VTEwgPyAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdIDogU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVELAorICAgICAgICAgICAgICAgIGhpZGxTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVzdWx0LCAmZGV0YWlsZWRFcnJvcl0gKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHNzaXplX3QpX2J5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0sgfHwgcmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkLCByZXN1bHQ9JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cywgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOworCisgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CisgICAgICAgICAgICBtZW1jcHkoaXQtPm1Db2RlY0J1ZmZlci0+YmFzZSgpLAogICAgICAgICAgICAgICAgICAgICAodWludDhfdCopaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXItPnBvaW50ZXIoKSwgcmVzdWx0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKLSAgICAgICAgbWVtY3B5KGl0LT5tQ29kZWNCdWZmZXItPmJhc2UoKSwgZGVzdGluYXRpb24ubVNoYXJlZE1lbW9yeS0+cG9pbnRlcigpLCByZXN1bHQpOwotICAgIH0KLQogICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CiAKICAgICAvLyBDb3B5IG1ldGFkYXRhIGZyb20gY2xpZW50IHRvIGNvZGVjIGJ1ZmZlci4KQEAgLTI3NSwxMCArMzAxLDIxIEBACiAgICAgICAgIGludDMyX3Qgc2VxTnVtID0gbUNyeXB0by0+c2V0SGVhcChkZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CiAgICAgICAgIGlmIChzZXFOdW0gPj0gMCkgewogICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBzZXFOdW07Ci0gICAgICAgICAgICBBTE9HRCgic2V0SGVhcCByZXR1cm5lZCBtSGVhcFNlcU51bT0lZCIsIG1IZWFwU2VxTnVtKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRIZWFwIHJldHVybmVkIG1IZWFwU2VxTnVtPSVkIiwgbUhlYXBTZXFOdW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKLSAgICAgICAgICAgIEFMT0dEKCJzZXRIZWFwIGZhaWxlZCwgc2V0dGluZyBtSGVhcFNlcU51bT0tMSIpOworICAgICAgICAgICAgQUxPR0UoInNldEhlYXAgZmFpbGVkLCBzZXR0aW5nIG1IZWFwU2VxTnVtPS0xIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1EZXNjcmFtYmxlciAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gZGVhbGVyLT5nZXRNZW1vcnlIZWFwKCk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgICAgIGlmIChuYXRpdmVIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW50IGZkID0gaGVhcC0+Z2V0SGVhcElEKCk7CisgICAgICAgICAgICBuYXRpdmVIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICAgICAgICAgIG1IaWRsTWVtb3J5ID0gaGlkbF9tZW1vcnkoImFzaG1lbSIsIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlZCBoaWRsX21lbW9yeSBmb3IgZGVzY3JhbWJsZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIGhpZGxfbWVtb3J5IGZvciBkZXNjcmFtYmxlciIpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZWFsZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCA2Y2MxYWNlLi4yMDQxYjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDcgQEAKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCiAgICAgICAgICJBdWRpb1NvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVySW1wbC5jcHAiLAorICAgICAgICAiQ29kZWNCYXNlLmNwcCIsCiAgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCIsCkBAIC0xMDQsNiArMTA1LDkgQEAKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjEwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNCYXNlIgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBCdWZmZXJDaGFubmVsQmFzZTo6c2V0Q3J5cHRvKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pIHsKKyAgICBtQ3J5cHRvID0gY3J5cHRvOworfQorCit2b2lkIEJ1ZmZlckNoYW5uZWxCYXNlOjpzZXREZXNjcmFtYmxlcihjb25zdCBzcDxJRGVzY3JhbWJsZXI+ICZkZXNjcmFtYmxlcikgeworICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcAppbmRleCA5MTc4NzBmLi4xYWEzYmFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKQEAgLTg4LDcgKzg4LDkgQEAKIAogc3RhdHVzX3QgRnJhbWVSZW5kZXJUcmFja2VyOjpvbkZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKSB7CiAgICAgLy8gZW5zdXJlIG1vbm90b25pYyB0aW1lc3RhbXBzCi0gICAgaWYgKG1MYXN0UmVuZGVyVGltZU5zID49IHN5c3RlbU5hbm8pIHsKKyAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPiBzeXN0ZW1OYW5vIHx8CisgICAgICAgIC8vIEVPUyBpcyBub3JtYWxseSBtYXJrZWQgb24gdGhlIGxhc3QgZnJhbWUKKyAgICAgICAgKG1MYXN0UmVuZGVyVGltZU5zID09IHN5c3RlbU5hbm8gJiYgbWVkaWFUaW1lVXMgIT0gSU5UNjRfTUFYKSkgewogICAgICAgICBBTE9HVygiWyVzXSBJZ25vcmluZyBvdXQgb2Ygb3JkZXIvc3RhbGUgc3lzdGVtIG5hbm8gJWxsZCBmb3IgbWVkaWEgdGltZSAlbGxkIGZyb20gY29kZWMuIiwKICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXN5c3RlbU5hbm8sIChsb25nIGxvbmcpbWVkaWFUaW1lVXMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCBiZDcxNjMyLi45OGQxMDFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMjMsNyArMjMsOCBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNTFmMWJhMy4uNjQwY2I4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51TWVkaWFFeHRyYWN0b3IiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Myw4ICs4Miw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTE5LDggKzExOCw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTQ5LDggKzE0OCw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBpZiAobUNhcyAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzKTsKKyAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwogICAgIH0KIAogICAgIGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwpAQCAtMTYxLDI0ICsxNjAsMzYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSB7Ci0gICAgQUxPR1YoInNldE1lZGlhQ2FzOiBjYXM9JXAiLCBjYXMuZ2V0KCkpOworc3RhdGljIFN0cmluZzggYXJyYXlUb1N0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYXJyYXkpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgYXJyYXlbaV0pOworICAgIH0KKyAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEFMT0dWKCJzZXRNZWRpYUNhczogY2FzVG9rZW49eyVzfSIsIGFycmF5VG9TdHJpbmcoY2FzVG9rZW4pLmNfc3RyKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmIChjYXMgPT0gTlVMTCkgeworICAgIGlmIChjYXNUb2tlbi5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgbUNhc1Rva2VuID0gY2FzVG9rZW47CisKICAgICBpZiAobUltcGwgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMoY2FzKTsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKGNhc1Rva2VuKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtQ2FzID0gY2FzOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCA5ZmJkYjcyLi5lMGMwYzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMjE4LDYgKzIxOCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QUFDMjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoICgoT01YX1UzMikgaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBQUMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpAQCAtMzQyLDYgKzM2NiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FBQykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IDc1NTMxNTMuLmI3ZTg0ZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtMTQzLDYgKzE0MywzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QU1SOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nQU1SIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphbXJQYXJhbXMgPQpAQCAtMjM2LDYgKzI2MCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FNUikKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCBmODk2ODhjLi5jZmY0YTMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtNjgsNyArNjgsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLm5CdWZmZXJTaXplID0gMzI3Njg7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggZjdjMDQyOS4uN2E0Y2NhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMDUsNiArMTA1LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRHNzExOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nRzcxMSA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNzMsNiArMTk3LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nRzcxMSkKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCAxMTk5OWI0Li5kNzc3MjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0R1NNOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nR1NNRlIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTY0LDYgKzE4OCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0dTTUZSKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCAzZGVmMWYwLi4yMzY0Njg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTEzNCw2ICsxMzQsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdE1QMzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ01QMyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0yMDgsNiArMjMyLDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nTVAzKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKaW5kZXggMmFjNmNlMC4uZDFmNWU1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC0xMjksNiArMTI5LDMxIEBACiBPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVMgOgorICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CkBAIC0yMTIsNiArMjM3LDMwIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKaW5kZXggYWNiMmIzNy4uMWE1MjdiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCkBAIC02MCw3ICs2MCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDMyICogMTAyNDsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpAQCAtNzgsNyArNzgsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDY0ICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC0xMDAsNiArMTAwLDI4IEBACiBPTVhfRVJST1JUWVBFIFNvZnRSYXc6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0xNTMsNiArMTc1LDI2IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCmluZGV4IDE0ZGQyNTAuLjk2ZTAxYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0xMjksNiArMTI5LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRWb3JiaXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdWT1JCSVMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CkBAIC0yMjEsNiArMjQ1LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nVk9SQklTKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggOTE0NjJjOC4uOTEwOGNlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMSw3ICsxLDEyIEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLQogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLApAQCAtMTEsMTIgKzE2LDEzIEBACiAgICAgICAgICJpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCAwZGEyZTgxLi5mMjUzYTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKKwogLyoqCiAgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUNvZGVjLgogICovCkBAIC0xMTcsNiArMTE5LDcgQEAKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKICAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworICAgIGhpZGxfbWVtb3J5IG1IaWRsTWVtb3J5OwogCiAgICAgLy8gVGhlc2Ugc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHN0ZDo6YXRvbWljXyogZnVuY3Rpb25zLgogICAgIC8vCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IDJhNzUyOThmLi5hYzkzYjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtNDUsNyArNDUsNyBAQAogCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAwZGQ3N2JhLi42MjQ1Y2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI0LDI3ICsyNCwzMSBAQAogCiAjZGVmaW5lIFNUUklOR0lGWV9FTlVNUwogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBCdWZmZXJQcm9kdWNlcldyYXBwZXI7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogc3RydWN0IFJlbmRlcmVkRnJhbWVJbmZvOwogY2xhc3MgU3VyZmFjZTsKK3N0cnVjdCBJQ3J5cHRvOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIsIC8qIHN0YXRpYyAqLyBDb2xvclV0aWxzIHsKICAgICAvKioKQEAgLTI1NiwxMyArMjYwLDkgQEAKICAgICAgICAgbUNhbGxiYWNrID0gc3RkOjptb3ZlKGNhbGxiYWNrKTsKICAgICB9CiAKLSAgICBpbmxpbmUgdm9pZCBzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgewotICAgICAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIH0KKyAgICB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKTsKIAotICAgIGlubGluZSB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7Ci0gICAgICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOwotICAgIH0KKyAgICB2b2lkIHNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKTsKIAogICAgIC8qKgogICAgICAqIFF1ZXVlIGFuIGlucHV0IGJ1ZmZlciBpbnRvIHRoZSBidWZmZXIgY2hhbm5lbC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggNDE0MDI2Ni4uMjA5ZmUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTQ3LDEwICs0NywxMyBAQAogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKIGNsYXNzIFN1cmZhY2U7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgTWVkaWFDb2RlYyA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBDb25maWd1cmVGbGFncyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggMmU2NjNlYy4uNmE1YzZiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtNzksNiArNzksMjYgQEAKICAgICBIRUFSVEJFQVRfRVJST1JfQkFTRSA9IC0zMDAwLAogICAgIEVSUk9SX0hFQVJUQkVBVF9URVJNSU5BVEVfUkVRVUVTVEVEICAgICAgICAgICAgICAgICAgICAgPSBIRUFSVEJFQVRfRVJST1JfQkFTRSwKIAorICAgIC8vIENBUy1yZWxhdGVkIGVycm9yIGNvZGVzCisgICAgQ0FTX0VSUk9SX0JBU0UgPSAtNDAwMCwKKworICAgIEVSUk9SX0NBU19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSwKKyAgICBFUlJPUl9DQVNfTk9fTElDRU5TRSAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxLAorICAgIEVSUk9SX0NBU19MSUNFTlNFX0VYUElSRUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDIsCisgICAgRVJST1JfQ0FTX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMywKKyAgICBFUlJPUl9DQVNfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCAgID0gQ0FTX0VSUk9SX0JBU0UgLSA0LAorICAgIEVSUk9SX0NBU19ERUNSWVBUICAgICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDUsCisgICAgRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNiwKKyAgICBFUlJPUl9DQVNfVEFNUEVSX0RFVEVDVEVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA3LAorICAgIEVSUk9SX0NBU19OT1RfUFJPVklTSU9ORUQgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDgsCisgICAgRVJST1JfQ0FTX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOSwKKyAgICBFUlJPUl9DQVNfUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMCwKKyAgICBFUlJPUl9DQVNfSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9DQVNfTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKKworICAgIEVSUk9SX0NBU19WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDUwMCwKKyAgICBFUlJPUl9DQVNfVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA5OTksCisKICAgICAvLyBOREsgRXJyb3IgY29kZXMKICAgICAvLyBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaAogICAgIC8vIGZyb20gLTEwMDAwICgweEZGRkZEOEYwIC0gMHhGRkZGRDhFQykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCBhODU2YjJiLi5mMTIxNjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC0yMywxMCArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IE1lZGlhU291cmNlOwogY2xhc3MgTWV0YURhdGE7CkBAIC03MCw3ICs2Niw3IEBACiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgLyp1aWQqLykgewogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+JiAvKmNhcyovKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJi8qY2FzVG9rZW4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDNlM2NjMTcuLjZhOTNiZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0yOCwxMCArMjgsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX0KLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC02NCw3ICs2MCw3IEBACiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhc291cmNlKTsKIAotICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpOworICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCwgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKQEAgLTExNSw3ICsxMTEsNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogCiAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKLSAgICBzcDxJQ2FzPiBtQ2FzOworICAgIEhJbnRlcmZhY2VUb2tlbiBtQ2FzVG9rZW47CiAKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtU2VsZWN0ZWRUcmFja3M7CiAgICAgaW50NjRfdCBtVG90YWxCaXRyYXRlOyAgLy8gaW4gYml0cy9zZWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCAzMWVkYjIxLi5hMjU2YTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSAiRVNRdWV1ZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQxLDggKzQxLDEyIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci11c2luZyBNZWRpYURlc2NyYW1ibGVyOjpEZXNjcmFtYmxlSW5mbzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKIAogLy8gSSB3YW50IHRoZSBleHByZXNzaW9uICJ5IiBldmFsdWF0ZWQgZXZlbiBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgb2ZmLgogI2RlZmluZSBNWV9MT0dWKHgsIHkpIFwKQEAgLTIwMyw2ICsyMDcsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtU2FtcGxlQWVzS2V5SXRlbTsKICAgICBzcDxJTWVtb3J5PiBtTWVtOwogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBtRGVzY3JhbWJsZXJTcmNCdWZmZXI7CiAgICAgc3A8QUJ1ZmZlcj4gbURlc2NyYW1ibGVkQnVmZmVyOwogICAgIExpc3Q8U3ViU2FtcGxlSW5mbz4gbVN1YlNhbXBsZXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CkBAIC0yMzUsNyArMjQwLDcgQEAKIAogICAgIC8vIEVuc3VyZSBpbnRlcm5hbCBidWZmZXJzIGNhbiBob2xkIHNwZWNpZmllZCBzaXplLCBhbmQgd2lsbCByZS1hbGxvY2F0ZQogICAgIC8vIGFzIG5lZWRlZC4KLSAgICB2b2lkIGVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBzaXplKTsKKyAgICBib29sIGVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBzaXplKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmVhbSk7CiB9OwpAQCAtODA3LDkgKzgxMiw5IEBACiAgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAotdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6ZW5zdXJlQnVmZmVyQ2FwYWNpdHkoc2l6ZV90IG5lZWRlZFNpemUpIHsKK2Jvb2wgQVRTUGFyc2VyOjpTdHJlYW06OmVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBuZWVkZWRTaXplKSB7CiAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCAmJiBtQnVmZmVyLT5jYXBhY2l0eSgpID49IG5lZWRlZFNpemUpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBBTE9HVigiZW5zdXJlQnVmZmVyQ2FwYWNpdHk6IGN1cnJlbnQgc2l6ZSAlenUsIG5ldyBzaXplICV6dSwgc2NyYW1ibGVkICVkIiwKQEAgLTgzNyw2ICs4NDIsMjYgQEAKICAgICAgICAgbU1lbSA9IG5ld01lbTsKICAgICAgICAgbURlYWxlciA9IG5ld0RlYWxlcjsKICAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyID0gbmV3U2NyYW1ibGVkQnVmZmVyOworCisgICAgICAgIHNzaXplX3Qgb2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBuZXdNZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisgICAgICAgIGlmIChoZWFwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgICAgICBpZiAoIW5hdGl2ZUhhbmRsZSkgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGZhaWxlZCB0byBjcmVhdGUgbmF0aXZlIGhhbmRsZSIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVIYW5kbGUtPmRhdGFbMF0gPSBoZWFwLT5nZXRIZWFwSUQoKTsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gaGlkbF9tZW1vcnkoImFzaG1lbSIsCisgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUobmF0aXZlSGFuZGxlKSwgaGVhcC0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKKworICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBBbGlnbiB0byBtdWx0aXBsZXMgb2YgNjRLLgogICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7CkBAIC04NTAsNiArODc1LDcgQEAKICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICB9CiAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdHVzX3QgQVRTUGFyc2VyOjpTdHJlYW06OnBhcnNlKApAQCAtOTIzLDcgKzk0OSw5IEBACiAgICAgfQogCiAgICAgc2l6ZV90IG5lZWRlZFNpemUgPSBtQnVmZmVyLT5zaXplKCkgKyBwYXlsb2FkU2l6ZUJpdHMgLyA4OwotICAgIGVuc3VyZUJ1ZmZlckNhcGFjaXR5KG5lZWRlZFNpemUpOworICAgIGlmICghZW5zdXJlQnVmZmVyQ2FwYWNpdHkobmVlZGVkU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CiAKICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLCBici0+ZGF0YSgpLCBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgKyBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKQEAgLTEzNjUsNDcgKzEzOTMsNTkgQEAKICAgICAgICAgbWVtY3B5KG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgZGVzY3JhbWJsZUJ5dGVzKTsKIAotICAgICAgICBzcDxBQnVmZmVyPiBzdWJTYW1wbGVzID0gbmV3IEFCdWZmZXIoCi0gICAgICAgICAgICAgICAgc2l6ZW9mKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUpICogZGVzY3JhbWJsZVN1YlNhbXBsZXMpOwotCi0gICAgICAgIERlc2NyYW1ibGVJbmZvIGluZm87Ci0gICAgICAgIGluZm8uZHN0VHlwZSA9IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyOwotICAgICAgICBpbmZvLnNjcmFtYmxpbmdDb250cm9sID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbClzY3RybDsKLSAgICAgICAgaW5mby5udW1TdWJTYW1wbGVzID0gZGVzY3JhbWJsZVN1YlNhbXBsZXM7Ci0gICAgICAgIGluZm8uc3ViU2FtcGxlcyA9IChEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICopc3ViU2FtcGxlcy0+ZGF0YSgpOwotICAgICAgICBpbmZvLnNyY01lbSA9IG1NZW07Ci0gICAgICAgIGluZm8uc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgaW5mby5kc3RQdHIgPSBOVUxMOyAvLyBpbi1wbGFjZSBkZXNjcmFtYmxpbmcgaW50byBzcmNNZW0KLSAgICAgICAgaW5mby5kc3RPZmZzZXQgPSAwOworICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CisgICAgICAgIHN1YlNhbXBsZXMucmVzaXplKGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKIAogICAgICAgICBpbnQzMl90IGkgPSAwOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpICYmIGkgPCBkZXNjcmFtYmxlU3ViU2FtcGxlczsgaXQrKywgaSsrKSB7CiAgICAgICAgICAgICBpZiAoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgIT0gMCB8fCBwZXNTY3JhbWJsaW5nQ29udHJvbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhID0gMDsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gMDsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gaXQtPnN1YlNhbXBsZVNpemU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOwotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSAwOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3Qgc3JjT2Zmc2V0ID0gMCwgZHN0T2Zmc2V0ID0gMDsKICAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgaW5mby5zcmNPZmZzZXQgPSBpbmZvLmRzdE9mZnNldCA9IHBlc09mZnNldDsKLSAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1swXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OworICAgICAgICAgICAgc3JjT2Zmc2V0ID0gZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZShpbmZvLCAmcmVzdWx0KTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CiAKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIGV4Y2VwdGlvbkNvZGU9JWQiLAotICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSk7CisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZOworICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gbURlc2NyYW1ibGVyU3JjQnVmZmVyOworCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICAoU2NyYW1ibGluZ0NvbnRyb2wpIHNjdHJsLAorICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLAorICAgICAgICAgICAgICAgIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gX2J5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgYnl0ZXNXcml0dGVuKTsKICAgICAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSwgbURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCAzNzRlMDExLi40MWMxOWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTI5LDExICsyOSwxMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElDYXM7Cit9fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7CisKIGNsYXNzIEFCaXRSZWFkZXI7CiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IDk2ZWI1YmYuLjIxMjU5YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTM1LDUgKzM1LDggQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCmluZGV4IDA0N2IxYjMuLjlmZjQ1MjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcApAQCAtMTgsMTUgKzE4LDE5IEBACiAjZGVmaW5lIExPR19UQUcgIkNhc01hbmFnZXIiCiAjaW5jbHVkZSAiQ2FzTWFuYWdlci5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lNZWRpYUNhc1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lDYXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSU1lZGlhQ2FzU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKIAogc3RydWN0IEFUU1BhcnNlcjo6Q2FzTWFuYWdlcjo6UHJvZ3JhbUNhc01hbmFnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgUHJvZ3JhbUNhc01hbmFnZXIodW5zaWduZWQgcHJvZ3JhbU51bWJlciwgY29uc3QgQ0FEZXNjcmlwdG9yICZkZXNjcmlwdG9yKTsKQEAgLTEyNSw0NSArMTI5LDYwIEBACiAgICAgICAgICBjb25zdCBzcDxJQ2FzPiYgY2FzLAogICAgICAgICAgUGlkVG9TZXNzaW9uTWFwICZzZXNzaW9uTWFwLAogICAgICAgICAgQ2FzU2Vzc2lvbiAqc2Vzc2lvbikgewotICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBzcDxJQmluZGVyPiBjYXNTZXJ2aWNlQmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhcyIpKTsKLSAgICBzcDxJTWVkaWFDYXNTZXJ2aWNlPiBjYXNTZXJ2aWNlID0KLSAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUNhc1NlcnZpY2U+KGNhc1NlcnZpY2VCaW5kZXIpOwotCisgICAgc3A8SU1lZGlhQ2FzU2VydmljZT4gY2FzU2VydmljZSA9IElNZWRpYUNhc1NlcnZpY2U6OmdldFNlcnZpY2UoImRlZmF1bHQiKTsKICAgICBpZiAoY2FzU2VydmljZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIElNZWRpYUNhc1NlcnZpY2UiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCisgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyOworICAgIHNwPElEZXNjcmFtYmxlckJhc2U+IGRlc2NyYW1ibGVyQmFzZTsKKyAgICBSZXR1cm48U3RhdHVzPiByZXR1cm5TdGF0dXMoU3RhdHVzOjpPSyk7CisgICAgUmV0dXJuPHNwPElEZXNjcmFtYmxlckJhc2U+ID4gcmV0dXJuRGVzY3JhbWJsZXIoTlVMTCk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOwogICAgIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvciA9IHNlc3Npb24tPm1DQURlc2NyaXB0b3I7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gY2FzLT5vcGVuU2Vzc2lvbigmc2Vzc2lvbklkKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHNlc3Npb246IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgYXV0byByZXR1cm5Wb2lkID0gY2FzLT5vcGVuU2Vzc2lvbigKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmc2Vzc2lvbklkXSAoU3RhdHVzIF9zdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBfc2Vzc2lvbklkKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBfc2Vzc2lvbklkOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gc2Vzc2lvbjogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cyk7CiAgICAgICAgIGdvdG8gbF9mYWlsOwogICAgIH0KIAotICAgIGNhcy0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcml2YXRlIGRhdGE6IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgcmV0dXJuU3RhdHVzID0gY2FzLT5zZXRTZXNzaW9uUHJpdmF0ZURhdGEoc2Vzc2lvbklkLCBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YSk7CisgICAgaWYgKCFyZXR1cm5TdGF0dXMuaXNPaygpIHx8IHJldHVyblN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHByaXZhdGUgZGF0YTogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cylyZXR1cm5TdGF0dXMpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBzdGF0dXMgPSBjYXNTZXJ2aWNlLT5jcmVhdGVEZXNjcmFtYmxlcihkZXNjcmlwdG9yLm1TeXN0ZW1JRCwgJmRlc2NyYW1ibGVyKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkgfHwgZGVzY3JhbWJsZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVybkRlc2NyYW1ibGVyID0gY2FzU2VydmljZS0+Y3JlYXRlRGVzY3JhbWJsZXIoZGVzY3JpcHRvci5tU3lzdGVtSUQpOworICAgIGlmICghcmV0dXJuRGVzY3JhbWJsZXIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRlc2NyYW1ibGVyOiB0cmFucz0lcyIsCisgICAgICAgICAgICAgICAgcmV0dXJuRGVzY3JhbWJsZXIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgZ290byBsX2ZhaWw7CisgICAgfQorICAgIGRlc2NyYW1ibGVyQmFzZSA9IChzcDxJRGVzY3JhbWJsZXJCYXNlPikgcmV0dXJuRGVzY3JhbWJsZXI7CisgICAgaWYgKGRlc2NyYW1ibGVyQmFzZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRlc2NyYW1ibGVyOiBudWxsIHB0ciIpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBzdGF0dXMgPSBkZXNjcmFtYmxlci0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBkZXNjcmFtYmxlcjogOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVyblN0YXR1cyA9IGRlc2NyYW1ibGVyQmFzZS0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKCFyZXR1cm5TdGF0dXMuaXNPaygpIHx8IChTdGF0dXMpIHJldHVyblN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBkZXNjcmFtYmxlcjogOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5TdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpLCAoU3RhdHVzKSByZXR1cm5TdGF0dXMpOworICAgICAgICBnb3RvIGxfZmFpbDsKKyAgICB9CisKKyAgICBkZXNjcmFtYmxlciA9IElEZXNjcmFtYmxlcjo6Y2FzdEZyb20oZGVzY3JhbWJsZXJCYXNlKTsKKyAgICBpZiAoZGVzY3JhbWJsZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNhc3QgZnJvbSBJRGVzY3JhbWJsZXJCYXNlIHRvIElEZXNjcmFtYmxlciIpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKQEAgLTE3Nyw4ICsxOTYsOCBAQAogICAgIGlmICghc2Vzc2lvbklkLmVtcHR5KCkpIHsKICAgICAgICAgY2FzLT5jbG9zZVNlc3Npb24oc2Vzc2lvbklkKTsKICAgICB9Ci0gICAgaWYgKGRlc2NyYW1ibGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVzY3JhbWJsZXItPnJlbGVhc2UoKTsKKyAgICBpZiAoZGVzY3JhbWJsZXJCYXNlICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JhbWJsZXJCYXNlLT5yZWxlYXNlKCk7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQpAQCAtMzE2LDExICszMzUsMTIgQEAKICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgTWVkaWFDYXM6OlBhcmNlbGFibGVDYXNEYXRhIGVjbShici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBtSUNhcy0+cHJvY2Vzc0VjbShtQ0FQaWRUb1Nlc3Npb25JZE1hcFtpbmRleF0sIGVjbSk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJvY2VzcyBFQ006IGV4Y2VwdGlvbj0lZCwgZXJyb3I9JWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25Db2RlKCksIHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSk7CisgICAgaGlkbF92ZWM8dWludDhfdD4gZWNtOworICAgIGVjbS5zZXRUb0V4dGVybmFsKCh1aW50OF90Kilici0+ZGF0YSgpLCBici0+bnVtQml0c0xlZnQoKSAvIDgpOworICAgIGF1dG8gcmV0dXJuU3RhdHVzID0gbUlDYXMtPnByb2Nlc3NFY20obUNBUGlkVG9TZXNzaW9uSWRNYXBbaW5kZXhdLCBlY20pOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCAoU3RhdHVzKSByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByb2Nlc3MgRUNNOiB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICByZXR1cm5TdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpLCAoU3RhdHVzKSByZXR1cm5TdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsgLy8gaGFuZGxlZAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaAppbmRleCA4MDg4ZGVjLi44MWY2NTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuaApAQCAtMjEsMTAgKzIxLDEzIEBACiAjaW5jbHVkZSA8c2V0PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLWNsYXNzIElEZXNjcmFtYmxlcjsKLX0KK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBuYXRpdmUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElEZXNjcmFtYmxlcjsKK319fX0KK3VzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpDYXNNYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIENhc01hbmFnZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IGMzZjEyNzQuLjlkNjg0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMzgsOCArMzgsMTMgQEAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKKyNpbmNsdWRlIDxoaWRsL0h5YnJpZEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmNhczo6VjFfMDo6SUNhczsKKwogc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4Owogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOwogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CkBAIC0xNTYsNyArMTYxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwgbWltZSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKSB7CitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CisgICAgSGFsVG9rZW4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgodWludDhfdCopY2FzVG9rZW4uZGF0YSgpLCBjYXNUb2tlbi5zaXplKCkpOworICAgIHNwPElDYXM+IGNhcyA9IElDYXM6OmNhc3RGcm9tKHJldHJpZXZlSGFsSW50ZXJmYWNlKGhhbFRva2VuKSk7CiAgICAgQUxPR0QoInNldE1lZGlhQ2FzOiAlcCIsIGNhcy5nZXQoKSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUGFyc2VyLT5zZXRNZWRpYUNhcyhjYXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCAyMmQ3ZDI3Li5jNmZhNGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjQ2LDYgKzI0NiwxNSBAQAogICAgIHZpcnR1YWwgfkNhbGxiYWNrRGlzcGF0Y2hlcigpOwogCiBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIGZyYW1lX3JlbmRlcmVkIG1lc3NhZ2UgYmF0Y2hpbmcsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBlbmQgdXAgaW4gYQorICAgICAgICAvLyBzaW5nbGUgQU1lc3NhZ2UgaW4gTWVkaWFDb2RlYyB3aGVuIGl0IGlzIHNpZ25hbGVkIHRvIHRoZSBhcHAuIEFNZXNzYWdlIGNhbiBjb250YWluCisgICAgICAgIC8vIHVwLXRvIDY0IGtleS12YWx1ZSBwYWlycywgYW5kIGVhY2ggZnJhbWVfcmVuZGVyZWQgbWVzc2FnZSB1c2VzIDIga2V5cywgc28gdGhlIG1heAorICAgICAgICAvLyB2YWx1ZSBmb3IgdGhpcyB3b3VsZCBiZSAzMi4gTm9uZXRoZWxlc3MsIGxpbWl0IHRoaXMgdG8gMTIgdG8gd2hpY2ggZ2l2ZXMgYXQgbGVhc3QgMTAKKyAgICAgICAgLy8gbXNlY29uZHMgb2YgYmF0Y2hpbmcgYXQgMTIwSHouCisgICAgICAgIGtNYXhRdWV1ZVNpemUgPSAxMiwKKyAgICB9OworCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBzcDxPTVhOb2RlSW5zdGFuY2U+IGNvbnN0IG1Pd25lcjsKQEAgLTI5MCw3ICsyOTksNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBtUXVldWUucHVzaF9iYWNrKG1zZyk7Ci0gICAgaWYgKHJlYWxUaW1lKSB7CisgICAgaWYgKHJlYWxUaW1lIHx8IG1RdWV1ZS5zaXplKCkgPj0ga01heFF1ZXVlU2l6ZSkgewogICAgICAgICBtUXVldWVDaGFuZ2VkLnNpZ25hbCgpOwogICAgIH0KIH0KQEAgLTIxNjgsOCArMjE3Nyw4IEBACiAgICAgICAgICAgICBtc2cuZmVuY2VGZCA9IC0xOwogICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID0gcmVuZGVyRGF0YVtpXS5uTWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS5uYW5vVGltZSA9IHJlbmRlckRhdGFbaV0ublN5c3RlbVRpbWVOczsKLQotICAgICAgICAgICAgaW5zdGFuY2UtPm1EaXNwYXRjaGVyLT5wb3N0KG1zZywgZmFsc2UgLyogcmVhbFRpbWUgKi8pOworICAgICAgICAgICAgYm9vbCByZWFsVGltZSA9IG1zZy51LnJlbmRlcl9kYXRhLnRpbWVzdGFtcCA9PSBJTlQ2NF9NQVg7CisgICAgICAgICAgICBpbnN0YW5jZS0+bURpc3BhdGNoZXItPnBvc3QobXNnLCByZWFsVGltZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IGZjY2IxMmIuLjBiYzY1ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTg1LDcgKzg1LDIxIEBACiAgICAgICAgIGxpYk5hbWUuYXBwZW5kKGtDb21wb25lbnRzW2ldLm1MaWJOYW1lU3VmZml4KTsKICAgICAgICAgbGliTmFtZS5hcHBlbmQoIi5zbyIpOwogCi0gICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XKTsKKyAgICAgICAgLy8gUlRMRF9OT0RFTEVURSBtZWFucyB3ZSBrZWVwIHRoZSBzaGFyZWQgbGlicmFyeSBhcm91bmQgZm9yZXZlci4KKyAgICAgICAgLy8gdGhpcyBlbGltaW5hdGVzIHRocmFzaGluZyBkdXJpbmcgc2VxdWVuY2VzIGxpa2UgbG9hZGluZyBzb3VuZHBvb2xzLgorICAgICAgICAvLyBJdCBhbHNvIGxlYXZlcyB0aGUgcmVzdCBvZiB0aGUgbG9naWMgYXJvdW5kIHRoZSBkbG9wZW4oKS9kbGNsb3NlKCkKKyAgICAgICAgLy8gY2FsbHMgaW4gdGhpcyBmaWxlIHVuY2hhbmdlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW1wbGljYXRpb25zIG9mIHRoZSBjaGFuZ2U6CisgICAgICAgIC8vIC0tIHRoZSBjb2RlYyBwcm9jZXNzICh3aGVyZSB0aGlzIGhhcHBlbnMpIHdpbGwgaGF2ZSBhIHNsaWdodGx5IGxhcmdlcgorICAgICAgICAvLyAgICBsb25nLXRlcm0gbWVtb3J5IGZvb3RwcmludCBhcyBpdCBhY2N1bXVsYXRlcyB0aGUgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICAgIC8vICAgIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5LgorICAgICAgICAvLyAtLSBwbHVnaW4gY29kZWNzIGNhbiBubyBsb25nZXIgKGFuZCBuZXZlciBzaG91bGQgaGF2ZSkgZGVwZW5kIG9uIGEKKyAgICAgICAgLy8gICAgZnJlZSByZXNldCBvZiBhbnkgc3RhdGljIGRhdGEgYXMgdGhlIGxpYnJhcnkgd291bGQgaGF2ZSBjcm9zc2VkCisgICAgICAgIC8vICAgIGEgZGxjbG9zZS9kbG9wZW4gY3ljbGUuCisgICAgICAgIC8vCisKKyAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CiAKICAgICAgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGRsb3BlbiAlczogJXMiLCBsaWJOYW1lLmNfc3RyKCksIGRsZXJyb3IoKSk7CmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLmJwIGIvcmFkaW8vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTRmMi4uMDAwMDAwMAotLS0gYS9yYWRpby9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJyYWRpbyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvLmNwcCIsCi0gICAgICAgICJJUmFkaW9DbGllbnQuY3BwIiwKLSAgICAgICAgIklSYWRpb1NlcnZpY2UuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnJhZGlvX21ldGFkYXRhIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjNiNjguLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklSYWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9DT05GSUdVUkFUSU9OLAotICAgIEdFVF9DT05GSUdVUkFUSU9OLAotICAgIFNFVF9NVVRFLAotICAgIEdFVF9NVVRFLAotICAgIFNDQU4sCi0gICAgU1RFUCwKLSAgICBUVU5FLAotICAgIENBTkNFTCwKLSAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKLSAgICBIQVNfQ09OVFJPTAotfTsKLQotY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpbz4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBkZXRhY2goKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRldGFjaCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJR1VSQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGUgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChtdXRlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBtdXRlcmVhZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICptdXRlID0gbXV0ZXJlYWQgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2tpcFN1YkNoYW5uZWwgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTQ0FOLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RFUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoY2hhbm5lbCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3ViQ2hhbm5lbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChUVU5FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGxwdHIgfHwgaW5mby0+bWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByYWRpb19tZXRhZGF0YV90ICptZXRhZGF0YSA9IGluZm8tPm1ldGFkYXRhOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKGluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBsb2NhbCBtZXRhZGF0YSBwb2ludGVyCi0gICAgICAgICAgICAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbmV3TWV0YWRhdGEgPSAocmFkaW9fbWV0YWRhdGFfdCAqKW1hbGxvYyhtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3TWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXBseS5yZWFkKG5ld01ldGFkYXRhLCBtZXRhZGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBuZXdNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoaGFzQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChIQVNfQ09OVFJPTCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICpoYXNDb250cm9sID0gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpbywgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5SYWRpbzo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgREVUQUNIOiB7Ci0gICAgICAgICAgICBBTE9HVigiREVUQUNIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBkZXRhY2goKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfQ09ORklHVVJBVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRDb25maWd1cmF0aW9uKCZjb25maWcpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9DT05GSUdVUkFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGUgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNdXRlKG11dGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG11dGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNdXRlKCZtdXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobXV0ZSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNDQU46IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNjYW4oZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU1RFUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gKHJhZGlvX2RpcmVjdGlvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHNraXBTdWJDaGFubmVsID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBUVU5FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENBTkNFTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2FuY2VsKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX1BST0dSQU1fSU5GT1JNQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gaW5mbzsKLSAgICAgICAgICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmaW5mby5tZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFByb2dyYW1JbmZvcm1hdGlvbigmaW5mbyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaW5mbywgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8pKTsKLSAgICAgICAgICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfZ2V0X2NvdW50KGluZm8ubWV0YWRhdGEpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGluZm8ubWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoKHVpbnQzMl90KXNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaW5mby5tZXRhZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEhBU19DT05UUk9MOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGNvbnRyb2w7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYXNDb250cm9sKCZjb250cm9sKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY29udHJvbCA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAgYi9yYWRpby9JUmFkaW9DbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIxOTQ5Li4wMDAwMDAwCi0tLSBhL3JhZGlvL0lSYWRpb0NsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIE9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLX07Ci0KLWNsYXNzIEJwUmFkaW9DbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci0KLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpb0NsaWVudD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW9DbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblJhZGlvQ2xpZW50OjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPTl9FVkVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBvbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfSAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAgYi9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlM2E2MS4uMDAwMDAwMAotLS0gYS9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkJwUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBBVFRBQ0gsCi19OwotCi0jZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0Ci0KLWNsYXNzIEJwUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCi0gICAgewotICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdWludDMyX3QgbnVtTW9kdWxlc1JlcSA9IChwcm9wZXJ0aWVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICpudW1Nb2R1bGVzID0gKHVpbnQzMl90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgewotICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocHJvcGVydGllcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwotICAgICAgICBBTE9HVigiYXR0YWNoKCkgY29uZmlnICVwIHdpdGhBdWRpbyAlZCByZWdpb24gJWQgdHlwZSAlZCIsCi0gICAgICAgICAgICAgIGNvbmZpZyA9PSBOVUxMID8gMCA6IGNvbmZpZywgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICBjb25maWcgPT0gTlVMTCA/IDAgOiBjb25maWctPnJlZ2lvbiwKLSAgICAgICAgICAgICAgY29uZmlnID09IE5VTEwgPyAwIDogY29uZmlnLT5iYW5kLnR5cGUpOwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHdpdGhBdWRpbyA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgIHJhZGlvID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvU2VydmljZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVRUQUNIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmFkaW9faGFuZGxlX3QgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWdQdHIgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnUHRyID0gJmNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgQUxPR1YoIkFUVEFDSCBjb25maWdQdHIgJXAgd2l0aEF1ZGlvICVkIiwgY29uZmlnUHRyLCB3aXRoQXVkaW8pOwotICAgICAgICAgICAgc3A8SVJhZGlvPiByYWRpbzsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgY29uZmlnUHRyLCB3aXRoQXVkaW8sIHJhZGlvKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAocmFkaW8gIT0gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpbykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9PV05FUlMgYi9yYWRpby9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzhhMzUuLjAwMDAwMDAKLS0tIGEvcmFkaW8vT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1lbGF1cmVudEBnb29nbGUuY29tCi10d2FzaWxjenlrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3JhZGlvL1JhZGlvLmNwcCBiL3JhZGlvL1JhZGlvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkZDIyMS4uMDAwMDAwMAotLS0gYS9yYWRpby9SYWRpby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDxyYWRpby9SYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHsKLSAgICBzcDxJUmFkaW9TZXJ2aWNlPiAgICAgICAgICBnUmFkaW9TZXJ2aWNlOwotICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKLSAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlTmFtZSAgICAgID0gIm1lZGlhLnJhZGlvIjsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBnTG9jazsKLQotICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBEZWF0aE5vdGlmaWVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewotICAgICAgICAgICAgQUxPR1YoImJpbmRlckRpZWQiKTsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7Ci0gICAgICAgICAgICBnUmFkaW9TZXJ2aWNlLmNsZWFyKCk7Ci0gICAgICAgICAgICBBTE9HVygiUmFkaW8gc2VydmljZSBkaWVkISIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgICAgZ0RlYXRoTm90aWZpZXI7Ci19OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCi0KLWNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IFJhZGlvOjpnZXRSYWRpb1NlcnZpY2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7Ci0gICAgaWYgKGdSYWRpb1NlcnZpY2UuZ2V0KCkgPT0gMCkgewotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoa1JhZGlvU2VydmljZU5hbWUpKTsKLSAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1coIlJhZGlvU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7Ci0gICAgICAgICAgICB1c2xlZXAoa1JhZGlvU2VydmljZVBvbGxEZWxheSk7Ci0gICAgICAgIH0gd2hpbGUodHJ1ZSk7Ci0gICAgICAgIGlmIChnRGVhdGhOb3RpZmllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBnRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnRGVhdGhOb3RpZmllcik7Ci0gICAgICAgIGdSYWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJUmFkaW9TZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLSAgICBBTE9HRV9JRihnUmFkaW9TZXJ2aWNlID09IDAsICJubyBSYWRpb1NlcnZpY2UhPyIpOwotICAgIHJldHVybiBnUmFkaW9TZXJ2aWNlOwotfQotCi0vLyBTdGF0aWMgbWV0aG9kcwotc3RhdHVzX3QgUmFkaW86Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotewotICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7Ci0gICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhwcm9wZXJ0aWVzLCBudW1Nb2R1bGVzKTsKLX0KLQotc3A8UmFkaW8+IFJhZGlvOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKLSAgICBBTE9HVigiYXR0YWNoKCkiKTsKLSAgICBzcDxSYWRpbz4gcmFkaW87Ci0gICAgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gc2VydmljZSA9IGdldFJhZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJhZGlvOwotICAgIH0KLSAgICByYWRpbyA9IG5ldyBSYWRpbyhoYW5kbGUsIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2goaGFuZGxlLCByYWRpbywgY29uZmlnLCB3aXRoQXVkaW8sIHJhZGlvLT5tSVJhZGlvKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmFkaW8tPm1JUmFkaW8gIT0gMCkgewotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihyYWRpby0+bUlSYWRpbyktPmxpbmtUb0RlYXRoKHJhZGlvKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgJWQgY29ubmVjdGluZyB0byByYWRpbyBzZXJ2aWNlIiwgc3RhdHVzKTsKLSAgICAgICAgcmFkaW8uY2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJhZGlvOwotfQotCi0KLQotLy8gUmFkaW8KLVJhZGlvOjpSYWRpbyhyYWRpb19oYW5kbGVfdCAvKmhhbmRsZSovLCBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spCi17Ci19Ci0KLVJhZGlvOjp+UmFkaW8oKQotewotICAgIGlmIChtSVJhZGlvICE9IDApIHsKLSAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7Ci0gICAgfQotfQotCi0KLXZvaWQgUmFkaW86OmRldGFjaCgpIHsKLSAgICBBTE9HVigiZGV0YWNoKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGlmIChtSVJhZGlvICE9IDApIHsKLSAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7Ci0gICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1JUmFkaW8pLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtSVJhZGlvID0gMDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0Q29uZmlndXJhdGlvbihjb25maWcpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+c2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRNdXRlKG11dGUpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YmNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+c2NhbihkaXJlY3Rpb24sIHNraXBTdWJjaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT50dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6Y2FuY2VsKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5jYW5jZWwoKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldFByb2dyYW1JbmZvcm1hdGlvbihpbmZvKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86Omhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5oYXNDb250cm9sKGhhc0NvbnRyb2wpOwotfQotCi0KLS8vIEJwUmFkaW9DbGllbnQKLXZvaWQgUmFkaW86Om9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgZXZlbnQgbGF5b3V0IGluIHNoYXJlZCBtZW1vcnkgaXM6Ci0gICAgLy8gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgYnl0ZXMgOiB0aGUgZXZlbnQgaXRzZWxmCi0gICAgLy8gNCBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBzaXplIG9yIDAKLSAgICAvLyBOIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIGlmIHByZXNlbnQKLSAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgdWludDMyX3QgbWV0YWRhdGFPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSArIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDMyX3QgbWV0YWRhdGFTaXplID0gKih1aW50MzJfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKTsKLQotICAgIC8vIHJlc3RvcmUgbG9jYWwgbWV0YWRhdGEgcG9pbnRlciBmcm9tIG9mZnNldAotICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKHJhZGlvX21ldGFkYXRhX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV2ZW50LT5pbmZvLm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIGV2ZW50LT5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoZXZlbnQpOwotICAgIH0KLX0KLQotCi0vL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci12b2lkIFJhZGlvOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dXKCJSYWRpbyBzZXJ2ZXIgYmluZGVyIERpZWQgIik7Ci0gICAgbUlSYWRpbyA9IDA7Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfU0VSVkVSX0RJRUQ7Ci0gICAgZXZlbnQuc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudCgmZXZlbnQpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzRmMWFmMy4uYzEwZmEwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTEzOCw3ICsxMzgsOCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgTE9HX0hJU1RfRkxVU0goKTsKKyAgICAvLyBsb2cgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorICAgIExPR19BVURJT19TVEFURSgpOwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1QcmV2aW91czsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCAyYTI3ZGZkLi4zNjZhMTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksNyArNDAsNyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTW1hcFRocmVhZDsKQEAgLTU1LDUgKzU2LDYgQEAKICAgICB2aXJ0dWFsIGludDY0X3QgZnJhbWVzUmVsZWFzZWQoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgb25UaW1lc3RhbXAoY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKKyAgICBwaWRfdCBtUGlkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNlNGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2h1bmdhQGdvb2dsZS5jb20KK2ptdHJpdmlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGQ3YzA3MjguLjI3YzZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ3NCw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAzZjFhMGMwLi4xYzFhOTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTQwLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0yNDAsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDNmODNjYTguLmY4ZGE3ODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggYTY3YWNkNi4uMmE4NzdlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMTU0Myw2ICsxNTQzLDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6YWRkIHRyYWNrICVwIGFscmVhZHkgdGhlcmUiLCB0cmFjay5nZXQoKSk7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CisgICAgbG9nVHJhY2soImFkZCIsIHRyYWNrKTsKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIG1MYXRlc3RBY3RpdmVUcmFjayA9IHRyYWNrOwogICAgICsrbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwpAQCAtMTU1Niw2ICsxNTU3LDcgQEAKICAgICAgICAgQUxPR1coIkFjdGl2ZVRyYWNrczxUPjo6cmVtb3ZlIG5vbmV4aXN0ZW50IHRyYWNrICVwIiwgdHJhY2suZ2V0KCkpOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQorICAgIGxvZ1RyYWNrKCJyZW1vdmUiLCB0cmFjayk7CiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KQEAgLTE1NjYsNiArMTU2OCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+OjpjbGVhcigpIHsKICAgICBmb3IgKGNvbnN0IHNwPFQ+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8odHJhY2stPnVpZCgpKTsKKyAgICAgICAgbG9nVHJhY2soImNsZWFyIiwgdHJhY2spOwogICAgIH0KICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24gPSBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CkBAIC0xNjA0LDYgKzE2MDcsMTYgQEAKICAgICB9CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6bG9nVHJhY2soCisgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBjb25zdCBzcDxUPiAmdHJhY2spIGNvbnN0IHsKKyAgICBpZiAobUxvY2FsTG9nICE9IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICAgICAgbUxvY2FsTG9nLT5sb2coIkFUOjolLTEwcyglcCkgJXMiLCBmdW5jTmFtZSwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6YnJvYWRjYXN0X2woKQogewogICAgIC8vIFRocmVhZCBjb3VsZCBiZSBibG9ja2VkIHdhaXRpbmcgZm9yIGFzeW5jCkBAIC0xNjM5LDYgKzE2NTIsNyBAQAogICAgICAgICBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgICBtRnJhbWVzV3JpdHRlbigwKSwKICAgICAgICAgbVN1c3BlbmRlZEZyYW1lcygwKSwKKyAgICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtT3V0cHV0KG91dHB1dCksCiAgICAgICAgIG1MYXN0V3JpdGVUaW1lKC0xKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKQEAgLTE3MDYsOCArMTcyMCw2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFN0cmVhbSB2b2x1bWVzIGluIGRCOiAiKTsKQEAgLTE3MzQsOCArMTc0NiwxMCBAQAogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtMTc0NCw4ICsxNzU4LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3NTMsMTUgKzE3NjcsMTUgQEAKICAgICB9CiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CiAgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjAxMiw3ICsyMDI2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CkBAIC0yMTcxLDEwICsyMTg2LDYgQEAKICAgICAgICAgICAgIGNoYWluLT5pbmNBY3RpdmVUcmFja0NudCgpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBhcnJheXNpemUoYnVmZmVyKSwgZmFsc2UgLyogYWN0aXZlICovKTsKLSAgICAgICAgbUxvY2FsTG9nLmxvZygiYWRkVHJhY2tfbCAgICAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCi0KICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogCkBAIC0yMjAxLDkgKzIyMTIsOSBAQAogewogICAgIHRyYWNrLT50cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOwogCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5uYW1lKCkpOwpAQCAtMzQwMywxMCArMzQxNCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpbmFjdGl2ZSBidXQgbm90IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tzX2woJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTkyNCw3ICs1OTMxLDkgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAotICAgIG1JbnB1dChpbnB1dCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCisgICAgbUlucHV0KGlucHV0KSwKKyAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAorICAgIG1Sc21wSW5CdWZmZXIoTlVMTCksCiAgICAgLy8gbVJzbXBJbkZyYW1lcywgbVJzbXBJbkZyYW1lc1AyLCBhbmQgbVJzbXBJbkZyYW1lc09BIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICBtUnNtcEluUmVhcigwKQogI2lmZGVmIFRFRV9TSU5LCkBAIC02Njk1LDcgKzY3MDQsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwpAQCAtNjg4Nyw2ICs2ODk3LDEwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbW92ZVRyYWNrX2woY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiB0cmFjaykKIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGZhbHNlIC8qIGFjdGl2ZSAqLyk7CisgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIHJlc3VsdC5zdHJpbmcoKSk7CisKICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgLy8gbmVlZCBhbnl0aGluZyByZWxhdGVkIHRvIGVmZmVjdHMgaGVyZT8KICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKQEAgLTY5MDAsNiArNjkxNCw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTY5MTMsNiArNjkyOSwxMiBAQAogICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQorCisgICAgaWYgKGlucHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsIHN0cmVhbSBkdW1wOlxuIik7CisgICAgICAgICh2b2lkKWlucHV0LT5zdHJlYW0tPmR1bXAoZmQpOworICAgIH0KKwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKQEAgLTY5MjcsMTYgKzY5NDksMTUgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtNjk0NSw4ICs2OTY2LDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTY5NTQsMTUgKzY5NzUsMTUgQEAKICAgICB9CiAKICAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1NDQsNyArNzU2NSw4IEBACiAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSwKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCi0gICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldikKKyAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKKyAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZykKIHsKICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwpAQCAtNzY5Miw3ICs3NzE0LDcgQEAKICAgICB9CiAKICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKIAogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwpAQCAtODE2MCw2ICs4MTgyLDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTgxNzYsMTggKzgyMDAsMTcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwotICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3NcbiIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCAwNjJiYWQ2Li4zMmYyYmM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTUwOCw5ICs1MDgsMTAgQEAKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICBjbGFzcyBBY3RpdmVUcmFja3MgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlVHJhY2tzKCkKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgQWN0aXZlVHJhY2tzKFNpbXBsZUxvZyAqbG9jYWxMb2cgPSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbigwKQogICAgICAgICAgICAgICAgICAgICAgICAgLCBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbUxvY2FsTG9nKGxvY2FsTG9nKQogICAgICAgICAgICAgICAgICAgICB7IH0KIAogICAgICAgICAgICAgICAgICAgICB+QWN0aXZlVHJhY2tzKCkgewpAQCAtNTYyLDYgKzU2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1cGRhdGVQb3dlclN0YXRlKHNwPFRocmVhZEJhc2U+IHRocmVhZCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgICAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2dUcmFjayhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdDsKKwogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IGdldFdha2VMb2NrVWlkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aWRfdD4gd2FrZUxvY2tVaWRzOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC01NzYsNiArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIHdwPFQ+ICAgICAgICAgICAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrOyAvLyBsYXRlc3QgdHJhY2sgYWRkZWQgdG8gQWN0aXZlVHJhY2tzCisgICAgICAgICAgICAgICAgICAgIFNpbXBsZUxvZyAqIGNvbnN0ICAgbUxvY2FsTG9nOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNiNTQwY2EuLmQ0Y2UwYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTYxLDYgKzYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCkBAIC04Miw2ICs4Myw3IEBACiAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldEJ1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyTWVtb3J5OyB9CiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CisgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQpAQCAtMTMzLDYgKzEzNSw0MCBAQAogICAgICAgICBtVGVybWluYXRlZCA9IHRydWU7CiAgICAgfQogCisgICAgLy8gVXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSBmaW5hbCBzdGF0ZXMuCisgICAgLy8gTG93ZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSB0cmFuc2l0b3J5LgorICAgIGNvbnN0IGNoYXIgKmdldFRyYWNrU3RhdGVTdHJpbmcoKSBjb25zdCB7CisgICAgICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuICJUICI7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgcmV0dXJuICJJICI7CisgICAgICAgIGNhc2UgU1RPUFBJTkdfMTogLy8gZm9yIEZhc3QgYW5kIE9mZmxvYWQKKyAgICAgICAgICAgIHJldHVybiAiczEiOworICAgICAgICBjYXNlIFNUT1BQSU5HXzI6IC8vIGZvciBGYXN0IGFuZCBPZmZsb2FkCisgICAgICAgICAgICByZXR1cm4gInMyIjsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgcmV0dXJuICJTICI7CisgICAgICAgIGNhc2UgUkVTVU1JTkc6CisgICAgICAgICAgICByZXR1cm4gInIgIjsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICByZXR1cm4gIkEgIjsKKyAgICAgICAgY2FzZSBQQVVTSU5HOgorICAgICAgICAgICAgcmV0dXJuICJwICI7CisgICAgICAgIGNhc2UgUEFVU0VEOgorICAgICAgICAgICAgcmV0dXJuICJQICI7CisgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgIHJldHVybiAiRiAiOworICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGZvciBSZWNvcmRUcmFjaworICAgICAgICAgICAgcmV0dXJuICJyMSI7CisgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gZm9yIFJlY29yZFRyYWNrCisgICAgICAgICAgICByZXR1cm4gInIyIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiPyAiOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbCBpc091dCgpIGNvbnN0IHsgcmV0dXJuIG1Jc091dDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBmb3IgVHJhY2ssIGZhbHNlIGZvciBSZWNvcmRUcmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSB0cmFjayB0eXBlIGlmIG5lZWRlZCBsYXRlcgpAQCAtMTQ0LDYgKzE4MCw3IEBACiAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQnVmZmVyTWVtb3J5OyAgLy8gY3VycmVudGx5IG5vbi0wIGZvciBmYXN0IFJlY29yZFRyYWNrIG9ubHkKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1CdWZmZXI7ICAgIC8vIHN0YXJ0IG9mIHRyYWNrIGJ1ZmZlciwgdHlwaWNhbGx5IGluIHNoYXJlZCBtZW1vcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgT3V0cHV0VHJhY2sgd2hlbiBpdCBpcyBpbiBsb2NhbCBtZW1vcnkKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAvLyBzaXplIG9mIG1CdWZmZXIgaW4gYnl0ZXMKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgdHJhY2tfc3RhdGUgICAgICAgICBtU3RhdGU7CiAgICAgY29uc3QgdWludDMyX3QgICAgICBtU2FtcGxlUmF0ZTsgICAgLy8gaW5pdGlhbCBzYW1wbGUgcmF0ZSBvbmx5OyBmb3IgdHJhY2tzIHdoaWNoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDk3NjNiZjIuLjBmMjUxNTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC01MCwxMCArNTAsNiBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotLy8gVE9ETyBtb3ZlIHRvIGEgY29tbW9uIGhlYWRlciAgKEFsc28gc2hhcmVkIHdpdGggQXVkaW9UcmFjay5jcHApCi0jZGVmaW5lIE5BTk9TX1BFUl9TRUNPTkQgICAgMTAwMDAwMDAwMAotI2RlZmluZSBUSU1FX1RPX05BTk9TKHRpbWUpICgodWludDY0X3QpKHRpbWUpLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQgKyAodGltZSkudHZfbnNlYykKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MSw2ICs2Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgYm9vbCBpc091dCwKQEAgLTgxLDcgKzc4LDcgQEAKICAgICAgICAgbVRocmVhZCh0aHJlYWQpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1DYmxrKE5VTEwpLAotICAgICAgICAvLyBtQnVmZmVyCisgICAgICAgIC8vIG1CdWZmZXIsIG1CdWZmZXJTaXplCiAgICAgICAgIG1TdGF0ZShJRExFKSwKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKQEAgLTExMywxNSArMTEwLDIyIEBACiAKICAgICAvLyBBTE9HRCgiQ3JlYXRpbmcgdHJhY2sgd2l0aCAlZCBidWZmZXJzIEAgJWQgYnl0ZXMiLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQ7CisgICAgc2l6ZV90IG1pbkJ1ZmZlclNpemUgPSBidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50OwogICAgIC8vIGNoZWNrIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIGJ1ZmZlclNpemUgZHVlIHRvIG11bHRpcGxpY2F0aW9uIGJ5IG1GcmFtZVNpemUuCi0gICAgaWYgKGJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCisgICAgaWYgKG1pbkJ1ZmZlclNpemUgPCBmcmFtZUNvdW50ICAvLyByb3VuZHVwIHJvdW5kcyBkb3duIGZvciB2YWx1ZXMgYWJvdmUgVUlOVF9NQVggLyAyCiAgICAgICAgICAgICB8fCBtRnJhbWVTaXplID09IDAgICAvLyBmb3JtYXQgbmVlZHMgdG8gYmUgY29ycmVjdAotICAgICAgICAgICAgfHwgYnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgeworICAgICAgICAgICAgfHwgbWluQnVmZmVyU2l6ZSA+IFNJWkVfTUFYIC8gbUZyYW1lU2l6ZSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM0NzQ5NTcxIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYnVmZmVyU2l6ZSAqPSBtRnJhbWVTaXplOworICAgIG1pbkJ1ZmZlclNpemUgKj0gbUZyYW1lU2l6ZTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXJTaXplID0gbWluQnVmZmVyU2l6ZTsgLy8gYWxsb2NhdGVkIGhlcmUuCisgICAgfSBlbHNlIGlmIChtaW5CdWZmZXJTaXplID4gYnVmZmVyU2l6ZSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM4MzQwMTE3Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCAmJiBhbGxvYyA9PSBBTExPQ19DQkxLKSB7CkBAIC0xNzcsNiArMTgxLDcgQEAKICAgICAgICAgICAgIC8vIEl0IHNob3VsZCByZWZlcmVuY2VzIHRoZSBidWZmZXIgdmlhIHRoZSBwaXBlLgogICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0byBkZXRlY3QgaW5jb3JyZWN0IHVzYWdlIG9mIHRoZSBidWZmZXIsIHdlIHNldCBtQnVmZmVyIHRvIE5VTEwuCiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUxMT0NfQ0JMSzoKICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCkBAIC0xOTYsNyArMjAxLDEwIEBACiAgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOwogICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewpAQCAtMzY4LDYgKzM3Niw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTM3Niw2ICszODUsNyBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnNpemUoKSA6IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKICAgICAgICAgICAgICAgICAgIHR5cGUsIHBvcnRJZCksCkBAIC00MTEsMjEgKzQyMSw2IEBACiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsICFpc0V4dGVybmFsVHJhY2soKSwgc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSXMgdGhlIHNoYXJlZCBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplPwotICAgICAgICAvLyAoZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIGlzIDw9IFNJWkVfTUFYLCBjaGVja2VkIGluIFRyYWNrQmFzZS4KLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIDwgZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpIHsKLSAgICAgICAgICAgIC8vIFdvcmthcm91bmQ6IGNsZWFyIG91dCBtQ2JsayB0byBpbmRpY2F0ZSB0cmFjayBoYXNuJ3QgYmVlbiBwcm9wZXJseSBjcmVhdGVkLgotICAgICAgICAgICAgbUNibGstPn5hdWRpb190cmFja19jYmxrX3QoKTsgICAvLyBkZXN0cm95IG91ciBzaGFyZWQtc3RydWN0dXJlLgotICAgICAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNibGspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNibGsgPSBOVUxMOwotCi0gICAgICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7IC8vIHJlbGVhc2Ugc2hhcmVkIGJ1ZmZlciBlYXJseQotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzODM0MDExNyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CiAgICAgfQpAQCAtNTAzLDU4ICs0OTgsNDAgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCi0gICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgVlMgZEIgICAgU2VydmVyIE1haW4gYnVmICBBdXggYnVmIEZsYWdzIFVuZEZybUNudCAgRmx1c2hlZFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKKyAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBGICUyZCIsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBub25lIik7Ci0gICAgfQotICAgIHRyYWNrX3N0YXRlIHN0YXRlID0gbVN0YXRlOwotICAgIGNoYXIgc3RhdGVDaGFyOwotICAgIGlmIChpc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICBzdGF0ZUNoYXIgPSAnVCc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIElETEU6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnSSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUElOR18xOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ3MnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkdfMjoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICc1JzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUyc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNVTUlORzoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdSJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFDVElWRToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdBJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBVVNJTkc6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAncCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGTFVTSEVEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0YnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnPyc7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBjaGFyIHRyYWNrVHlwZTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgY2FzZSBUWVBFX0RFRkFVTFQ6CisgICAgY2FzZSBUWVBFX09VVFBVVDoKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdHJhY2tUeXBlID0gJ1MnOyAvLyBzdGF0aWMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrVHlwZSA9ICcgJzsgLy8gbm9ybWFsCiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1BBVENIOgorICAgICAgICB0cmFja1R5cGUgPSAnUCc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRyYWNrVHlwZSA9ICc/JzsKICAgICB9CisKKyAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBub25lIiwgdHJhY2tUeXBlKTsKKyAgICB9CisKICAgICBjaGFyIG5vd0luVW5kZXJydW47CiAgICAgc3dpdGNoIChtT2JzZXJ2ZWRVbmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgewogICAgIGNhc2UgVU5ERVJSVU5fRlVMTDoKQEAgLTU3MSwzMSArNTQ4LDc1IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPiB2c1ZvbHVtZSA9IG1Wb2x1bWVIYW5kbGVyLT5nZXRMYXN0Vm9sdW1lKCk7Ci0gICAgc25wcmludGYoJmJ1ZmZlcls4XSwgc2l6ZSAtIDgsICIgJTZzICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnp1ICUxYyAlMWQgJTV1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnJWMgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4elggJTA4elggMHglMDNYICU5dSVjICU3dVxuIiwKKyAgICBjaGFyIGZpbGxpbmdTdGF0dXM7CisgICAgc3dpdGNoIChtRmlsbGluZ1VwU3RhdHVzKSB7CisgICAgY2FzZSBGU19JTlZBTElEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0knOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0ZJTExJTkc6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnZic7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfRklMTEVEOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0FDVElWRToKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdBJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICc/JzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY2xpcCBmcmFtZXNSZWFkeVNhZmUgdG8gbWF4IHJlcHJlc2VudGF0aW9uIGluIGR1bXAKKyAgICBjb25zdCBzaXplX3QgZnJhbWVzUmVhZHlTYWZlID0KKyAgICAgICAgICAgIHN0ZDo6bWluKG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpLCAoc2l6ZV90KTk5OTk5OTk5KTsKKworICAgIC8vIG9idGFpbiB2b2x1bWVzCisgICAgY29uc3QgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICBjb25zdCBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4gdnNWb2x1bWUgPQorICAgICAgICAgICAgbVZvbHVtZUhhbmRsZXItPmdldExhc3RWb2x1bWUoKTsKKworICAgIC8vIE91ciBlZmZlY3RpdmUgZnJhbWUgY291bnQgaXMgb2J0YWluZWQgYnkgU2VydmVyUHJveHk6OmdldEJ1ZmZlclNpemVJbkZyYW1lcygpCisgICAgLy8gYXMgaXQgbWF5IGJlIHJlZHVjZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplSW5GcmFtZXMgPSAoc2l6ZV90KW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOworICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBzaXplIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSBhcHAuCisgICAgY29uc3QgY2hhciBtb2RpZmllZEJ1ZmZlckNoYXIgPSBidWZmZXJTaXplSW5GcmFtZXMgPCBtRnJhbWVDb3VudAorICAgICAgICAgICAgPyAncicgLyogYnVmZmVyIHJlZHVjZWQgKi86IGJ1ZmZlclNpemVJbkZyYW1lcyA+IG1GcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgID8gJ2UnIC8qIGVycm9yICovIDogJyAnIC8qIGlkZW50aWNhbCAqLzsKKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUydSAlNS4yZyAlNS4yZyAlNS4yZyVjICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICU2enUlYyAlNnp1ICVjICU5dSVjICU3dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4elggJTA4elhcbiIsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKKyAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBzdGF0ZUNoYXIsCi0gICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorCisgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQogICAgICAgICAgICAgdnNWb2x1bWUuc2Vjb25kID8gJ0EnIDogJyAnLCAgLy8gaWYgYW55IFZvbHVtZVNoYXBlcnMgYWN0aXZlCisKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIsICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisgICAgICAgICAgICBidWZmZXJTaXplSW5GcmFtZXMsCisgICAgICAgICAgICBtb2RpZmllZEJ1ZmZlckNoYXIsCisgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUsCisgICAgICAgICAgICBmaWxsaW5nU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4sCi0gICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDApOyAvLyA3IGRpZ2l0cworICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAorCisgICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC0xMjM1LDcgKzEyNTYsOCBAQAogICAgICAgICAgICAgdWlkX3QgdWlkKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX1BBVENILAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICBOVUxMLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgIFRZUEVfT1VUUFVUKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CkBAIC0xMzUxLDcgKzEzNzMsOSBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUucmVtb3ZlQXQoMCk7CiAgICAgICAgICAgICAgICAgZnJlZShwSW5CdWZmZXItPm1CdWZmZXIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHBJbkJ1ZmZlciAhPSAmaW5CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDMwLDEwICsxNDU0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgYnVmZmVyLCAwLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTU2NywxMyArMTU5MywxNCBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE3MDEsMjIgKzE3MjgsMjggQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIEFjdGl2ZSBDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnQgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAlNnMgJTZ1ICUzdSAlMDhYICU3dSAlMWQgJTA4WCAlNnp1ICU1dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgorICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgorICAgICAgICAgICAgIiUwOFggJTZ6dVxuIiwKKyAgICAgICAgICAgIGlzRmFzdFRyYWNrKCkgPyAnRicgOiAnICcsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCisgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgIG1TdGF0ZSwKLSAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgbUZyYW1lQ291bnQsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKIAorICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCisgICAgICAgICAgICBtRnJhbWVDb3VudAorICAgICAgICAgICAgKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtMTc2Nyw5ICsxODAwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE4MzQsMTEgKzE4NjgsMTUgQEAKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIDAsIE5VTEwsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCi0gICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCkKKyAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKKyAgICAgICAgbVBpZChwaWQpCiB7CiB9CiAKQEAgLTE4ODUsMTcgKzE5MjMsMTcgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgQ2xpZW50IEZtdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgICAgICAgICAlNnUgJTN1ICAgICUwOFggJTV1XG4iLAotICAgICAgICAgICAgbVVpZCwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7Ci0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAyZDg0MDI4Li45MDlhZjA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtODgsMTEgKzg4LDExIEBACiAKIC8vIFdyaXRlIGhpc3RvZ3JhbSB0aW1lc3RhbXAgZW50cnkKICNkZWZpbmUgTE9HX0hJU1RfVFMoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RUUyhoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCisgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAotLy8gZmx1c2ggYWxsIGhpc3RvZ3JhbQotI2RlZmluZSBMT0dfSElTVF9GTFVTSCgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+bG9nSGlzdEZsdXNoKGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKKy8vIFJlY29yZCB0aGF0IGF1ZGlvIHdhcyB0dXJuZWQgb24vb2ZmCisjZGVmaW5lIExPR19BVURJT19TVEFURSgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0FVRElPX1NUQVRFLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggYWQzNDBlNS4uNjU1NzFmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw4IEBACiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmVmZmVjdHNjb25maWcKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCBjODY4MjA2Li43YjE5ZjU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTM0OSw4ICszNDksOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDgzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTAsMCArMSwzIEBACitqbXRyaXZpQGdvb2dsZS5jb20KK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmluZGV4IGNhMDcwY2YuLmNlZGYyMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NCwxNCArNDUsMTQgQEAKIAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtSW5wdXRTb3VyY2U7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9CiAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQotICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtVWlkID0gdWlkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9CisgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQogICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQogICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwpAQCAtNjUsMTEgKzY2LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBtSW5wdXRTb3VyY2U7CisgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87CiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7CiAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgdWlkX3QgbVVpZDsKICAgICBib29sICBtSXNTb3VuZFRyaWdnZXI7CiAgICAgdWludDMyX3QgIG1PcGVuQ291bnQ7CiAgICAgdWludDMyX3QgIG1BY3RpdmVDb3VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmluZGV4IGJlYTlmNGYuLjViNTdkM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1JbnB1dFNvdXJjZShpbnB1dFNvdXJjZSksCisgICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAogICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtVWlkKHVpZCksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCisgICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKICAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKIHsKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6CiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBtU2Vzc2lvbiwgbUlucHV0U291cmNlLAorICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmbVJlY29yZENsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDIsMTMgKzEwMiwxMyBAQAogCiBib29sIEF1ZGlvU2Vzc2lvbjo6bWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3QKIHsKLSAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtU2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtSW5wdXRTb3VyY2UgJiYKKyAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uICYmCisgICAgICAgIG90aGVyLT5pbnB1dFNvdXJjZSgpID09IG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSAmJgogICAgICAgICBvdGhlci0+Zm9ybWF0KCkgPT0gbUNvbmZpZy5mb3JtYXQgJiYKICAgICAgICAgb3RoZXItPnNhbXBsZVJhdGUoKSA9PSBtQ29uZmlnLnNhbXBsZV9yYXRlICYmCiAgICAgICAgIG90aGVyLT5jaGFubmVsTWFzaygpID09IG1Db25maWcuY2hhbm5lbF9tYXNrICYmCiAgICAgICAgIG90aGVyLT5mbGFncygpID09IG1GbGFncyAmJgotICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVVpZCkgeworICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVJlY29yZENsaWVudEluZm8udWlkKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzAsOCArMTMwLDcgQEAKICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTQ0LDExICsxNDMsMTEgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHNlc3Npb24gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlucHV0U291cmNlKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLmZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGRiY2MwNzAuLjMxYzk1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIyMCwxMSArMjIwLDExIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNjU0NDY1ZC4uODRiMTA3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzksMTEgKzQxLDE3IEBACiAKIEF1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKIHsKLSAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9hZFJlc3VsdCA+IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJWQgZWxlbWVudHMiLCBsb2FkUmVzdWx0KTsKICAgICB9CiB9CiAKQEAgLTY4NSw2ICs2OTMsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCkgeworICAgIGF1dG8gcmVzdWx0ID0gZWZmZWN0c0NvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGF1dG8gbG9hZFByb2Nlc3NpbmdDaGFpbiA9IFtdKGF1dG8mIHByb2Nlc3NpbmdDaGFpbiwgYXV0byYgc3RyZWFtcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICAgICAgYXV0byBlZmZlY3REZXNjcyA9IHN0ZDo6bWFrZV91bmlxdWU8RWZmZWN0RGVzY1ZlY3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZWZmZWN0IDogc3RyZWFtLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbS50eXBlLCBlZmZlY3REZXNjcy5yZWxlYXNlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOworICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjbm9kZSAqcm9vdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDBjNzRkODcuLjU5ZDVkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsgLy8gVE9ETzogYWRkIGxlZ2FjeSBpbiB0aGUgbmFtZQorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOyAvLyBUT0RPOiByZW1vdmUgIlhtbCIgaW4gdGhlIG5hbWUKIAogICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYzRmNjM2Ny4uYjQxNzYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTg1LDIxICsxODUsMjEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTI2NywxMiArMjY3LDEyIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgewotICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQpAQCAtNTQ0LDggKzU0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsIGRhdGEtPm1TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Tb3VyY2UsICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtODEwLDcgKzgxMCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKQEAgLTgxOCwxNCArODE4LDEzIEBACiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CiAgICAgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEgKmRhdGEgPSBuZXcgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEoKTsKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOwogICAgIGRhdGEtPm1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBldmVudCwgc291cmNlKTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZSBldmVudCAlZCwgc291cmNlICVkIHVpZCAldSIsCisgICAgICAgICAgICBldmVudCwgY2xpZW50SW5mby0+c291cmNlLCBjbGllbnRJbmZvLT51aWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAzNTU0MmYxLi4zOGQ0YjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIyOCwxMSArMjI4LDExIEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKIHByaXZhdGU6CkBAIC0zMDYsOCArMzA2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpAQCAtNDA0LDggKzQwNCw3IEBACiAgICAgICAgIGNsYXNzIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBpbnQgbUV2ZW50OwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKQEAgLTUxOCw3ICs1MTcsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTU0MCw4ICs1MzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA4NzZjNjg1Li5mM2JiMzVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTQwNCw2ICs0MDQsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGR1bXBSZWNlbnQocmVzdWx0LCB0c19zaW5jZSwgb25seSk7CiAgICAgfQorICAgIGZyZWUoKHZvaWQqKW9ubHkpOworICAgIG9ubHk9TlVMTDsKIAogCiAgICAgaWYgKGNsZWFyKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCA2YjMwZGI2Li4yZGFhODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFDYXNTZXJ2aWNlLmNwcCBcCiAgICAgTWVkaWFEcm1TZXJ2aWNlLmNwcCBcCiAgICAgbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oIGIvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxMTE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfTE9BREVSX0hfCi0jZGVmaW5lIE1FRElBX0NBU19MT0FERVJfSF8KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBGYWN0b3J5TG9hZGVyIHsKLXB1YmxpYzoKLSAgICBGYWN0b3J5TG9hZGVyKGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbUZhY3RvcnkoTlVMTCksIG1DcmVhdGVGYWN0b3J5RnVuY05hbWUobmFtZSkge30KLQotICAgIHZpcnR1YWwgfkZhY3RvcnlMb2FkZXIoKSB7IGNsb3NlRmFjdG9yeSgpOyB9Ci0KLSAgICBib29sIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSA9IE5VTEwsCi0gICAgICAgICAgICBUKiogZmFjdG9yeSA9IE5VTEwpOwotCi0gICAgYm9vbCBlbnVtZXJhdGVQbHVnaW5zKHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgVCooKkNyZWF0ZUZhY3RvcnlGdW5jKSgpOwotCi0gICAgTXV0ZXggbU1hcExvY2s7Ci0gICAgVCogbUZhY3Rvcnk7Ci0gICAgY29uc3QgY2hhciAqbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBTdHJpbmc4PiBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXA7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotCi0gICAgYm9vbCBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksCi0gICAgICAgICAgICBUKiogZmFjdG9yeSk7Ci0KLSAgICBib29sIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi0gICAgYm9vbCBvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICBsaWJyYXJ5LT5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkoQ0Ffc3lzdGVtX2lkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLAotICAgICAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gbm8gbHVjaywgaGF2ZSB0byBzZWFyY2gKLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBpZiAobG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgcGx1Z2luUGF0aCwgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KSkgewotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5hZGQoQ0Ffc3lzdGVtX2lkLCBwbHVnaW5QYXRoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgcGx1Z2luIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dJKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICByZXN1bHRzLT5jbGVhcigpOwotCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKHBsdWdpblBhdGgsIHJlc3VsdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6bG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCAhbUZhY3RvcnktPmlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgKmxpYnJhcnkgPSBtTGlicmFyeTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IG1GYWN0b3J5OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OnF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICB2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCBtRmFjdG9yeS0+cXVlcnlQbHVnaW5zKCZkZXNjcmlwdG9ycykgIT0gT0spIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXNjcmlwdG9ycy5iZWdpbigpOyBpdCAhPSBkZXNjcmlwdG9ycy5lbmQoKTsgaXQrKykgewotICAgICAgICByZXN1bHRzLT5wdXNoX2JhY2soUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgaXQtPkNBX3N5c3RlbV9pZCwgaXQtPm5hbWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKSB7Ci0gICAgLy8gZ2V0IHN0cm9uZyBwb2ludGVyIHRvIG9wZW4gc2hhcmVkIGxpYnJhcnkKLSAgICBzc2l6ZV90IGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5pbmRleE9mS2V5KHBhdGgpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcFtpbmRleF0ucHJvbW90ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5hZGQocGF0aCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFtTGlicmFyeS5nZXQoKSkgewotICAgICAgICBtTGlicmFyeSA9IG5ldyBTaGFyZWRMaWJyYXJ5KHBhdGgpOwotICAgICAgICBpZiAoISptTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgbUxpYnJhcnkpOwotICAgIH0KLQotICAgIENyZWF0ZUZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnkgPQotICAgICAgICAoQ3JlYXRlRmFjdG9yeUZ1bmMpbUxpYnJhcnktPmxvb2t1cChtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKTsKLSAgICBpZiAoY3JlYXRlRmFjdG9yeSA9PSBOVUxMIHx8IChtRmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgRmFjdG9yeUxvYWRlcjxUPjo6Y2xvc2VGYWN0b3J5KCkgewotICAgIGRlbGV0ZSBtRmFjdG9yeTsKLSAgICBtRmFjdG9yeSA9IE5VTEw7Ci0gICAgbUxpYnJhcnkuY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTEyODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNhc1NlcnZpY2UiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhLmNhcyIpLCBuZXcgTWVkaWFDYXNTZXJ2aWNlKCkpOwotfQotCi1NZWRpYUNhc1NlcnZpY2U6Ok1lZGlhQ2FzU2VydmljZSgpIDoKLSAgICBtQ2FzTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+KCJjcmVhdGVDYXNGYWN0b3J5IikpLAotICAgIG1EZXNjcmFtYmxlckxvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+KAotICAgICAgICAgICAgImNyZWF0ZURlc2NyYW1ibGVyRmFjdG9yeSIpKSB7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6fk1lZGlhQ2FzU2VydmljZSgpIHsKLSAgICBkZWxldGUgbUNhc0xvYWRlcjsKLSAgICBkZWxldGUgbURlc2NyYW1ibGVyTG9hZGVyOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR1YoImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIG1DYXNMb2FkZXItPmVudW1lcmF0ZVBsdWdpbnMocmVzdWx0cyk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzU3lzdGVtSWRTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZVBsdWdpbjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIENhc0ZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIENhc1BsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgc3A8Q2FzSW1wbD4gY2FzSW1wbCA9IG5ldyBDYXNJbXBsKGxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICh1aW50NjRfdCljYXNJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICZDYXNJbXBsOjpPbkV2ZW50LCAmcGx1Z2luKSA9PSBPSyAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgY2FzSW1wbC0+aW5pdChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICAgICAgKnJlc3VsdCA9IGNhc0ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlRGVzY3JhbWJsZXI6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBEZXNjcmFtYmxlckZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICZwbHVnaW4pID09IE9LCi0gICAgICAgICAgICAgICAgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpyZXN1bHQgPSBuZXcgRGVzY3JhbWJsZXJJbXBsKGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgyOGYyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUNhc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIkZhY3RvcnlMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzRmFjdG9yeTsKLXN0cnVjdCBEZXNjcmFtYmxlckZhY3Rvcnk7Ci0KLWNsYXNzIE1lZGlhQ2FzU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhQ2FzU2VydmljZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PiAqbUNhc0xvYWRlcjsKLSAgICBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4gKm1EZXNjcmFtYmxlckxvYWRlcjsKLQotICAgIE1lZGlhQ2FzU2VydmljZSgpOwotICAgIHZpcnR1YWwgfk1lZGlhQ2FzU2VydmljZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKaW5kZXggYjY4NWFlMC4uYjc2N2I4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIk1lZGlhRHJtU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzksNyArMzgsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIE1lZGlhRHJtU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL09XTkVSUwpAQCAtMCwwICsxIEBACitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rIGIvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MGRjMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFJhZGlvU2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJyYWRpbyBcCi0gICAgbGlicmFkaW9fbWV0YWRhdGEKLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFJhZGlvSGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEhpZGxVdGlscy5jcHAgXAotICAgIFJhZGlvSGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5icm9hZGNhc3RyYWRpb0AxLjAKLWVuZGlmCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGlicmFkaW9zZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAgYi9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk1Mzc3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgIkhpZGxVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KLQotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6TWV0YWRhdGFUeXBlOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpCYW5kOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpEZWVtcGhhc2lzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZHM7Ci0KLS8vc3RhdGljCi1pbnQgSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KFJlc3VsdCByZXN1bHQpCi17Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzoKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURToKLSAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOwotICAgICAgICBjYXNlIFJlc3VsdDo6VElNRU9VVDoKLSAgICAgICAgICAgIHJldHVybiAtRVRJTUVET1VUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotfQotCi0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGhhbENvbmZpZy0+dHlwZSA9IHN0YXRpY19jYXN0PEJhbmQ+KGNvbmZpZy0+dHlwZSk7Ci0gICAgaGFsQ29uZmlnLT5hbnRlbm5hQ29ubmVjdGVkID0gY29uZmlnLT5hbnRlbm5hX2Nvbm5lY3RlZDsKLSAgICBoYWxDb25maWctPmxvd2VyTGltaXQgPSBjb25maWctPmxvd2VyX2xpbWl0OwotICAgIGhhbENvbmZpZy0+dXBwZXJMaW1pdCA9IGNvbmZpZy0+dXBwZXJfbGltaXQ7Ci0gICAgaGFsQ29uZmlnLT5zcGFjaW5ncy5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dW5zaWduZWQgaW50ICo+KCZjb25maWctPnNwYWNpbmdzWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bnVtX3NwYWNpbmdzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgLy8gRklYTUU6IHRyYW5zZmVyIGJ1ZmZlciBvd25lcnNoaXAuIHNob3VsZCBoYXZlIGEgbWV0aG9kIGZvciB0aGF0IGluIGhpZGxfdmVjCi0gICAgaGFsQ29uZmlnLT5zcGFjaW5ncy5yZXNpemUoY29uZmlnLT5udW1fc3BhY2luZ3MpOwotCi0gICAgaWYgKGhhbENvbmZpZy0+dHlwZSA9PSBCYW5kOjpGTSkgewotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5kZWVtcGhhc2lzID0gc3RhdGljX2Nhc3Q8RGVlbXBoYXNpcz4oY29uZmlnLT5mbS5kZWVtcGhhc2lzKTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uc3RlcmVvID0gY29uZmlnLT5mbS5zdGVyZW87Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnJkcyA9IHN0YXRpY19jYXN0PFJkcz4oY29uZmlnLT5mbS5yZHMpOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS50YSA9IGNvbmZpZy0+Zm0udGE7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmFmID0gY29uZmlnLT5mbS5hZjsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uZWEgPSBjb25maWctPmZtLmVhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmFtLnN0ZXJlbyA9IGNvbmZpZy0+YW0uc3RlcmVvOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydGllcyAqaGFsUHJvcGVydGllcykKLXsKLSAgICBwcm9wZXJ0aWVzLT5jbGFzc19pZCA9IHN0YXRpY19jYXN0PHJhZGlvX2NsYXNzX3Q+KGhhbFByb3BlcnRpZXMtPmNsYXNzSWQpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+aW1wbGVtZW50b3IsIGhhbFByb3BlcnRpZXMtPmltcGxlbWVudG9yLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnByb2R1Y3QsIGhhbFByb3BlcnRpZXMtPnByb2R1Y3QuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbi5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5zZXJpYWwsIGhhbFByb3BlcnRpZXMtPnNlcmlhbC5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgcHJvcGVydGllcy0+bnVtX3R1bmVycyA9IGhhbFByb3BlcnRpZXMtPm51bVR1bmVyczsKLSAgICBwcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlcyA9IGhhbFByb3BlcnRpZXMtPm51bUF1ZGlvU291cmNlczsKLSAgICBwcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlID0gaGFsUHJvcGVydGllcy0+c3VwcG9ydHNDYXB0dXJlOwotICAgIHByb3BlcnRpZXMtPm51bV9iYW5kcyA9IGhhbFByb3BlcnRpZXMtPmJhbmRzLnNpemUoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUHJvcGVydGllcy0+YmFuZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29udmVydEJhbmRDb25maWdGcm9tSGFsKCZwcm9wZXJ0aWVzLT5iYW5kc1tpXSwgJmhhbFByb3BlcnRpZXMtPmJhbmRzW2ldKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKmhhbENvbmZpZykKLXsKLSAgICBjb25maWctPnR5cGUgPSBzdGF0aWNfY2FzdDxyYWRpb19iYW5kX3Q+KGhhbENvbmZpZy0+dHlwZSk7Ci0gICAgY29uZmlnLT5hbnRlbm5hX2Nvbm5lY3RlZCA9IGhhbENvbmZpZy0+YW50ZW5uYUNvbm5lY3RlZDsKLSAgICBjb25maWctPmxvd2VyX2xpbWl0ID0gaGFsQ29uZmlnLT5sb3dlckxpbWl0OwotICAgIGNvbmZpZy0+dXBwZXJfbGltaXQgPSBoYWxDb25maWctPnVwcGVyTGltaXQ7Ci0gICAgY29uZmlnLT5udW1fc3BhY2luZ3MgPSBoYWxDb25maWctPnNwYWNpbmdzLnNpemUoKTsKLSAgICBpZiAoY29uZmlnLT5udW1fc3BhY2luZ3MgPiBSQURJT19OVU1fU1BBQ0lOR1NfTUFYKSB7Ci0gICAgICAgIGNvbmZpZy0+bnVtX3NwYWNpbmdzID0gUkFESU9fTlVNX1NQQUNJTkdTX01BWDsKLSAgICB9Ci0gICAgbWVtY3B5KGNvbmZpZy0+c3BhY2luZ3MsIGhhbENvbmZpZy0+c3BhY2luZ3MuZGF0YSgpLAotICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogY29uZmlnLT5udW1fc3BhY2luZ3MpOwotCi0gICAgaWYgKGhhbENvbmZpZy0+dHlwZSA9PSBCYW5kOjpGTSkgewotICAgICAgICBjb25maWctPmZtLmRlZW1waGFzaXMgPSBzdGF0aWNfY2FzdDxyYWRpb19kZWVtcGhhc2lzX3Q+KGhhbENvbmZpZy0+ZXh0LmZtLmRlZW1waGFzaXMpOwotICAgICAgICBjb25maWctPmZtLnN0ZXJlbyA9IGhhbENvbmZpZy0+ZXh0LmZtLnN0ZXJlbzsKLSAgICAgICAgY29uZmlnLT5mbS5yZHMgPSBzdGF0aWNfY2FzdDxyYWRpb19yZHNfdD4oaGFsQ29uZmlnLT5leHQuZm0ucmRzKTsKLSAgICAgICAgY29uZmlnLT5mbS50YSA9IGhhbENvbmZpZy0+ZXh0LmZtLnRhOwotICAgICAgICBjb25maWctPmZtLmFmID0gaGFsQ29uZmlnLT5leHQuZm0uYWY7Ci0gICAgICAgIGNvbmZpZy0+Zm0uZWEgPSBoYWxDb25maWctPmV4dC5mbS5lYTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25maWctPmFtLnN0ZXJlbyA9IGhhbENvbmZpZy0+ZXh0LmFtLnN0ZXJlbzsKLSAgICB9Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbUluZm8gKmhhbEluZm8pCi17Ci0gICAgaW5mby0+Y2hhbm5lbCA9IGhhbEluZm8tPmNoYW5uZWw7Ci0gICAgaW5mby0+c3ViX2NoYW5uZWwgPSBoYWxJbmZvLT5zdWJDaGFubmVsOwotICAgIGluZm8tPnR1bmVkID0gaGFsSW5mby0+dHVuZWQ7Ci0gICAgaW5mby0+c3RlcmVvID0gaGFsSW5mby0+c3RlcmVvOwotICAgIGluZm8tPmRpZ2l0YWwgPSBoYWxJbmZvLT5kaWdpdGFsOwotICAgIGluZm8tPnNpZ25hbF9zdHJlbmd0aCA9IGhhbEluZm8tPnNpZ25hbFN0cmVuZ3RoOwotICAgIGNvbnZlcnRNZXRhRGF0YUZyb21IYWwoJmluZm8tPm1ldGFkYXRhLCBoYWxJbmZvLT5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEluZm8tPmNoYW5uZWwsIGhhbEluZm8tPnN1YkNoYW5uZWwpOwotfQotCi0vLyBUT0RPKHR3YXNpbGN6eWspOiBkcm9wIHVubmVjZXNzYXJ5IGNoYW5uZWwgaW5mbwotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0TWV0YURhdGFGcm9tSGFsKHJhZGlvX21ldGFkYXRhX3QgKiptZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPE1ldGFEYXRhPiYgaGFsTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCBfX3VudXNlZCkKLXsKLQotICAgIGlmIChtZXRhZGF0YSA9PSBudWxscHRyIHx8ICptZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZXN0aW5hdGlvbiBtZXRhZGF0YSBidWZmZXIgaXMgYSBudWxscHRyIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxNZXRhZGF0YS5zaXplKCk7IGkrKykgewotICAgICAgICByYWRpb19tZXRhZGF0YV9rZXlfdCBrZXkgPSBzdGF0aWNfY2FzdDxyYWRpb19tZXRhZGF0YV9rZXlfdD4oaGFsTWV0YWRhdGFbaV0ua2V5KTsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfdHlwZV90IHR5cGUgPSBzdGF0aWNfY2FzdDxyYWRpb19tZXRhZGF0YV9rZXlfdD4oaGFsTWV0YWRhdGFbaV0udHlwZSk7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX2Nsb2NrX3QgY2xvY2s7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9JTlQ6Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfaW50KG1ldGFkYXRhLCBrZXksIGhhbE1ldGFkYXRhW2ldLmludFZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfVEVYVDoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF90ZXh0KG1ldGFkYXRhLCBrZXksIGhhbE1ldGFkYXRhW2ldLnN0cmluZ1ZhbHVlLmNfc3RyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9SQVc6Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfcmF3KG1ldGFkYXRhLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLnJhd1ZhbHVlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0ucmF3VmFsdWUuc2l6ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBRElPX01FVEFEQVRBX1RZUEVfQ0xPQ0s6Ci0gICAgICAgICAgICBjbG9jay51dGNfc2Vjb25kc19zaW5jZV9lcG9jaCA9Ci0gICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLmNsb2NrVmFsdWUudXRjU2Vjb25kc1NpbmNlRXBvY2g7Ci0gICAgICAgICAgICBjbG9jay50aW1lem9uZV9vZmZzZXRfaW5fbWludXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGhhbE1ldGFkYXRhW2ldLmNsb2NrVmFsdWUudGltZXpvbmVPZmZzZXRJbk1pbnV0ZXM7Ci0gICAgICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfY2xvY2sobWV0YWRhdGEsIGtleSwgJmNsb2NrKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIiVzIGludmFsaWQgbWV0YWRhdGEgdHlwZSAldSIsX19GVU5DVElPTl9fLCBoYWxNZXRhZGF0YVtpXS50eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmggYi9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3MTA2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb3BlcnRpZXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmRDb25maWc7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb2dyYW1JbmZvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhRGF0YTsKLQotY2xhc3MgSGlkbFV0aWxzIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW50IGNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdGcm9tSGFsKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKmhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXNGcm9tSGFsKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnRpZXMgKmhhbFByb3BlcnRpZXMpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoQmFuZENvbmZpZyAqaGFsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb2dyYW1JbmZvRnJvbUhhbChyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1JbmZvICpoYWxJbmZvKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFGcm9tSGFsKHJhZGlvX21ldGFkYXRhX3QgKiptZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPE1ldGFEYXRhPiYgaGFsTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vT1dORVJTIGIvc2VydmljZXMvcmFkaW8vT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk1NDlhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZWxhdXJlbnRAZ29vZ2xlLmNvbQotaHVuZ2FAZ29vZ2xlLmNvbQotdHdhc2lsY3p5a0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNzI3NS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9SYWRpb01ldGFkYXRhV3JhcHBlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpb0ZhY3RvcnkuaD4KLQotI2luY2x1ZGUgIlJhZGlvSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SUJyb2FkY2FzdFJhZGlvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6Q2xhc3M7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRpcmVjdGlvbjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLQotCi0vKiBzdGF0aWMgKi8KLXNwPFJhZGlvSW50ZXJmYWNlPiBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpCi17Ci0gICAgcmV0dXJuIG5ldyBSYWRpb0hhbEhpZGwoY2xhc3NJZCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OmdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gbW9kdWxlID0gZ2V0U2VydmljZSgpOwotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIFJlc3VsdCBoYWxSZXN1bHQgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPmdldFByb3BlcnRpZXMoWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6Om9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1vZHVsZSA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBuZXcgVHVuZXIoY2FsbGJhY2ssIHRoaXMpOwotCi0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIHNwPElUdW5lcj4gaGFsVHVuZXI7Ci0KLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtb2R1bGUtPm9wZW5UdW5lcihoYWxDb25maWcsIGF1ZGlvLCB0dW5lckltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3Qgc3A8SVR1bmVyPiYgdHVuZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyID0gdHVuZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIGlmIChoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgdHVuZXIgPSB0dW5lckltcGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IHN0YXRpY19jYXN0PFR1bmVyICo+KHR1bmVyLmdldCgpKTsKLSAgICBzcDxJVHVuZXI+IGNsZWFyVHVuZXI7Ci0gICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihjbGVhclR1bmVyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUmFkaW9IYWxIaWRsOjpSYWRpb0hhbEhpZGwocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotICAgIDogbUNsYXNzSWQoY2xhc3NJZCkKLXsKLX0KLQotUmFkaW9IYWxIaWRsOjp+UmFkaW9IYWxIaWRsKCkKLXsKLX0KLQotc3A8SUJyb2FkY2FzdFJhZGlvPiBSYWRpb0hhbEhpZGw6OmdldFNlcnZpY2UoKQotewotICAgIGlmIChtSGFsTW9kdWxlID09IDApIHsKLSAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvRmFjdG9yeT4gZmFjdG9yeSA9IElCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gMCkgewotICAgICAgICAgICAgZmFjdG9yeS0+Y29ubmVjdE1vZHVsZShzdGF0aWNfY2FzdDxDbGFzcz4obUNsYXNzSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgcmV0dmFsLCBjb25zdCA6OmFuZHJvaWQ6OnNwPElCcm9hZGNhc3RSYWRpbz4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtSGFsTW9kdWxlID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyBPVVQgbW9kdWxlICVwIiwgX19GVU5DVElPTl9fLCBtSGFsTW9kdWxlLmdldCgpKTsKLSAgICByZXR1cm4gbUhhbE1vZHVsZTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OmNsZWFyU2VydmljZSgpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1vZHVsZSAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbE1vZHVsZS5nZXQoKSk7Ci0gICAgbUhhbE1vZHVsZS5jbGVhcigpOwotfQotCi0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLQotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5zZXRDb25maWd1cmF0aW9uKGhhbENvbmZpZyk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgQmFuZENvbmZpZyBoYWxDb25maWc7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPmdldENvbmZpZ3VyYXRpb24oWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykgewotICAgICAgICAgICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpICYmIGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKGNvbmZpZywgJmhhbENvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zY2FuKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5zdGVwKHN0YXRpY19jYXN0PERpcmVjdGlvbj4oZGlyZWN0aW9uKSwgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPnR1bmUoY2hhbm5lbCwgc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpjYW5jZWwoKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0gbUhhbFR1bmVyLT5jYW5jZWwoKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAoaW5mbyA9PSBudWxscHRyIHx8IGluZm8tPm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgUHJvZ3JhbUluZm8gaGFsSW5mbzsKLSAgICBSZXN1bHQgaGFsUmVzdWx0OwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0gbUhhbFR1bmVyLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oCi0gICAgICAgIFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykgewotICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgaGFsSW5mbyA9IGluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIGlmIChoaWRsUmV0dXJuLmlzT2soKSAmJiBoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoaW5mbywgJmhhbEluZm8pOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYXJkd2FyZUZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgaGFuZGxlSHdGYWlsdXJlKCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6Y29uZmlnQ2hhbmdlKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05GSUc7Ci0gICAgZXZlbnQuc3RhdHVzID0gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KHJlc3VsdCk7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJmV2ZW50LmNvbmZpZywgJmNvbmZpZyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnR1bmVDb21wbGV0ZShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5pbmZvLm1ldGFkYXRhKTsKLQotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKLSAgICBldmVudC5zdGF0dXMgPSBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQocmVzdWx0KTsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoJmV2ZW50LmluZm8sICZpbmZvKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6YWZTd2l0Y2goY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQuaW5mby5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQUZfU1dJVENIOwotICAgIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbCgmZXZlbnQuaW5mbywgJmluZm8pOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjphbnRlbm5hU3RhdGVDaGFuZ2UoYm9vbCBjb25uZWN0ZWQpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQU5URU5OQTsKLSAgICBldmVudC5vbiA9IGNvbm5lY3RlZDsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnRyYWZmaWNBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVEE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjplbWVyZ2VuY3lBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfRUE7Ci0gICAgZXZlbnQub24gPSBhY3RpdmU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8TWV0YURhdGE+JiBtZXRhZGF0YSkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfTUVUQURBVEE7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0TWV0YURhdGFGcm9tSGFsKCZldmVudC5tZXRhZGF0YSwgbWV0YWRhdGEsIGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLQotUmFkaW9IYWxIaWRsOjpUdW5lcjo6VHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spLCBtUGFyZW50TW9kdWxlKG1vZHVsZSkKLXsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGhhbmRsZXIgd2UgYXJlIHBhc3NpbmcgaW4gb25seSBkZWFscyB3aXRoIGNvbnN0IG1lbWJlcnMsCi0gICAgLy8gYXMgaXQgY2FuIGJlIGNhbGxlZCBvbiBhbiBhcmJpdHJhcnkgdGhyZWFkLgotICAgIGNvbnN0IGF1dG8mIHNlbGYgPSB0aGlzOwotICAgIEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+cmVnaXN0ZXJBdEV4aXRIYW5kbGVyKAotICAgICAgICAgICAgdGhpcywgWyZzZWxmXSgpIHsgc2VsZi0+c2VuZEh3RmFpbHVyZUV2ZW50KCk7IH0pOwotfQotCi0KLVJhZGlvSGFsSGlkbDo6VHVuZXI6On5UdW5lcigpCi17Ci0gICAgSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT51bnJlZ2lzdGVyQXRFeGl0SGFuZGxlcih0aGlzKTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcikgewotICAgIGlmIChtSGFsVHVuZXIgIT0gMCkgewotICAgICAgICBtSGFsVHVuZXItPnVubGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpKTsKLSAgICB9Ci0gICAgbUhhbFR1bmVyID0gaGFsVHVuZXI7Ci0gICAgaWYgKG1IYWxUdW5lciAhPSAwKSB7Ci0gICAgICAgIG1IYWxUdW5lci0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpoYW5kbGVId0ZhaWx1cmUoKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8UmFkaW9IYWxIaWRsPiBwYXJlbnRNb2R1bGUgPSBtUGFyZW50TW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAocGFyZW50TW9kdWxlICE9IDApIHsKLSAgICAgICAgcGFyZW50TW9kdWxlLT5jbGVhclNlcnZpY2UoKTsKLSAgICB9Ci0gICAgc2VuZEh3RmFpbHVyZUV2ZW50KCk7Ci0gICAgbUhhbFR1bmVyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3QKLXsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfSFdfRkFJTFVSRTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6b25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudChoYWxFdmVudCk7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTg0MjBkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lCcm9hZGNhc3RSYWRpby5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lci5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL0lUdW5lckNhbGxiYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UmVzdWx0OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJQnJvYWRjYXN0UmFkaW87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklUdW5lcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SVR1bmVyQ2FsbGJhY2s7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBSYWRpb0hhbEhpZGwgOiBwdWJsaWMgUmFkaW9JbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxIaWRsKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW9JbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKTsKLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLQotICAgICAgICBjbGFzcyBUdW5lciAgOiBwdWJsaWMgVHVuZXJJbnRlcmZhY2UsIHB1YmxpYyB2aXJ0dWFsIElUdW5lckNhbGxiYWNrCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgVHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssIHNwPFJhZGlvSGFsSGlkbD4gbW9kdWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVuZXJJbnRlcmZhY2UKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBjYW5jZWwoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElUdW5lckNhbGxiYWNrCi0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBoYXJkd2FyZUZhaWx1cmUoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbmZpZ0NoYW5nZShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gdHVuZUNvbXBsZXRlKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFmU3dpdGNoKGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGFudGVubmFTdGF0ZUNoYW5nZShib29sIGNvbm5lY3RlZCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiB0cmFmZmljQW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGVtZXJnZW5jeUFubm91bmNlbWVudChib29sIGFjdGl2ZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBuZXdNZXRhZGF0YSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzxNZXRhRGF0YT4mIG1ldGFkYXRhKTsKLQotICAgICAgICAgICAgdm9pZCBzZXRIYWxUdW5lcihzcDxJVHVuZXI+JiBoYWxUdW5lcik7Ci0gICAgICAgICAgICBzcDxJVHVuZXI+IGdldEhhbFR1bmVyKCkgeyByZXR1cm4gbUhhbFR1bmVyOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZpcnR1YWwgICAgICAgICAgflR1bmVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpIGNvbnN0OwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICBoYW5kbGVId0ZhaWx1cmUoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgc2VuZEh3RmFpbHVyZUV2ZW50KCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHNwPElUdW5lcj4gbUhhbFR1bmVyOwotICAgICAgICAgICAgY29uc3Qgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrOwotICAgICAgICAgICAgd3A8UmFkaW9IYWxIaWRsPiBtUGFyZW50TW9kdWxlOwotICAgICAgICB9OwotCi0gICAgICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gZ2V0U2VydmljZSgpOwotICAgICAgICB2b2lkIGNsZWFyU2VydmljZSgpOwotCi1wcml2YXRlOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgflJhZGlvSGFsSGlkbCgpOwotCi0gICAgICAgICAgICAgICAgcmFkaW9fY2xhc3NfdCBtQ2xhc3NJZDsKLSAgICAgICAgICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1IYWxNb2R1bGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwY2NkNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9IYWxMZWdhY3kiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSAiUmFkaW9IYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jb25zdCBjaGFyICpSYWRpb0hhbExlZ2FjeTo6c0NsYXNzTW9kdWxlTmFtZXNbXSA9IHsKLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRk0sIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX0FNX0ZNICovCi0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NBVCwgIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX1NBVCAqLwotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9EVCwgICAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19EVCAqLwotfTsKLQotLyogc3RhdGljICovCi1zcDxSYWRpb0ludGVyZmFjZT4gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotewotICAgIHJldHVybiBuZXcgUmFkaW9IYWxMZWdhY3koY2xhc3NJZCk7Ci19Ci0KLVJhZGlvSGFsTGVnYWN5OjpSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpCi0gICAgOiBSYWRpb0ludGVyZmFjZSgpLCBtQ2xhc3NJZChjbGFzc0lkKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgUmFkaW9IYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotICAgIEFMT0dJKCIlcyBtQ2xhc3NJZCAlZCIsIF9fRlVOQ1RJT05fXywgbUNsYXNzSWQpOwotCi0gICAgbUh3RGV2aWNlID0gTlVMTDsKLQotICAgIGlmICgobUNsYXNzSWQgPCAwKSB8fAotICAgICAgICAgICAgKG1DbGFzc0lkID49IE5FTEVNKHNDbGFzc01vZHVsZU5hbWVzKSkpIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgY2xhc3MgSUQgJWQiLCBtQ2xhc3NJZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HSSgiJXMgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEICVzICVzIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgc0NsYXNzTW9kdWxlTmFtZXNbbUNsYXNzSWRdKTsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgcmFkaW8gbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSByYWRpb19od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHJhZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IFJBRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyByYWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgIH0KLX0KLQotUmFkaW9IYWxMZWdhY3k6On5SYWRpb0hhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIGludCByYyA9IG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHJldHVybiByYzsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gbmV3IFR1bmVyKGNhbGxiYWNrKTsKLQotICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXI7Ci0gICAgaW50IHJjID0gbUh3RGV2aWNlLT5vcGVuX3R1bmVyKG1Id0RldmljZSwgY29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjaywgdHVuZXJJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsVHVuZXIpOwotICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoaGFsVHVuZXIpOwotICAgICAgICB0dW5lciA9IHR1bmVySW1wbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OmNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmICh0dW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gKFR1bmVyICopdHVuZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Y2xvc2VfdHVuZXIobUh3RGV2aWNlLCB0dW5lckltcGwtPmdldEhhbFR1bmVyKCkpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zZXRfY29uZmlndXJhdGlvbihtSGFsVHVuZXIsIGNvbmZpZyk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmdldF9jb25maWd1cmF0aW9uKG1IYWxUdW5lciwgY29uZmlnKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnNjYW4obUhhbFR1bmVyLCBkaXJlY3Rpb24sIHNraXBfc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c3RlcChtSGFsVHVuZXIsIGRpcmVjdGlvbiwgc2tpcF9zdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnR1bmUobUhhbFR1bmVyLCBjaGFubmVsLCBzdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmNhbmNlbCgpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5jYW5jZWwobUhhbFR1bmVyKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Z2V0X3Byb2dyYW1faW5mb3JtYXRpb24obUhhbFR1bmVyLCBpbmZvKTsKLX0KLQotdm9pZCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6Om9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoaGFsRXZlbnQpOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSkKLXsKLSAgICB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+IHdlYWsgPSB3cDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+KChSYWRpb0hhbExlZ2FjeTo6VHVuZXIgKiljb29raWUpOwotICAgIHNwPFJhZGlvSGFsTGVnYWN5OjpUdW5lcj4gdHVuZXIgPSB3ZWFrLnByb21vdGUoKTsKLSAgICBpZiAodHVuZXIgIT0gMCkgewotICAgICAgICB0dW5lci0+b25DYWxsYmFjayhoYWxFdmVudCk7Ci0gICAgfQotfQotCi1SYWRpb0hhbExlZ2FjeTo6VHVuZXI6OlR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKQotICAgIDogVHVuZXJJbnRlcmZhY2UoKSwgbUhhbFR1bmVyKE5VTEwpLCBtQ2FsbGJhY2soY2FsbGJhY2spCi17Ci19Ci0KLQotUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjp+VHVuZXIoKQotewotfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQ4MzFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0hhbExlZ2FjeSA6IHB1YmxpYyBSYWRpb0ludGVyZmFjZQotewotcHVibGljOgotICAgICAgICBSYWRpb0hhbExlZ2FjeShyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgIC8vIFJhZGlvSW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcyk7Ci0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgIGNsYXNzIFR1bmVyICA6IHB1YmxpYyBUdW5lckludGVyZmFjZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKTsKLQotICAgICAgICAgICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOwotICAgICAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgICAgICAgICB2b2lkIHNldEhhbFR1bmVyKGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqaGFsVHVuZXIpIHsgbUhhbFR1bmVyID0gaGFsVHVuZXI7IH0KLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAqZ2V0SGFsVHVuZXIoKSB7IHJldHVybiBtSGFsVHVuZXI7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgdmlydHVhbCAgICAgIH5UdW5lcigpOwotCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgICAgKm1IYWxUdW5lcjsKLSAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+ICBtQ2FsbGJhY2s7Ci0gICAgICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCAgICAgflJhZGlvSGFsTGVnYWN5KCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogc0NsYXNzTW9kdWxlTmFtZXNbXTsKLQotICAgICAgICByYWRpb19jbGFzc190IG1DbGFzc0lkOwotICAgICAgICBzdHJ1Y3QgcmFkaW9faHdfZGV2aWNlICAqbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZiNGQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0ludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgLyogZ2V0IGEgc291bmQgdHJpZ2dlciBIQUwgaW5zdGFuY2UgKi8KLSAgICAgICAgc3RhdGljIHNwPFJhZGlvSW50ZXJmYWNlPiBjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcy4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIHByb3BlcnRpZXM6IHdoZXJlIHRvIHJldHVybiB0aGUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgbm8gZXJyb3IKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3BlbiBhIHR1bmVyIGludGVyZmFjZSBmb3IgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLgotICAgICAgICAgKiBJZiBubyBvdGhlciB0dW5lciBpcyBvcGVuZWQsIHRoaXMgd2lsbCBhY3RpdmF0ZSB0aGUgcmFkaW8gbW9kdWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB0aGUgYmFuZCBjb25maWd1cmF0aW9uIHRvIGFwcGx5Ci0gICAgICAgICAqIC0gYXVkaW86IHRoaXMgdHVuZXIgd2lsbCBiZSB1c2VkIGZvciBsaXZlIHJhZGlvIGxpc3RlbmluZyBhbmQgc2hvdWxkIGJlIGNvbm5lY3RlZCB0bwotICAgICAgICAgKiB0aGUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgICAgICAgKiAtIGNhbGxiYWNrOiB0aGUgZXZlbnQgY2FsbGJhY2sKLSAgICAgICAgICogLSBjb29raWU6IHRoZSBjb29raWUgdG8gcGFzcyB3aGVuIGNhbGxpbmcgdGhlIGNhbGxiYWNrCi0gICAgICAgICAqIC0gdHVuZXI6IHdoZXJlIHRvIHJldHVybiB0aGUgdHVuZXIgaW50ZXJmYWNlCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIEhXIHdhcyBwb3dlcmVkIHVwIGFuZCBjb25maWd1cmF0aW9uIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgaXMgaW52YWxpZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfQ09ORklHIE1VU1QgYmUgY2FsbGVkIG9uY2UgdGhlCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZCBvciBhIGZhaWx1cmUgb2NjdXJzIG9yIGFmdGVyIGEgdGltZSBvdXQuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDbG9zZSBhIHR1bmVyIGludGVyZmFjZS4KLSAgICAgICAgICogSWYgdGhlIGxhc3QgdHVuZXIgaXMgY2xvc2VkLCB0aGUgcmFkaW8gbW9kdWxlIGlzIGRlYWN0aXZhdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gdHVuZXI6IHRoZSB0dW5lciBpbnRlcmZhY2UgdG8gY2xvc2UKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgcG93ZXJlZCBkb3duIHN1Y2Nlc3NmdWxseS4KLSAgICAgICAgICogIC1FSU5WQUwgaWYgYW4gaW52YWxpZCBhcmd1bWVudCBpcyBwYXNzZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgUmFkaW9JbnRlcmZhY2UoKSB7fQotICAgICAgICB2aXJ0dWFsICAgICB+UmFkaW9JbnRlcmZhY2UoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwZWU4My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxICAgIDg3NTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSAgICAxMDgwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTEgIDEwMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiAgICA4NzkwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIgICAgMTA3OTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyICAyMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOICAgIDc2MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4gICAgOTAwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOICAxMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQgICAgNjU4MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJUICAgIDc0MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTFcgICAgICAgICAxNTMKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9MVyAgICAgICAgIDI3OQotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTFcgICAgICAgOQotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSAgICA1MzEKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxICAgIDE2MTEKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTEgIDkKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIgICAgNTQwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiAgICAxNjEwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyICAxMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfU1cgICAgICAgICAyMzAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfU1cgICAgICAgICAyNjEwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfU1cgICAgICAgNQotCi0KLSNpZm5kZWYgQVJSQVlfU0laRQotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLSNlbmRpZgotCi1jb25zdCByYWRpb19iYW5kX2NvbmZpZ190IHNLbm93blJlZ2lvbkNvbmZpZ3NbXSA9IHsKLSAgICB7ICAgLy8gRk0gSVRVIDEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEFtZXJpY2FzCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBKYXBhbgotICAgICAgICBSQURJT19SRUdJT05fSkFQQU4sCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4sCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gS29yZWEKLSAgICAgICAgUkFESU9fUkVHSU9OX0tPUkVBLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIE9JUlQKLSAgICAgICAgUkFESU9fUkVHSU9OX09JUlQsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJULAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJULAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVH0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gVVMgSEQgcmFkaW8KLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0ZNX0hELAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19VUywKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBMVwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTFcsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0xXLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTFd9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gU1cKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX1NXLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9TVywKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX1NXfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTEKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIE1XIElUVTIKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX07Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI3YzA5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvUmVnaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lW10gPSAiUmFkaW8gdHVuZXIgc291cmNlIjsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IFJBRElPX1BFUk1JU1NJT04oImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRk1fUkFESU8iKTsKLQotUmFkaW9TZXJ2aWNlOjpSYWRpb1NlcnZpY2UoKQotICAgIDogQm5SYWRpb1NlcnZpY2UoKSwgbU5leHRVbmlxdWVJZCgxKQotewotICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgc3A8UmFkaW9JbnRlcmZhY2U+IGRldiA9IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKFJBRElPX0NMQVNTX0FNX0ZNKTsKLQotICAgIGlmIChkZXYgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0cnVjdCByYWRpb19oYWxfcHJvcGVydGllcyBoYWxQcm9wZXJ0aWVzOwotICAgIGludCByYyA9IGRldi0+Z2V0UHJvcGVydGllcygmaGFsUHJvcGVydGllcyk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJhZGlvX3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVzOwotICAgIHByb3BlcnRpZXMuaGFuZGxlID0KLSAgICAgICAgICAgIChyYWRpb19oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwotICAgIGNvbnZlcnRQcm9wZXJ0aWVzKCZwcm9wZXJ0aWVzLCAmaGFsUHJvcGVydGllcyk7Ci0KLSAgICBBTE9HSSgibG9hZGVkIGRlZmF1bHQgbW9kdWxlICVzLCB2ZXIgJXMsIGhhbmRsZSAlZCIsIHByb3BlcnRpZXMucHJvZHVjdCwKLSAgICAgICAgcHJvcGVydGllcy52ZXJzaW9uLCBwcm9wZXJ0aWVzLmhhbmRsZSk7Ci0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUoZGV2LCBwcm9wZXJ0aWVzKTsKLSAgICBtTW9kdWxlcy5hZGQocHJvcGVydGllcy5oYW5kbGUsIG1vZHVsZSk7Ci19Ci0KLVJhZGlvU2VydmljZTo6flJhZGlvU2VydmljZSgpCi17Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RNb2R1bGVzIik7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOwotICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgcHJvcGVydGllcyA9PSBOVUxMKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB1aW50MzJfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7Ci0gICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgewotICAgICAgICBwcm9wZXJ0aWVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+cHJvcGVydGllcygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEFMT0dWKCIlcyAlZCBjb25maWcgJXAgd2l0aEF1ZGlvICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUsIGNvbmZpZywgd2l0aEF1ZGlvKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgcmFkaW8uY2xlYXIoKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Nb2R1bGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgY29uZmlnID0gbW9kdWxlLT5nZXREZWZhdWx0Q29uZmlnKCk7Ci0gICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCIlcyByZWdpb24gJWQgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgY29uZmlnLT5yZWdpb24sIGNvbmZpZy0+YmFuZC50eXBlKTsKLQotICAgIHJhZGlvID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50LCBjb25maWcsIHdpdGhBdWRpbyk7Ci0KLSAgICBpZiAocmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOwotCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKLXsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFJhZGlvU2VydmljZSIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBSYWRpb1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiUmFkaW9TZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQotLyogc3RhdGljICovCi12b2lkIFJhZGlvU2VydmljZTo6Y29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpCi17Ci0gICAgbWVtc2V0KHByb3BlcnRpZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gaGFsUHJvcGVydGllcy0+Y2xhc3NfaWQ7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5wcm9kdWN0LCBoYWxQcm9wZXJ0aWVzLT5wcm9kdWN0LAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+dmVyc2lvbiwgaGFsUHJvcGVydGllcy0+dmVyc2lvbiwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHByb3BlcnRpZXMtPm51bV90dW5lcnMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fdHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXM7Ci0gICAgcHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZSA9IGhhbFByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc0tub3duUmVnaW9uQ29uZmlncyk7IGkrKykgewotICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqYmFuZCA9ICZzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQ7Ci0gICAgICAgIHNpemVfdCBqOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzOyBqKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpoYWxCYW5kID0gJmhhbFByb3BlcnRpZXMtPmJhbmRzW2pdOwotICAgICAgICAgICAgc2l6ZV90IGs7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSAhPSBoYWxCYW5kLT50eXBlKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT5sb3dlcl9saW1pdCA8IGhhbEJhbmQtPmxvd2VyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT51cHBlcl9saW1pdCA+IGhhbEJhbmQtPnVwcGVyX2xpbWl0KSBjb250aW51ZTsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoYWxCYW5kLT5udW1fc3BhY2luZ3M7IGsrKykgewotICAgICAgICAgICAgICAgIGlmIChiYW5kLT5zcGFjaW5nc1swXSA9PSBoYWxCYW5kLT5zcGFjaW5nc1trXSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoayA9PSBoYWxCYW5kLT5udW1fc3BhY2luZ3MpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgPT0gUkFESU9fQkFORF9BTSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLmRlZW1waGFzaXMgJiBoYWxCYW5kLT5mbS5kZWVtcGhhc2lzKSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChoYWxCYW5kLT5mbS5yZHMgPT0gMCkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKGJhbmQtPmZtLnJkcyAmIGhhbEJhbmQtPmZtLnJkcykgIT0gMCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPT0gaGFsUHJvcGVydGllcy0+bnVtX2JhbmRzKSBjb250aW51ZTsKLQotICAgICAgICBBTE9HSSgiY29udmVydFByb3BlcnRpZXMoKSBBZGRpbmcgYmFuZCB0eXBlICVkIHJlZ2lvbiAlZCIsCi0gICAgICAgICAgICAgIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZC50eXBlICwgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5yZWdpb24pOwotCi0gICAgICAgIG1lbWNweSgmcHJvcGVydGllcy0+YmFuZHNbcHJvcGVydGllcy0+bnVtX2JhbmRzKytdLAotICAgICAgICAgICAgICAgJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0sCi0gICAgICAgICAgICAgICBzaXplb2YocmFkaW9fYmFuZF9jb25maWdfdCkpOwotICAgIH0KLX0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZCIKLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6Q2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KQotICAgIDogbU1vZHVsZUNsaWVudChtb2R1bGVDbGllbnQpLCBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJSYWRpb1NlcnZpY2UiKSkKLXsKLX0KLQotUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKLXsKLSAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQotewotICAgIHJ1bigiUmFkaW9TZXJ2aWNlIGNiayIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKLX0KLQotYm9vbCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7Ci0gICAgICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV2ZW50TWVtb3J5ID0gbUV2ZW50UXVldWVbMF07Ci0gICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKLSAgICAgICAgICAgIG1vZHVsZUNsaWVudCA9IG1Nb2R1bGVDbGllbnQucHJvbW90ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2R1bGVDbGllbnQgIT0gMCkgewotICAgICAgICAgICAgbW9kdWxlQ2xpZW50LT5vbkNhbGxiYWNrRXZlbnQoZXZlbnRNZW1vcnkpOwotICAgICAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKLX0KLQotc3A8SU1lbW9yeT4gUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6cHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKLQotICAgIC8vIFRoZSBldmVudCBsYXlvdXQgaW4gc2hhcmVkIG1lbW9yeSBpczoKLSAgICAvLyBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSBieXRlcyA6IHRoZSBldmVudCBpdHNlbGYKLSAgICAvLyA0IGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIHNpemUgb3IgMAotICAgIC8vIE4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgaWYgcHJlc2VudAotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKGhhbEV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6Ci0gICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+bWV0YWRhdGEpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICAgICAgfQotICAgICAgICBtZXRhZGF0YVNpemUgPSAodWludDMyX3QpcmFkaW9fbWV0YWRhdGFfZ2V0X3NpemUoaGFsRXZlbnQtPm1ldGFkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShtZXRhZGF0YU9mZnNldCArIG1ldGFkYXRhU2l6ZSk7Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0KLSAgICAqKHVpbnQzMl90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpID0gbWV0YWRhdGFTaXplOwotCi0gICAgZXZlbnQtPnR5cGUgPSBoYWxFdmVudC0+dHlwZTsKLSAgICBldmVudC0+c3RhdHVzID0gaGFsRXZlbnQtPnN0YXR1czsKLQotICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKLSAgICAgICAgZXZlbnQtPmNvbmZpZy5iYW5kID0gaGFsRXZlbnQtPmNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgZXZlbnQtPmluZm8gPSBoYWxFdmVudC0+aW5mbzsKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0LCBoYWxFdmVudC0+aW5mby5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RBOgotICAgIGNhc2UgUkFESU9fRVZFTlRfRUE6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BTlRFTk5BOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQ09OVFJPTDoKLSAgICAgICAgZXZlbnQtPm9uID0gaGFsRXZlbnQtPm9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQsIGhhbEV2ZW50LT5tZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGV2ZW50TWVtb3J5OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpCi0gewotICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVFdmVudChldmVudCk7Ci0gICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICBBdXRvTXV0ZXggbG9jayhtQ2FsbGJhY2tMb2NrKTsKLSAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50TWVtb3J5KTsKLSAgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKLSAgICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotfQotCi0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlIgotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKHNwPFJhZGlvSW50ZXJmYWNlPiBod0RldmljZSwgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKQotIDogbUh3RGV2aWNlKGh3RGV2aWNlKSwgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1NdXRlKHRydWUpCi17Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlOjp+TW9kdWxlKCkgewotICAgIG1Id0RldmljZS5jbGVhcigpOwotICAgIG1Nb2R1bGVDbGllbnRzLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpkdW1wKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3A8UmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ+IFJhZGlvU2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQotewotICAgIEFMT0dWKCJhZGRDbGllbnQoKSAlcCBjb25maWcgJXAgcHJvZHVjdCAlcyIsIHRoaXMsIGNvbmZpZywgbVByb3BlcnRpZXMucHJvZHVjdCk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7Ci0gICAgaW50IHJldDsKLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5jbGllbnQoKSA9PSBjbGllbnQpIHsKLSAgICAgICAgICAgIC8vIGNsaWVudCBhbHJlYWR5IGNvbm5lY3RlZDogcmVqZWN0Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50LCBjb25maWcsIGF1ZGlvKTsKLQotICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKLQotICAgIC8vIFR1bmVyIHByZWVtcHRpb24gbG9naWM6Ci0gICAgLy8gVGhlcmUgaXMgYSBsaW1pdGVkIGFtb3VudCBvZiB0dW5lcnMgYW5kIGEgbGltaXRlZCBhbW91bnQgb2YgcmFkaW8gYXVkaW8gc291cmNlcyBwZXIgbW9kdWxlLgotICAgIC8vIFRoZSBtaW5pbXVtIGlzIG9uZSB0dW5lciBhbmQgb25lIGF1ZGlvIHNvdXJjZS4KLSAgICAvLyBUaGUgbnVtYmVycyBvZiB0dW5lcnMgYW5kIHNvdXJjZXMgYXJlIGluZGljYXRlZCBpbiB0aGUgbW9kdWxlIHByb3BlcnRpZXMuCi0gICAgLy8gTk9URTogY3VycmVudCBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBvbmUgcmFkaW8gYXVkaW8gc291cmNlLgotICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIG9wZW4gbW9yZSB0aGFuIG9uZSB0dW5lciBhdCBhIHRpbWUgYnV0IG9ubHkgb25lIHR1bmVyIGNhbiBiZSBjb25uZWN0ZWQKLSAgICAvLyB0byB0aGUgcmFkaW8gYXVkaW8gc291cmNlIChBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLgotICAgIC8vIFRoZSBiYXNlIHJ1bGUgaXMgdGhhdCBhIG5ld2x5IGNvbm5lY3RlZCB0dW5lciBhbHdheXMgd2lucywgaS5lLiBhbHdheXMgZ2V0cyBhIHR1bmVyCi0gICAgLy8gYW5kIGNhbiB1c2UgdGhlIGF1ZGlvIHNvdXJjZSBpZiByZXF1ZXN0ZWQuCi0gICAgLy8gSWYgYW5vdGhlciBjbGllbnQgaXMgcHJlZW1wdGVkLCBpdCBpcyBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGggUkFESU9fRVZFTlRfQ09OVFJPTAotICAgIC8vIGluZGljYXRpbmcgbG9zcyBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgcmVxdWVzdHMgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gdHJ1ZSk6Ci0gICAgLy8gICAgLSBpZiBhbiBhdWRpbyBzb3VyY2UgaXMgYXZhaWxhYmxlCi0gICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQotICAgIC8vICAgIC0gaWYgbm90OgotICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IGluIHRoZSBsaXN0IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KLSAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IGRvZXMgbm90IHJlcXVlc3QgdGhlIGF1ZGlvIHNvdXJjZSAoYXVkaW8gPT0gZmFsc2UpOgotICAgIC8vICAgIC0gaWYgYSB0dW5lciBpcyBhdmFpbGFibGUKLSAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCi0gICAgLy8gICAgLSBpZiBub3Q6Ci0gICAgLy8gICAgICAgICAgVGhlIG9sZGVzdCBjbGllbnQgbm90IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZCBmaXJzdCBhbmQgaWYgbm9uZSBpcyBmb3VuZCB0aGUKLSAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCi0gICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKLSAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KLQotICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0VHVuZXI7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RBdWRpbzsKLSAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKLSAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChvbGRlc3RUdW5lciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdFR1bmVyID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8VHVuZXJJbnRlcmZhY2U+IGhhbFR1bmVyOwotICAgIHNwPE1vZHVsZUNsaWVudD4gcHJlZW10ZWRDbGllbnQ7Ci0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA+PSBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcykgewotICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7Ci0gICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvICsgYWxsb2NhdGVkVHVuZXJzID49IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvY2F0ZWRUdW5lcnMgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdFR1bmVyICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRUdW5lcnMvb2xkZXN0VHVuZXIgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdFR1bmVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwcmVlbXRlZENsaWVudCAhPSAwKSB7Ci0gICAgICAgIGhhbFR1bmVyID0gcHJlZW10ZWRDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiBjbGVhcjsKLSAgICAgICAgcHJlZW10ZWRDbGllbnQtPnNldFR1bmVyKGNsZWFyKTsKLSAgICAgICAgbUh3RGV2aWNlLT5jbG9zZVR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHByZWVtdGVkQ2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgc2V0VHVuZXIgJXAiLCBoYWxUdW5lci5nZXQoKSk7Ci0gICAgICAgIG1vZHVsZUNsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOwotICAgICAgICBtTW9kdWxlQ2xpZW50cy5hZGQobW9kdWxlQ2xpZW50KTsKLSAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgRE9ORSBtb2R1bGVDbGllbnQgJXAiLCBtb2R1bGVDbGllbnQuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIlcyBvcGVuX3R1bmVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBtb2R1bGVDbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpyZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KSB7Ci0gICAgQUxPR1YoInJlbW92ZUNsaWVudCgpIik7Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGludCByZXQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IC0xOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0gPT0gbW9kdWxlQ2xpZW50KSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1Nb2R1bGVDbGllbnRzLnJlbW92ZUF0KGluZGV4KTsKLSAgICBzcDxUdW5lckludGVyZmFjZT4gaGFsVHVuZXIgPSBtb2R1bGVDbGllbnQtPmdldFR1bmVyKCk7Ci0gICAgaWYgKGhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgIT0gMCkgewotICAgICAgICBtSHdEZXZpY2UtPmNsb3NlVHVuZXIoaGFsVHVuZXIpOwotICAgIH0KLQotICAgIGlmIChtb2R1bGVDbGllbnQtPmF1ZGlvKCkpIHsKLSAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOwotICAgIH0KLQotICAgIG1NdXRlID0gdHJ1ZTsKLQotICAgIGlmIChtTW9kdWxlQ2xpZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSHdEZXZpY2UgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVHVuZXIgcmVhbGxvY2F0aW9uIGxvZ2ljOgotICAgIC8vIFdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCBhbmQgd2FzIGNvbnRyb2xsaW5nIGEgdHVuZXIsIHRoaXMgdHVuZXIgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gYQotICAgIC8vIHByZXZpb3VzbHkgcHJlZW1wdGVkIGNsaWVudC4gVGhpcyBjbGllbnQgd2lsbCBiZSBub3RpZmllZCBieSBhIGNhbGxiYWNrIHdpdGgKLSAgICAvLyBSQURJT19FVkVOVF9DT05UUk9MIGluZGljYXRpbmcgZ2FpbiBvZiBjb250cm9sLgotICAgIC8vIC0gSWYgYSBwcmVlbXB0ZWQgY2xpZW50IGlzIHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZSBhbmQgb25lIGJlY29tZXMgYXZhaWxhYmxlOgotICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlCi0gICAgLy8gLSBJZiBub3Q6Ci0gICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudC4KLSAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcwotICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgotCi0gICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudDsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50QXVkaW87Ci0gICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKLSAgICBmb3IgKHNzaXplX3QgaSA9IG1Nb2R1bGVDbGllbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnRBdWRpbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlvdW5nZXN0Q2xpZW50ID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HX0FTU0VSVChhbGxvY2F0ZWRUdW5lcnMgKyBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMsCi0gICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IGJ1dCBubyB0dW5lciBhdmFpbGFibGUiKTsKLQotICAgIEFMT0dfQVNTRVJUKCFtb2R1bGVDbGllbnQtPmF1ZGlvKCkgfHwgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcywKLSAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBhdWRpbyBjbGllbnQgYnV0IG5vIHR1bmVyIHdpdGggYXVkaW8gYXZhaWxhYmxlIik7Ci0KLSAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcyAmJiB5b3VuZ2VzdENsaWVudEF1ZGlvICE9IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQgPSB5b3VuZ2VzdENsaWVudEF1ZGlvOwotICAgIH0KLQotICAgIEFMT0dfQVNTRVJUKHlvdW5nZXN0Q2xpZW50ICE9IDAsICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBubyBjYW5kaWRhdGUgZm91bmQgZm9yIHR1bmVyIik7Ci0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZyA9IHlvdW5nZXN0Q2xpZW50LT5oYWxDb25maWcoKTsKLSAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5UdW5lcigmaGFsQ29uZmlnLCB5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lcik7Ci0KLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgeW91bmdlc3RDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG11dGUgIT0gbU11dGUpIHsKLSAgICAgICAgbU11dGUgPSBtdXRlOwotICAgICAgICAvL1RPRE8gbm90aWZpZnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2YgbWVkaWEgYWN0aXZpdHkgb24gcmFkaW8gYXVkaW8gZGV2aWNlCi0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICptdXRlID0gbU11dGU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLWNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmdldERlZmF1bHRDb25maWcoKSBjb25zdAotewotICAgIGlmIChtUHJvcGVydGllcy5udW1fYmFuZHMgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuICZtUHJvcGVydGllcy5iYW5kc1swXTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6bm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykgewotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkID8gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWUpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotfQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudCIKLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Ok1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCi0gOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KSwgbUNvbmZpZygqY29uZmlnKSwgbUF1ZGlvKGF1ZGlvKSwgbVR1bmVyKDApCi17Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRmlyc3RSZWYoKQotewotICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzKTsKLSAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+bGlua1RvRGVhdGgodGhpcyk7Ci19Ci0KLVJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp+TW9kdWxlQ2xpZW50KCkgewotICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOwotICAgIH0KLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoaGFsRXZlbnQpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZHVtcChpbnQgZmQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHN0cm9uZ01lID0gdGhpczsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtb2R1bGUtPnJlbW92ZUNsaWVudCh0aGlzKTsKLX0KLQotcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmhhbENvbmZpZygpIGNvbnN0Ci17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBtQ29uZmlnLmJhbmQ7Ci19Ci0KLXNwPFR1bmVySW50ZXJmYWNlPiYgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFR1bmVyKCkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIG1UdW5lcjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBBTE9HVigiJXMgJXAiLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1UdW5lciA9IHR1bmVyOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0NPTlRST0w7Ci0gICAgZXZlbnQuc3RhdHVzID0gMDsKLSAgICBldmVudC5vbiA9IG1UdW5lciAhPSAwOwotICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KCZldmVudCk7Ci0gICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOwotCi19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNldENvbmZpZ3VyYXRpb24oJmhhbENvbmZpZyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1Db25maWcgPSAqY29uZmlnOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOwotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRDb25maWd1cmF0aW9uKCZoYWxDb25maWcpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBoYWxDb25maWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmNvbmZpZyA9IG1Db25maWc7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobVR1bmVyID09IDAgfHwgIW1BdWRpbykgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwotICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotICAgIG1vZHVsZS0+c2V0TXV0ZShtdXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlLT5nZXRNdXRlKG11dGUpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dHVuZSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmNhbmNlbCgpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5jYW5jZWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKGluZm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgKmhhc0NvbnRyb2wgPSBtVHVuZXIgIT0gMDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCi17Ci0gICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJhZGlvX2V2ZW50X3QgKmV2ZW50ID0gKHJhZGlvX2V2ZW50X3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgotICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gZXZlbnQtPmNvbmZpZy5iYW5kOwotICAgICAgICAgICAgZXZlbnQtPmNvbmZpZy5yZWdpb24gPSBtQ29uZmlnLnJlZ2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQgPSBtQ2xpZW50OwotICAgIH0KLSAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgY2xpZW50LT5vbkV2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICB9Ci19Ci0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6YmluZGVyRGllZCgKLSAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7Ci0gICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgY2xpZW50ICVwIiwgdGhpcyk7Ci0gICAgZGV0YWNoKCk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRlYjdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLS8vI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5SGVhcEJhc2U7Ci0KLWNsYXNzIFJhZGlvU2VydmljZSA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5SYWRpb1NlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+OwotCi1wdWJsaWM6Ci0gICAgY2xhc3MgTW9kdWxlQ2xpZW50OwotICAgIGNsYXNzIE1vZHVsZTsKLQotICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yYWRpbyI7IH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlKCk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAvLyBJUmFkaW9TZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLQotICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLQotICAgICAgIE1vZHVsZShzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UsCi0gICAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0gICAgICAgdmlydHVhbCB+TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgICAgICAgICAgdm9pZCByZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOwotCi0gICAgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAgICBzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbVByb3BlcnRpZXM7IH0KLSAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmdldERlZmF1bHRDb25maWcoKSBjb25zdCA7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgdm9pZCBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLCBjb25zdCBjaGFyICphZGRyZXNzKTsKLQotICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgLy8gcHJvdGVjdHMgIG1Nb2R1bGVDbGllbnRzCi0gICAgICAgIHNwPFJhZGlvSW50ZXJmYWNlPiAgICAgICAgICAgIG1Id0RldmljZTsgICAgICAvLyBIQUwgaGFyZHdhcmUgZGV2aWNlCi0gICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIG1Qcm9wZXJ0aWVzOyAgICAvLyBjYWNoZWQgaGFyZHdhcmUgbW9kdWxlIHByb3BlcnRpZXMKLSAgICAgICAgVmVjdG9yPCBzcDxNb2R1bGVDbGllbnQ+ID4gICAgbU1vZHVsZUNsaWVudHM7IC8vIGxpc3Qgb2YgYXR0YWNoZWQgY2xpZW50cwotICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtTXV0ZTsgICAgICAgICAgLy8gcmFkaW8gYXVkaW8gc291cmNlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHVubXV0ZWQsIGF1ZGlvIGlzIHJvdXRlZCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIG1lZGlhIHVzZSBjYXNlLgotICAgIH07IC8vIGNsYXNzIE1vZHVsZQotCi0gICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKLQotICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja1RocmVhZCgpOwotCi0KLSAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgICAgICAgICAgICAgdm9pZCBleGl0KCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkIHNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgd3A8TW9kdWxlQ2xpZW50PiAgICAgIG1Nb2R1bGVDbGllbnQ7ICAgIC8vIGNsaWVudCBtb2R1bGUgdGhlIHRocmVhZCBiZWxvbmdzIHRvCi0gICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOyAgICAvLyBjb25kaXRpb24gc2lnbmFsZWQgd2hlbiBhIG5ldyBldmVudCBpcyBwb3N0ZWQKLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7ICAgIC8vIHByb3RlY3RzIG1FdmVudFF1ZXVlCi0gICAgICAgIFZlY3Rvcjwgc3A8SU1lbW9yeT4gPiBtRXZlbnRRdWV1ZTsgICAgICAvLyBwZW5kaW5nIGNhbGxiYWNrIGV2ZW50cwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgbU1lbW9yeURlYWxlcjsgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgY2FsbGJhY2sgZXZlbnQKLSAgICB9OyAvLyBjbGFzcyBDYWxsYmFja1RocmVhZAotCi0gICAgY2xhc3MgTW9kdWxlQ2xpZW50IDogcHVibGljIEJuUmFkaW8sCi0gICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICBNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKLQotICAgICAgIHZpcnR1YWwgfk1vZHVsZUNsaWVudCgpOwotCi0gICAgICAgLy8gSVJhZGlvCi0gICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnQ7IH0KLSAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQotICAgICAgICAgICAgICAgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgaGFsQ29uZmlnKCkgY29uc3Q7Ci0gICAgICAgICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gY2FsbGJhY2tUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2tUaHJlYWQ7IH0KLSAgICAgICAgICAgICAgIHZvaWQgc2V0VHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIGdldFR1bmVyKCk7Ci0gICAgICAgICAgICAgICBib29sIGF1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvOyB9Ci0KLSAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudCk7Ci0KLSAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0KLSAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgICAgIC8vIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UKLSAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50LCBtQ29uZmlnIGFuZCBtVHVuZXIKLSAgICAgICAgd3A8TW9kdWxlPiAgICAgICAgICAgICAgICAgIG1Nb2R1bGU7ICAgICAgICAgLy8gVGhlIG1vZHVsZSB0aGlzIGNsaWVudCBpcyBhdHRhY2hlZCB0bwotICAgICAgICBzcDxJUmFkaW9DbGllbnQ+ICAgICAgICAgICAgbUNsaWVudDsgICAgICAgICAvLyBldmVudCBjYWxsYmFjayBiaW5kZXIgaW50ZXJmYWNlCi0gICAgICAgIHJhZGlvX2JhbmRfY29uZmlnX3QgICAgICAgICBtQ29uZmlnOyAgICAgICAgIC8vIGN1cnJlbnQgYmFuZCBjb25maWd1cmF0aW9uCi0gICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQ7IC8vIGV2ZW50IGNhbGxiYWNrIHRocmVhZAotICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUF1ZGlvOwotICAgICAgICBzcDxUdW5lckludGVyZmFjZT4gICAgICAgICAgbVR1bmVyOyAgICAgICAgLy8gSEFMIHR1bmVyIGludGVyZmFjZS4gTlVMTCBpbmRpY2F0ZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xpZW50IGRvZXMgbm90IGhhdmUgY29udHJvbCBvbiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dW5lcgotICAgIH07IC8vIGNsYXNzIE1vZHVsZUNsaWVudAotCi0KLSAgICBzdGF0aWMgdm9pZCBjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSk7Ci0KLXByaXZhdGU6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXMocmFkaW9fcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKmhhbFByb3BlcnRpZXMpOwotICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOyAgIC8vIHByb3RlY3RzIG1Nb2R1bGVzCi0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gZm9yIG1vZHVsZSBJRCBhbGxvY2F0aW9uCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPCByYWRpb19oYW5kbGVfdCwgc3A8TW9kdWxlPiA+IG1Nb2R1bGVzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3M2NjZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgICAgICB+VHVuZXJDYWxsYmFja0ludGVyZmFjZSgpIHt9Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY1N2QzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHVuZXJJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IGN1cnJlbnQgcmFkaW8gYmFuZCBjb25maWd1cmF0aW9uIChiYW5kLCByYW5nZSwgY2hhbm5lbCBzcGFjaW5nIC4uLikuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBhcHBsaWVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGlzIGludmFsaWQKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX0NPTkZJRyBNVVNUIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgb3IgYSBmYWlsdXJlIG9jY3VycyBvciBhZnRlciBhIHRpbWUgb3V0LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHJhZGlvIGJhbmQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogd2hlcmUgdG8gcmV0dXJuIHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdmFsaWQgY29uZmlndXJhdGlvbiBpcyByZXR1cm5lZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHNjYW5uaW5nIHVwIHRvIG5leHQgdmFsaWQgc3RhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGRpcmVjdGlvbjogUkFESU9fRElSRUNUSU9OX1VQIG9yIFJBRElPX0RJUkVDVElPTl9ET1dOCi0gICAgICAgICAqIC0gc2tpcF9zdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IGlnbm9yZSBzdWIgY2hhbm5lbHMKLSAgICAgICAgICogIChlLmcgU1BTIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHNjYW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqICBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogIGxvY2tlZCBvbiBhIHN0YXRpb24gb3IgYWZ0ZXIgYSB0aW1lIG91dCBvciBmdWxsIGZyZXF1ZW5jeSBzY2FuIGlmCi0gICAgICAgICAqICBubyBzdGF0aW9uIGZvdW5kLiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZSBpZiBhIHZhbGlkIHN0YXRpb24KLSAgICAgICAgICogIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1vdmUgb25lIGNoYW5uZWwgc3BhY2luZyB1cCBvciBkb3duLgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gZGlyZWN0aW9uOiBSQURJT19ESVJFQ1RJT05fVVAgb3IgUkFESU9fRElSRUNUSU9OX0RPV04KLSAgICAgICAgICogLSBza2lwX3N1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogaWdub3JlIHN1YiBjaGFubmVscwotICAgICAgICAgKiAgKGUuZyBTUFMgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgc3RlcCBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqIHN0ZXAgY29tcGxldGVkIG9yIGFmdGVyIGEgdGltZSBvdXQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlCi0gICAgICAgICAqIGlmIGEgdmFsaWQgc3RhdGlvbiBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUdW5lIHRvIHNwZWNpZmllZCBmcmVxdWVuY3kuCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjaGFubmVsOiBjaGFubmVsIHRvIHR1bmUgdG8uIEEgZnJlcXVlbmN5IGluIGtIeiBmb3IgQU0vRk0vSEQgUmFkaW8gYmFuZHMuCi0gICAgICAgICAqIC0gc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiAoZS5nIFNQUyBudW1iZXIgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdHVuZSBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogdHVuZWQgb3IgYWZ0ZXIgYSB0aW1lIG91dC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUKLSAgICAgICAgICogaWYgYSB2YWxpZCBzdGF0aW9uIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2FuY2VsIGEgc2Nhbiwgc3RlcCBvciB0dW5lIG9wZXJhdGlvbi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgYSBzY2FuLCBzdGVwIG9yIHR1bmUgb3BlcmF0aW9uIGlzIHBlbmRpbmcKLSAgICAgICAgICogKGNhbGxiYWNrIG5vdCB5ZXQgc2VudCkuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHN1Y2Nlc3NmdWwKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgbm90IHNlbnQuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBjdXJyZW50IHN0YXRpb24gaW5mb3JtYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBpbmZvOiB3aGVyZSB0byByZXR1cm4gdGhlIHByb2dyYW0gaW5mby4KLSAgICAgICAgICogSWYgaW5mby0+bWV0YWRhdGEgaXMgTlVMTC4gbm8gbWV0YSBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAgICAgICogSWYgbWV0YSBkYXRhIG11c3QgYmUgcmV0dXJuZWQsIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvIG9yIGNsb25lZCB0bwotICAgICAgICAgKiBpbmZvLT5tZXRhZGF0YSwgbm90IHBhc3NlZCBmcm9tIGEgbmV3bHkgY3JlYXRlZCBtZXRhIGRhdGEgYnVmZmVyLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB0dW5lZCBhbmQgaW5mb3JtYXRpb24gYXZhaWxhYmxlCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICBUdW5lckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCAgICAgflR1bmVySW50ZXJmYWNlKCkge30KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAo=