ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGIyMDdhOTYuLmEzNjc5YjEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw2ICsyLDUgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzb3VuZHRyaWdnZXIiLAogXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDVlNGQ4MWQuLjc5M2NiZjQgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTc4LDYgKzc4LDkgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC9saWJidW5kbGV3cmFwcGVyLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYmF1ZGlvcHJlcHJvY2Vzc2luZy5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlibWVkaWFjb2RlY3NlcnZpY2Uuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay9saWJzdGFnZWZyaWdodF9zb2Z0XyopCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDA1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9PV05FUlMKQEAgLTAsMCArMSw0IEBACitlbGF1cmVudEBnb29nbGUuY29tCitldGFsdmFsYUBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcCBiL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcAppbmRleCA3ZTYyOTdjLi44NjIwZjM2IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKKysrIGIvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCkBAIC0xOTIsMTIgKzE5MiwxNCBAQAogICAgICAgICAgICAgdGltZXN0YW1wcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEucmVhZEludDY0KCZ0aW1lc3RhbXBzW2ldKTsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHQ7CisgICAgICAgICAgICAgICAgcmVzID0gZGF0YS5yZWFkSW50NjQoJnQpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXBbJWRdOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2hfYmFjayh0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKaW5kZXggYzk1NDI0MS4uNjZmYWY4ZiAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwCkBAIC0xNDYsMTIgKzE0NiwxNCBAQAogICAgICAgICAgICAgdGltZXN0YW1wcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEucmVhZEludDY0KCZ0aW1lc3RhbXBzW2ldKTsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHQ7CisgICAgICAgICAgICAgICAgcmVzID0gZGF0YS5yZWFkSW50NjQoJnQpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aW1lc3RhbXBbJWRdOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1c2hfYmFjayh0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhY2ZlZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjeWNoZW5AZ29vZ2xlLmNvbQorZXBlZXZAZ29vZ2xlLmNvbQorZXRhbHZhbGFAZ29vZ2xlLmNvbQorc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoreWluY2hpYXllaEBnb29nbGUuY29tCit6aGlqdW5oZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbAppbmRleCA4MzA4MDk1Li4yODI1MmMwIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTQyLDcgKzQyLDkgQEAKICAgICAgKiBSZXBlYXRpbmcgcmVxdWVzdCBlbmNvdW50ZXJlZCBhbiBlcnJvciBhbmQgd2FzIHN0b3BwZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbGFzdEZyYW1lTnVtYmVyIEZyYW1lIG51bWJlciBvZiB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgc3RyZWFtaW5nIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlcGVhdGluZ1JlcXVlc3RJZCB0aGUgSUQgb2YgdGhlIHJlcGVhdGluZyByZXF1ZXN0IGJlaW5nIHN0b3BwZWQKICAgICAgKi8KLSAgICBvbmV3YXkgdm9pZCBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbiBsb25nIGxhc3RGcmFtZU51bWJlcik7CisgICAgb25ld2F5IHZvaWQgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW4gbG9uZyBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IHJlcGVhdGluZ1JlcXVlc3RJZCk7CiAgICAgb25ld2F5IHZvaWQgb25SZXF1ZXN0UXVldWVFbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDIyOWIxNTkuLmFmOTc3YjggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTk0MSw3ICs5NDEsNiBAQAogICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOwogICAgICAgICAgICAgICAgICAgICAoKm9uRmFpbCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgZmFpbHVyZSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmYWlsdXJlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CkBAIC0xMzUzLDcgKzEzNTIsOCBAQAogfQogCiBiaW5kZXI6OlN0YXR1cwotQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLCBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTM2NCw3ICsxMzY0LDkgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CiAKICAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQ7Ci0gICAgZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKyAgICBpZiAoc3RvcHBlZFNlcXVlbmNlSWQgPT0gcmVwZWF0aW5nU2VxdWVuY2VJZCkgeworICAgICAgICBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworICAgIH0KIAogICAgIGRldi0+Y2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IGM1NjZjZDIuLjg1NWVmZTEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtNzUsNyArNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25QcmVwYXJlZChpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlcXVlc3RRdWV1ZUVtcHR5KCkgb3ZlcnJpZGU7Ci0gICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgb3ZlcnJpZGU7CiAgICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDk0NmUzYjguLjUxZDkyMTQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMjE3LDggKzIxNywxMCBAQAogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgeworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgewogICAgICAgICAodm9pZCkgbGFzdEZyYW1lTnVtYmVyOworICAgICAgICAodm9pZCkgc3RvcHBlZFNlcXVlbmNlSWQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbUxhc3RTdGF0dXMgPSBSRVBFQVRJTkdfUkVRVUVTVF9FUlJPUjsKICAgICAgICAgbVN0YXR1c2VzSGl0LnB1c2hfYmFjayhtTGFzdFN0YXR1cyk7CmRpZmYgLS1naXQgYS9jbWRzL09XTkVSUyBiL2NtZHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzJhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKaW5kZXggZGUwMTY3YS4uYmMzMmJiZSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgYm9vbCBnV2FudEZyYW1lVGltZSA9IGZhbHNlOyAgICAgLy8gZG8gd2Ugd2FudCB0aW1lcyBvbiBlYWNoIGZyYW1lPwogc3RhdGljIHVpbnQzMl90IGdWaWRlb1dpZHRoID0gMDsgICAgICAgIC8vIGRlZmF1bHQgd2lkdGgraGVpZ2h0CiBzdGF0aWMgdWludDMyX3QgZ1ZpZGVvSGVpZ2h0ID0gMDsKLXN0YXRpYyB1aW50MzJfdCBnQml0UmF0ZSA9IDQwMDAwMDA7ICAgICAvLyA0TWJwcworc3RhdGljIHVpbnQzMl90IGdCaXRSYXRlID0gMjAwMDAwMDA7ICAgICAvLyAyME1icHMKIHN0YXRpYyB1aW50MzJfdCBnVGltZUxpbWl0U2VjID0ga01heFRpbWVMaW1pdFNlYzsKIAogLy8gU2V0IGJ5IHNpZ25hbCBoYW5kbGVyIHRvIHN0b3AgcmVjb3JkaW5nLgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBkN2MyZTg3Li5kNzAyODJiIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtODcwLDcgKzg3MCw5IEBACiAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJtL09XTkVSUyBiL2RybS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4ODc1NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9PV05FUlMKQEAgLTAsMCArMSBAQAoranRpbmtlckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCmluZGV4IDY2ZjVmYzIuLmY5MDY1NjQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCkBAIC01LDM2ICs1LDMxIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhZHJtIiwKIAotICAgIGFpZGw6IHsKLSAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImFpZGwiXSwKLSAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmFpZGwiLAotCi0gICAgICAgICJDYXNJbXBsLmNwcCIsCi0gICAgICAgICJEZXNjcmFtYmxlckltcGwuY3BwIiwKICAgICAgICAgIkRybVBsdWdpblBhdGguY3BwIiwKICAgICAgICAgIkRybVNlc3Npb25NYW5hZ2VyLmNwcCIsCiAgICAgICAgICJJQ3J5cHRvLmNwcCIsCiAgICAgICAgICJJRHJtLmNwcCIsCiAgICAgICAgICJJRHJtQ2xpZW50LmNwcCIsCiAgICAgICAgICJJTWVkaWFEcm1TZXJ2aWNlLmNwcCIsCi0gICAgICAgICJNZWRpYUNhc0RlZnMuY3BwIiwKKyAgICAgICAgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIiwKICAgICAgICAgIlNoYXJlZExpYnJhcnkuY3BwIiwKICAgICAgICAgIkRybUhhbC5jcHAiLAogICAgICAgICAiQ3J5cHRvSGFsLmNwcCIsCisgICAgICAgICJwcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8iLAogICAgIF0sCiAKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzM2JiMC4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQ2FzSW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2FzSW1wbCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cnVjdCBDYXNJbXBsOjpQbHVnaW5Ib2xkZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgUGx1Z2luSG9sZGVyKENhc1BsdWdpbiAqcGx1Z2luKSA6IG1QbHVnaW4ocGx1Z2luKSB7fQotICAgIH5QbHVnaW5Ib2xkZXIoKSB7IGlmIChtUGx1Z2luICE9IE5VTEwpIGRlbGV0ZSBtUGx1Z2luOyB9Ci0gICAgQ2FzUGx1Z2luKiBnZXQoKSB7IHJldHVybiBtUGx1Z2luOyB9Ci0KLXByaXZhdGU6Ci0gICAgQ2FzUGx1Z2luICptUGx1Z2luOwotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBsdWdpbkhvbGRlcik7Ci19OwotCi1DYXNJbXBsOjpDYXNJbXBsKGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyKQotICAgIDogbVBsdWdpbkhvbGRlcihOVUxMKSwgbUxpc3RlbmVyKGxpc3RlbmVyKSB7Ci0gICAgQUxPR1YoIkNUT1IiKTsKLX0KLQotQ2FzSW1wbDo6fkNhc0ltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1IiKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLS8vc3RhdGljCi12b2lkIENhc0ltcGw6Ok9uRXZlbnQoCi0gICAgICAgIHZvaWQgKmFwcERhdGEsCi0gICAgICAgIGludDMyX3QgZXZlbnQsCi0gICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChhcHBEYXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgYXBwRGF0YSEiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDYXNJbXBsICpjYXNJbXBsID0gc3RhdGljX2Nhc3Q8Q2FzSW1wbCAqPihhcHBEYXRhKTsKLSAgICBjYXNJbXBsLT5vbkV2ZW50KGV2ZW50LCBhcmcsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIENhc0ltcGw6OmluaXQoY29uc3Qgc3A8U2hhcmVkTGlicmFyeT4mIGxpYnJhcnksIENhc1BsdWdpbiAqcGx1Z2luKSB7Ci0gICAgbUxpYnJhcnkgPSBsaWJyYXJ5OwotICAgIG1QbHVnaW5Ib2xkZXIgPSBuZXcgUGx1Z2luSG9sZGVyKHBsdWdpbik7Ci19Ci0KLXZvaWQgQ2FzSW1wbDo6b25FdmVudCgKLSAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1MaXN0ZW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gZXZlbnREYXRhOwotICAgIGlmIChkYXRhICE9IE5VTEwgJiYgc2l6ZSA+IDApIHsKLSAgICAgICAgZXZlbnREYXRhLnJlc2V0KG5ldyBDYXNEYXRhKGRhdGEsIGRhdGEgKyBzaXplKSk7Ci0gICAgfQotCi0gICAgbUxpc3RlbmVyLT5vbkV2ZW50KGV2ZW50LCBhcmcsIGV2ZW50RGF0YSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZXRQcml2YXRlRGF0YShjb25zdCBDYXNEYXRhJiBwdnREYXRhKSB7Ci0gICAgQUxPR1YoInNldFByaXZhdGVEYXRhIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5zZXRQcml2YXRlRGF0YShwdnREYXRhKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpvcGVuU2Vzc2lvbihDYXNTZXNzaW9uSWQqIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJvcGVuU2Vzc2lvbiIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IGhvbGRlci0+Z2V0KCktPm9wZW5TZXNzaW9uKHNlc3Npb25JZCk7Ci0KLSAgICBBTE9HVigib3BlblNlc3Npb246IHNlc3Npb24gb3BlbmVkLCBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoKnNlc3Npb25JZCkuc3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhlcnIpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6c2V0U2Vzc2lvblByaXZhdGVEYXRhKAotICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgewotICAgIEFMT0dWKCJzZXRTZXNzaW9uUHJpdmF0ZURhdGE6IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIHB2dERhdGEpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OmNsb3NlU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIEFMT0dWKCJjbG9zZVNlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb2Nlc3NFY20oY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlY20pIHsKLSAgICBBTE9HVigicHJvY2Vzc0VjbTogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5wcm9jZXNzRWNtKHNlc3Npb25JZCwgZWNtKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpwcm9jZXNzRW1tKGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlbW0pIHsKLSAgICBBTE9HVigicHJvY2Vzc0VtbSIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhob2xkZXItPmdldCgpLT5wcm9jZXNzRW1tKGVtbSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6c2VuZEV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJmV2ZW50RGF0YSkgewotICAgIEFMT0dWKCJzZW5kRXZlbnQiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoZXZlbnREYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgZXJyID0gaG9sZGVyLT5nZXQoKS0+c2VuZEV2ZW50KGV2ZW50LCBhcmcsIENhc0RhdGEoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gaG9sZGVyLT5nZXQoKS0+c2VuZEV2ZW50KGV2ZW50LCBhcmcsICpldmVudERhdGEpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpwcm92aXNpb24oY29uc3QgU3RyaW5nMTYmIHByb3Zpc2lvblN0cmluZykgewotICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIFN0cmluZzgocHJvdmlzaW9uU3RyaW5nKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb3Zpc2lvbihTdHJpbmc4KHByb3Zpc2lvblN0cmluZykpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnJlZnJlc2hFbnRpdGxlbWVudHMoCi0gICAgICAgIGludDMyX3QgcmVmcmVzaFR5cGUsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZyZWZyZXNoRGF0YSkgewotICAgIEFMT0dWKCJyZWZyZXNoRW50aXRsZW1lbnRzIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKHJlZnJlc2hEYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgZXJyID0gaG9sZGVyLT5nZXQoKS0+cmVmcmVzaEVudGl0bGVtZW50cyhyZWZyZXNoVHlwZSwgQ2FzRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5yZWZyZXNoRW50aXRsZW1lbnRzKHJlZnJlc2hUeXBlLCAqcmVmcmVzaERhdGEpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpyZWxlYXNlKCkgewotICAgIEFMT0dWKCJyZWxlYXNlOiBwbHVnaW49JXAiLAotICAgICAgICAgICAgbVBsdWdpbkhvbGRlciA9PSBOVUxMID8gbVBsdWdpbkhvbGRlci0+Z2V0KCkgOiBOVUxMKTsKLSAgICBtUGx1Z2luSG9sZGVyLmNsZWFyKCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRGVzY3JhbWJsZXJJbXBsLmNwcCBiL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY0NjY5Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkRlc2NyYW1ibGVySW1wbCIKLQotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Rlc2NyYW1ibGVySW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6RGVzY3JhbWJsZXJJbXBsKAotICAgICAgICBjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbikgOgotICAgICAgICBtTGlicmFyeShsaWJyYXJ5KSwgbVBsdWdpbihwbHVnaW4pIHsKLSAgICBBTE9HVigiQ1RPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotfQotCi1EZXNjcmFtYmxlckltcGw6On5EZXNjcmFtYmxlckltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1I6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnNldE1lZGlhQ2FzU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhc1Nlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMobVBsdWdpbi0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIHsKLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZzgobWltZSkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhPSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB2YWxpZGF0ZVJhbmdlRm9yU2l6ZSgKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBsZW5ndGgsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gaXNJblJhbmdlPHVpbnQ2NF90LCB1aW50NjRfdD4oMCwgc2l6ZSwgb2Zmc2V0LCBsZW5ndGgpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpkZXNjcmFtYmxlKAotICAgICAgICBjb25zdCBEZXNjcmFtYmxlSW5mbyYgaW5mbywgaW50MzJfdCAqcmVzdWx0KSB7Ci0gICAgQUxPR1YoImRlc2NyYW1ibGUiKTsKLQotICAgIGlmIChpbmZvLnNyY01lbSA9PSBOVUxMIHx8IGluZm8uc3JjTWVtLT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic3JjTWVtIGlzIGludmFsaWQiKTsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhCQURfVkFMVUUpOwotICAgIH0KLQotICAgIC8vIHVzZSA2NC1iaXQgaGVyZSB0byBjYXRjaCBiYWQgc3Vic2FtcGxlIHNpemUgdGhhdCBtaWdodCBiZSBvdmVyZmxvd2luZy4KLSAgICB1aW50NjRfdCB0b3RhbEJ5dGVzSW5TdWJTYW1wbGVzID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm8ubnVtU3ViU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIHRvdGFsQnl0ZXNJblN1YlNhbXBsZXMgKz0gKHVpbnQ2NF90KWluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSArCi0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKLSAgICB9Ci0gICAgLy8gdmFsaWRhdGUgaWYgdGhlIHNwZWNpZmllZCBzcmNPZmZzZXQgYW5kIHJlcXVlc3RlZCB0b3RhbCBzdWJzYW1wbGUgc2l6ZQotICAgIC8vIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc291cmNlIHNoYXJlZCBidWZmZXIgc2l6ZS4KLSAgICBpZiAoIXZhbGlkYXRlUmFuZ2VGb3JTaXplKGluZm8uc3JjT2Zmc2V0LCB0b3RhbEJ5dGVzSW5TdWJTYW1wbGVzLCBpbmZvLnNyY01lbS0+c2l6ZSgpKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBzcmNPZmZzZXQgYW5kIHN1YnNhbXBsZSBzaXplOiAiCi0gICAgICAgICAgICAgICAgInNyY09mZnNldCAlbGx1LCB0b3RhbEJ5dGVzSW5TdWJTYW1wbGVzICVsbHUsIHNyY01lbSBzaXplICVsbHUiLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGluZm8uc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvdGFsQnl0ZXNJblN1YlNhbXBsZXMsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5mby5zcmNNZW0tPnNpemUoKSk7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjc5NjIyMzIiKTsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhCQURfVkFMVUUpOwotICAgIH0KLSAgICB2b2lkICpkc3RQdHIgPSBOVUxMOwotICAgIGlmIChpbmZvLmRzdFR5cGUgPT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIpIHsKLSAgICAgICAgLy8gV2hlbiB1c2luZyBzaGFyZWQgbWVtb3J5LCBzcmMgYnVmZmVyIGlzIGFsc28gdXNlZCBhcyBkc3QKLSAgICAgICAgZHN0UHRyID0gaW5mby5zcmNNZW0tPnBvaW50ZXIoKTsKLQotICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIGRzdCBhbmQgc3JjIHdvdWxkIGJlIHRoZSBzYW1lIGJ1ZmZlciwgbmVlZCB0byB2YWxpZGF0ZQotICAgICAgICAvLyBkc3RPZmZzZXQgYWdhaW5zdCB0aGUgYnVmZmVyIHNpemUgdG9vLgotICAgICAgICBpZiAoIXZhbGlkYXRlUmFuZ2VGb3JTaXplKGluZm8uZHN0T2Zmc2V0LCB0b3RhbEJ5dGVzSW5TdWJTYW1wbGVzLCBpbmZvLnNyY01lbS0+c2l6ZSgpKSkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZHN0T2Zmc2V0IGFuZCBzdWJzYW1wbGUgc2l6ZTogIgotICAgICAgICAgICAgICAgICAgICAiZHN0T2Zmc2V0ICVsbHUsIHRvdGFsQnl0ZXNJblN1YlNhbXBsZXMgJWxsdSwgc3JjQnVmZmVyIHNpemUgJWxsdSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGluZm8uZHN0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0b3RhbEJ5dGVzSW5TdWJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBpbmZvLnNyY01lbS0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjc5NjIyMzIiKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoQkFEX1ZBTFVFKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdFB0ciA9IGluZm8uZHN0UHRyOwotICAgIH0KLQotICAgICpyZXN1bHQgPSBtUGx1Z2luLT5kZXNjcmFtYmxlKAotICAgICAgICAgICAgaW5mby5kc3RUeXBlICE9IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyLAotICAgICAgICAgICAgaW5mby5zY3JhbWJsaW5nQ29udHJvbCwKLSAgICAgICAgICAgIGluZm8ubnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlcywKLSAgICAgICAgICAgIGluZm8uc3JjTWVtLT5wb2ludGVyKCksCi0gICAgICAgICAgICBpbmZvLnNyY09mZnNldCwKLSAgICAgICAgICAgIGRzdFB0ciwKLSAgICAgICAgICAgIGluZm8uZHN0T2Zmc2V0LAotICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKCpyZXN1bHQgPj0gMCA/IE9LIDogKnJlc3VsdCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoInJlbGVhc2U6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLQotICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1QbHVnaW47Ci0gICAgICAgIG1QbHVnaW4gPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKaW5kZXggMDc0NDg5YS4uYmMzNzU1NyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9Ecm1IYWwuaD4KICNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CkBAIC0xOTQsNyArMTk1LDE4IEBACiAgICAgIG1Jbml0Q2hlY2soKG1GYWN0b3JpZXMuc2l6ZSgpID09IDApID8gRVJST1JfVU5TVVBQT1JURUQgOiBOT19JTklUKSB7CiB9CiAKK3ZvaWQgRHJtSGFsOjpjbG9zZU9wZW5TZXNzaW9ucygpIHsKKyAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHRvSGlkbFZlYyhtT3BlblNlc3Npb25zW2ldKSk7CisgICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihtT3BlblNlc3Npb25zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3BlblNlc3Npb25zLmNsZWFyKCk7Cit9CisKIERybUhhbDo6fkRybUhhbCgpIHsKKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVEcm0obURybVNlc3Npb25DbGllbnQpOwogfQogCkBAIC00MTMsMTEgKzQyNSwxMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KIAorICAgIGNsb3NlT3BlblNlc3Npb25zKCk7CisgICAgcmVwb3J0TWV0cmljcygpOwogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogCkBAIC00NzEsNiArNDg0LDcgQEAKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKGdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBtRHJtU2Vzc2lvbkNsaWVudCwgc2Vzc2lvbklkKTsKKyAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXNoKHNlc3Npb25JZCk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC00ODYsNyArNTAwLDE0IEBACiAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3BlblNlc3Npb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PcGVuU2Vzc2lvbnNbaV0gPT0gc2Vzc2lvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXBvcnRNZXRyaWNzKCk7CiAgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwpAQCAtNzQwLDYgKzc2MSwxMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwobmFtZSwgdmFsdWUpOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CkBAIC03NjEsNiArNzg4LDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdCB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgY2xhc3MgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZQorICAgIC8vIG1Mb2NrIGlzIGFscmVhZHkgaGVsZC4KIAogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwpAQCAtOTc1LDcgKzEwMDgsNyBAQAogdm9pZCBEcm1IYWw6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyBfX3VudXNlZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKIApAQCAtOTk3LDQgKzEwMzAsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRHJtSGFsOjpyZXBvcnRNZXRyaWNzKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljczsKKyAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICBTdHJpbmc4IGRlc2NyaXB0aW9uOworICAgIGlmIChnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpID09IE9LICYmCisgICAgICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKSA9PSBPSyAmJgorICAgICAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3MpID09IE9LKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGFuZHJvaWQ6OnJlcG9ydERybVBsdWdpbk1ldHJpY3MoCisgICAgICAgICAgICAgICAgbWV0cmljcywgdmVuZG9yLCBkZXNjcmlwdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWNzIHdlcmUgcmV0cmlldmVkIGJ1dCBjb3VsZCBub3QgYmUgcmVwb3J0ZWQ6ICVpIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9NZWRpYUNhc0RlZnMuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmJhMzguLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ2FzIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDYXNEZWZzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+cmVhZEJ5dGVWZWN0b3IodGhpcyk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbGFibGVDYXNEYXRhOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCAgewotICAgIHJldHVybiBwYXJjZWwtPndyaXRlQnl0ZVZlY3RvcigqdGhpcyk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogLypwYXJjZWwqLykgewotICAgIEFMT0dFKCJDQVBsdWdpbkRlc2NyaXB0b3I6OnJlYWRGcm9tUGFyY2VsKCkgc2hvdWxkbid0IGJlIGNhbGxlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUNBU3lzdGVtSWQpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtTmFtZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhQ2FzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLW5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyIHsKLQotRGVzY3JhbWJsZUluZm86OkRlc2NyYW1ibGVJbmZvKCkge30KLQotRGVzY3JhbWJsZUluZm86On5EZXNjcmFtYmxlSW5mbygpIHt9Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90KikmZHN0VHlwZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAoZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlCi0gICAgICAgICAgICAmJiBkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigoaW50MzJfdCopJnNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCh1aW50MzJfdCopJm51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgaWYgKG51bVN1YlNhbXBsZXMgPiAweGZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzdWJTYW1wbGVzID0gbmV3IERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGVbbnVtU3ViU2FtcGxlc107Ci0gICAgaWYgKHN1YlNhbXBsZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+cmVhZFVpbnQzMigmc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcmNNZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgaWYgKHNyY01lbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmF0aXZlSGFuZGxlID0gTlVMTDsKLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIG5hdGl2ZUhhbmRsZSA9IHBhcmNlbC0+cmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICBkc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KG5hdGl2ZUhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0UHRyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmZHN0T2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXNjcmFtYmxlSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdClkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNjcmFtYmxpbmdDb250cm9sKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihudW1TdWJTYW1wbGVzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT53cml0ZVVpbnQzMihzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc3JjTWVtKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihzcmNPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZHN0VHlwZSA9PSBrRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVOYXRpdmVIYW5kbGUoc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KGRzdFB0cikpOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIKLQotfSAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmY1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKworI2luY2x1ZGUgInByb3Rvcy9wbHVnaW5fbWV0cmljcy5wYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXA7Cit1c2luZyBhbmRyb2lkOjpkcm1fbWV0cmljczo6TWV0cmljc0dyb3VwX01ldHJpYzsKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlOworCitjb25zdCBjaGFyKiBjb25zdCBrUGFyZW50QXR0cmlidXRlID0gIi9wYXJlbnQvZXh0ZXJuYWwiOworCitzdGF0dXNfdCByZXBvcnRNZXRyaWNzR3JvdXAoY29uc3QgTWV0cmljc0dyb3VwJiBtZXRyaWNzR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYmF0Y2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIHBhcmVudElkKSB7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0oYmF0Y2hOYW1lLmNfc3RyKCkpOworICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpbnQ2NF90IHNlc3Npb25JZCA9IGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCk7CisgICAgaWYgKHBhcmVudElkICE9IE5VTEwpIHsKKyAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChrUGFyZW50QXR0cmlidXRlLCAqcGFyZW50SWQpOworICAgIH0KKworICAgIC8vIFJlcG9ydCB0aGUgcGFja2FnZSBuYW1lLgorICAgIGlmIChtZXRyaWNzR3JvdXAuaGFzX2FwcF9wYWNrYWdlX25hbWUoKSkgeworICAgICAgQVN0cmluZyBhcHBfcGFja2FnZV9uYW1lKG1ldHJpY3NHcm91cC5hcHBfcGFja2FnZV9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzR3JvdXAuYXBwX3BhY2thZ2VfbmFtZSgpLnNpemUoKSk7CisgICAgICBhbmFseXRpY3NJdGVtLnNldFBrZ05hbWUoYXBwX3BhY2thZ2VfbmFtZSk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRyaWNzR3JvdXAubWV0cmljX3NpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cF9NZXRyaWMmIG1ldHJpYyA9IG1ldHJpY3NHcm91cC5tZXRyaWMoaSk7CisgICAgICAgIGlmICghbWV0cmljLmhhc19uYW1lKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWMgd2l0aCBubyBuYW1lLiIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbWV0cmljLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljIHdpdGggbm8gdmFsdWUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwX01ldHJpY19NZXRyaWNWYWx1ZSYgdmFsdWUgPSBtZXRyaWMudmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlLmhhc19pbnRfdmFsdWUoKSkgeworICAgICAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChtZXRyaWMubmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmludF92YWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5oYXNfZG91YmxlX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0RG91YmxlKG1ldHJpYy5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmRvdWJsZV92YWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0Q1N0cmluZyhtZXRyaWMubmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3RyaW5nX3ZhbHVlKCkuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0cmljIFZhbHVlIHdpdGggbm8gYWN0dWFsIHZhbHVlLiIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFuYWx5dGljc0l0ZW0uc2V0RmluYWxpemVkKHRydWUpOworICAgIGlmICghYW5hbHl0aWNzSXRlbS5zZWxmcmVjb3JkKCkpIHsKKyAgICAgIC8vIE5vdGUgdGhlIGNhc3QgdG8gaW50IGlzIGJlY2F1c2Ugd2UgYnVpbGQgb24gMzIgYW5kIDY0IGJpdC4KKyAgICAgIC8vIFRoZSBjYXN0IHByZXZlbnRzIGEgcGVjdWxpYXIgcHJpbnRmIHByb2JsZW0gd2hlcmUgb25lIGZvcm1hdCBjYW5ub3QKKyAgICAgIC8vIHNhdGlzZnkgYm90aC4KKyAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICVkIiwgKGludCkgc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldHJpY3NHcm91cC5tZXRyaWNfc3ViX2dyb3VwX3NpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cCYgc3ViR3JvdXAgPSBtZXRyaWNzR3JvdXAubWV0cmljX3N1Yl9ncm91cChpKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcmVwb3J0TWV0cmljc0dyb3VwKHN1Ykdyb3VwLCBiYXRjaE5hbWUsICZzZXNzaW9uSWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitTdHJpbmc4IHNhbml0aXplKGNvbnN0IFN0cmluZzgmIGlucHV0KSB7CisgICAgLy8gRmlsdGVycyB0aGUgaW5wdXQgc3RyaW5nIGRvd24gdG8ganVzdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKyAgICBTdHJpbmc4IG91dHB1dDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGNoYXIgY2FuZGlkYXRlID0gaW5wdXRbaV07CisgICAgICAgIGlmICgoY2FuZGlkYXRlID49ICdhJyAmJiBjYW5kaWRhdGUgPD0gJ3onKSB8fAorICAgICAgICAgICAgICAgIChjYW5kaWRhdGUgPj0gJ0EnICYmIGNhbmRpZGF0ZSA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZSA+PSAnMCcgJiYgY2FuZGlkYXRlIDw9ICc5JykpIHsKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoJmNhbmRpZGF0ZSwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IHJlcG9ydERybVBsdWdpbk1ldHJpY3MoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXJpYWxpemVkTWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgdmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbikgeworICAgIE1ldHJpY3NHcm91cCByb290X21ldHJpY3NfZ3JvdXA7CisgICAgaWYgKCFyb290X21ldHJpY3NfZ3JvdXAuUGFyc2VGcm9tQXJyYXkoc2VyaWFsaXplZE1ldHJpY3MuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsdXJlIHRvIHBhcnNlLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFN0cmluZzggbmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiZHJtLnZlbmRvci4lcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplKHZlbmRvcikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUoZGVzY3JpcHRpb24pLmNfc3RyKCkpOworCisgICAgcmV0dXJuIHJlcG9ydE1ldHJpY3NHcm91cChyb290X21ldHJpY3NfZ3JvdXAsIG5hbWUsIE5VTEwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwgYi9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0NjU5My4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJQ2FzIHsKLSAgICB2b2lkIHNldFByaXZhdGVEYXRhKGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICBieXRlW10gb3BlblNlc3Npb24oKTsKLSAgICB2b2lkIGNsb3NlU2Vzc2lvbihpbiBieXRlW10gc2Vzc2lvbklkKTsKLSAgICB2b2lkIHNldFNlc3Npb25Qcml2YXRlRGF0YShpbiBieXRlW10gc2Vzc2lvbklkLCBpbiBieXRlW10gcHZ0RGF0YSk7Ci0gICAgdm9pZCBwcm9jZXNzRWNtKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNEYXRhIGVjbSk7Ci0gICAgdm9pZCBwcm9jZXNzRW1tKGluIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNEYXRhIGVtbSk7Ci0gICAgdm9pZCBzZW5kRXZlbnQoaW50IGV2ZW50LCBpbnQgYXJnLCBpbiBAbnVsbGFibGUgYnl0ZVtdIGV2ZW50RGF0YSk7Ci0gICAgdm9pZCBwcm92aXNpb24oU3RyaW5nIHByb3Zpc2lvblN0cmluZyk7Ci0gICAgdm9pZCByZWZyZXNoRW50aXRsZW1lbnRzKGludCByZWZyZXNoVHlwZSwgaW4gQG51bGxhYmxlIGJ5dGVbXSByZWZyZXNoRGF0YSk7Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTVhYmMuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXNMaXN0ZW5lciB7Ci0gICAgdm9pZCBvbkV2ZW50KGludCBldmVudCwgaW50IGFyZywgaW4gQG51bGxhYmxlIGJ5dGVbXSBkYXRhKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUNhc1NlcnZpY2UuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY2ODI1Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuSURlc2NyYW1ibGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLklDYXNMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJTWVkaWFDYXNTZXJ2aWNlIHsKLSAgICBNZWRpYUNhcy5QYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcltdIGVudW1lcmF0ZVBsdWdpbnMoKTsKLSAgICBib29sZWFuIGlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSUNhcyBjcmVhdGVQbHVnaW4oaW50IENBX3N5c3RlbV9pZCwgSUNhc0xpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBib29sZWFuIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSURlc2NyYW1ibGVyIGNyZWF0ZURlc2NyYW1ibGVyKGludCBDQV9zeXN0ZW1faWQpOwotfQotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwgYi9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQwYzYuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNEYXRhIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNiY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90bwpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5kcm1fbWV0cmljczsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworLy8gVGhlIE1ldHJpY3NHcm91cCBpcyBhIGNvbGxlY3Rpb24gb2YgbWV0cmljIG5hbWUvdmFsdWUgcGFpciBpbnN0YW5jZXMKKy8vIHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIHByb3ZpZGVkIHRvIGEgY2FsbGVyLgorbWVzc2FnZSBNZXRyaWNzR3JvdXAgeworICBtZXNzYWdlIE1ldHJpYyB7CisgICAgbWVzc2FnZSBNZXRyaWNWYWx1ZSB7CisgICAgICAvLyBFeGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IGJlIHNldC4KKyAgICAgIG9wdGlvbmFsIGludDY0IGludF92YWx1ZSA9IDE7CisgICAgICBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gMjsKKyAgICAgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfdmFsdWUgPSAzOworICAgIH0KKworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBtZXRyaWMuIE11c3QgYmUgdmFsaWQgVVRGLTguIFJlcXVpcmVkLgorICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgbWV0cmljLiBSZXF1aXJlZC4KKyAgICBvcHRpb25hbCBNZXRyaWNWYWx1ZSB2YWx1ZSA9IDI7CisgIH0KKworICAvLyBUaGUgbGlzdCBvZiBuYW1lL3ZhbHVlIHBhaXJzIG9mIG1ldHJpY3MuCisgIHJlcGVhdGVkIE1ldHJpYyBtZXRyaWMgPSAxOworCisgIC8vIEFsbG93IG11bHRpcGxlIHN1YiBncm91cHMgb2YgbWV0cmljcy4KKyAgcmVwZWF0ZWQgTWV0cmljc0dyb3VwIG1ldHJpY19zdWJfZ3JvdXAgPSAyOworCisgIC8vIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRyaWNzLgorICBvcHRpb25hbCBzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZSA9IDM7Cit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawppbmRleCA4ZmQ4NjZjLi40YjEzOWE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKQEAgLTI4LDggKzI4LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGxpYmNsZWFya2V5Y2FzcGx1Z2luCiAKLSNUT0RPOiBtb3ZlIHRoaXMgYmFjayB0byAvdmVuZG9yL2xpYiBhZnRlciBjb252ZXJzaW9uIHRvIHRyZWJsZQotI0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gbWVkaWFjYXMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCkBAIC0zOSw2ICszOCw5IEBACiAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCiAgICAgbGlicHJvdG9idWYtY3BwLWxpdGUgXAogCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBtZWRpYV9wbHVnaW5faGVhZGVycworCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJqc21uIFwKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCmluZGV4IDc1NzIxOTQuLjUwYWNjMWQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JZCk7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1LZXlGZXRjaGVyTG9jayk7CkBAIC0yOTMsNyArMjkzLDcgQEAKIHN0YXR1c190IENsZWFyS2V5Q2FzU2Vzc2lvbjo6dXBkYXRlRUNNKAogICAgICAgICBLZXlGZXRjaGVyICprZXlGZXRjaGVyLCB2b2lkICplY20sIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKGtleUZldGNoZXIgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT1RfUFJPVklTSU9ORUQ7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPCBrRWNtSGVhZGVyTGVuZ3RoKSB7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIGNvbnN0IERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCiAgICAgICAgIGNvbnN0IHZvaWQgKnNyY1B0ciwgdm9pZCAqZHN0UHRyLCBBU3RyaW5nICogLyogZXJyb3JEZXRhaWxNc2cgKi8pIHsKICAgICBpZiAoc2VjdXJlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19DQU5OT1RfSEFORExFOwogICAgIH0KIAogICAgIEFFU19LRVkgY29udGVudEtleTsKQEAgLTM1Niw3ICszNTYsNyBAQAogICAgICAgICBpbnQzMl90IGtleUluZGV4ID0gKHNjcmFtYmxpbmdDb250cm9sICYgMSk7CiAgICAgICAgIGlmICghbUtleUluZm9ba2V5SW5kZXhdLnZhbGlkKSB7CiAgICAgICAgICAgICBBTE9HRSgiZGVjcnlwdDoga2V5ICVkIGlzIGludmFsaWQiLCBrZXlJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0RFQ1JZUFQ7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFQ7CiAgICAgICAgIH0KICAgICAgICAgY29udGVudEtleSA9IG1LZXlJbmZvW2tleUluZGV4XS5jb250ZW50S2V5OwogICAgIH0KQEAgLTQyMCw3ICs0MjAsNyBAQAogCiAgICAgaWYgKHNlc3Npb24uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQ2xlYXJLZXlEZXNjcmFtYmxlclBsdWdpbjogc2Vzc2lvbiBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIHN0ZDo6YXRvbWljX3N0b3JlKCZtQ0FTU2Vzc2lvbiwgc2Vzc2lvbik7CkBAIC00NDgsNyArNDQ4LDcgQEAKIAogICAgIGlmIChzZXNzaW9uLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIlVuaW5pdGlhbGl6ZWQgQ0FTIHNlc3Npb24hIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOwogICAgIH0KIAogICAgIHJldHVybiBzZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li5lMTU0NWFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCiAKIExPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQogIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCiAjIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCiBMT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKKyAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYTk3ZmFjNi4uYTFkNjFkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAKaW5kZXggZWQwNTBmNy4uMDI1OWE0MiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCkBAIC0yMSwxMiArMjEsMTkgQEAKIG5hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKIGJvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgewotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDb21tb25Qc3NoQm94VVVJRFsxNl0gPSB7CiAgICAgICAgIDB4MTAsMHg3NywweEVGLDB4RUMsMHhDMCwweEIyLDB4NEQsMHgwMiwKICAgICAgICAgMHhBQywweEUzLDB4M0MsMHgxRSwweDUyLDB4RTIsMHhGQiwweDRCCiAgICAgfTsKIAotICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDbGVhcktleVVVSUQsIHNpemVvZihrQ2xlYXJLZXlVVUlEKSk7CisgICAgLy8gVG8gYmUgdXNlZCBpbiBtcGQgdG8gc3BlY2lmeSBkcm0gc2NoZW1lIGZvciBwbGF5ZXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFsxNl0gPSB7CisgICAgICAgIDB4RTIsMHg3MSwweDlELDB4NTgsMHhBOSwweDg1LDB4QjMsMHhDOSwKKyAgICAgICAgMHg3OCwweDFBLDB4QjAsMHgzMCwweEFGLDB4NzgsMHhEMywweDBFCisgICAgfTsKKworICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDb21tb25Qc3NoQm94VVVJRCwgc2l6ZW9mKGtDb21tb25Qc3NoQm94VVVJRCkpIHx8CisgICAgICAgICAgICFtZW1jbXAodXVpZCwga0NsZWFyS2V5VVVJRCwgc2l6ZW9mKGtDbGVhcktleVVVSUQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCmluZGV4IDVmZGFjNWMuLmVjMDdkODcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcApAQCAtMjUsMTAgKzI1LDI4IEBACiAKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrT2ZmbGluZSgiT2ZmbGluZSIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleUxpY2Vuc2VUeXBlKCJMaWNlbnNlVHlwZSIpOworICAgIC8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1F1ZXJ5S2V5UGxheUFsbG93ZWQoIlBsYXlBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVJlbmV3QWxsb3dlZCgiUmVuZXdBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCit9OworCiBuYW1lc3BhY2UgY2xlYXJrZXlkcm0gewogCiB1c2luZyBhbmRyb2lkOjpzcDsKIAorRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CiAgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CkBAIC02MCwxOCArNzgsMjggQEAKICAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgICB9CisKICAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KKwogICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CiAgICAgZGVmYXVsdFVybC5jbGVhcigpOwogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCiAgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCAmcmVxdWVzdCk7CiB9CiAKK3ZvaWQgRHJtUGx1Z2luOjpzZXRQbGF5UG9saWN5KCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleUxpY2Vuc2VUeXBlLCBrU3RyZWFtaW5nKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UGxheUFsbG93ZWQsIGtUcnVlKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UmVuZXdBbGxvd2VkLCBrVHJ1ZSk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtODMsNiArMTExLDggQEAKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOwogICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgewogICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KQEAgLTExMSw0ICsxNDEsMTggQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKK3N0YXR1c190IERybVBsdWdpbjo6cXVlcnlLZXlTdGF0dXMoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgeworCisgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGluZm9NYXAuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7CisgICAgICAgIGluZm9NYXAuYWRkKG1QbGF5UG9saWN5LmtleUF0KGkpLCBtUGxheVBvbGljeS52YWx1ZUF0KGkpKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCmluZGV4IDU4NDIxYjkuLmYzN2E3MDYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCkBAIC0zOSw4ICszOSw4IEBACiAKIGNsYXNzIERybVBsdWdpbiA6IHB1YmxpYyBhbmRyb2lkOjpEcm1QbHVnaW4gewogcHVibGljOgotICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCi0gICAgICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkge30KKyAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKKwogICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKQEAgLTgxLDEzICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFVOVVNFRChpbmZvTWFwKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKQEAgLTI0OCw5ICsyNDIsMTIgQEAKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKyAgICB2b2lkIHNldFBsYXlQb2xpY3koKTsKIAorICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1QbGF5UG9saWN5OwogICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcAppbmRleCA2YTRmOGQ1Li5jYWZmMzkzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBBU3RyaW5nIGVuY29kZWRJZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgewogICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKLSAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NFVybChrZXlJZHNbaV0sIGtLZXlJZFNpemUsICZlbmNvZGVkSWQpOwogICAgICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLCIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCBhYzU3ZDY1Li4wZmNmYzY0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM0LDQgKzM0LDUgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibWVkaWFfcGx1Z2luX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKaW5kZXggODRlZDI0Mi4uOGM0OTY1NiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7Ci0gICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0VXJsKGV4cGVjdGVkS2V5c1tpXSwga0tleUlkU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZElkQVN0cmluZyk7CiAgICAgICAgICAgICBTdHJpbmc4IGVuY29kZWRJZChlbmNvZGVkSWRBU3RyaW5nLmNfc3RyKCkpOwogICAgICAgICAgICAgZW5jb2RlZElkLnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CkBAIC0yMzEsNSArMjMxLDQgQEAKIAogICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jTWltZVR5cGUpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCmluZGV4IGMzYjBkODQuLmQ5ZjNlYTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcApAQCAtMjg0LDE0ICsyODQsMTQgQEAKICAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgogICAgICAgICAgICAgICAgICAgICAiW3siCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCiAgICAgICAgICAgICAgICAgICAgICJ9IgogICAgICAgICAgICAgICAgICAgICAieyIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lDRV9cIiIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKICAgICAgICAgICAgICAgICAgICAgIn0iCiAgICAgICAgICAgICAgICAgICAgICJ7IgpAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICJ7IgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAifV0iCiAgICAgICAgICAgICAifSIpOwpAQCAtMzEzLDggKzMxMyw4IEBACiAgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMyk7CiAKICAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KLSAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISEiKSwgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLAotICAgICAgICAgICAgICBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQgIT4/IiksIFN0cmluZzgoIkhlbGxvIEZyaWVuZCAhPyIpLAorICAgICAgICAgICAgICBTdHJpbmc4KCJIZWxsbyA/Pj4gRnJpZW5kID8+IikgfTsKICAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icAppbmRleCA3ZjQ0ODE5Li5hYmQxODg0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKIAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvT1dORVJTCkBAIC0wLDAgKzEsNiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQorZ2thc3RlbkBhbmRyb2lkLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQoranRpbmtlckBnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTA1MzBlNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBkcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5haWRsCmNvcHkgdG8gaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmluZGV4IGZkZjk5ZWIuLjllZmQ3NmQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCkBAIC0xNCwxNCArMTQsMjUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmFtYmxlcjsKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19DTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0NMSUVOVF9ICiAKLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElEZXNjcmFtYmxlciB7Ci0gICAgdm9pZCBzZXRNZWRpYUNhc1Nlc3Npb24oaW4gYnl0ZVtdIHNlc3Npb25JZCk7Ci0gICAgYm9vbGVhbiByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoU3RyaW5nIG1pbWUpOwotICAgIGludCBkZXNjcmFtYmxlKGluIE1lZGlhRGVzY3JhbWJsZXIuRGVzY3JhbWJsZUluZm8gZGVzY3JhbWJsZUluZm8pOwotICAgIHZvaWQgcmVsZWFzZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvQ2xpZW50IHsKKyBwdWJsaWM6CisgICAgQXVkaW9DbGllbnQoKSA6CisgICAgICAgIGNsaWVudFVpZCgtMSksIGNsaWVudFBpZCgtMSksIHBhY2thZ2VOYW1lKCIiKSB7fQorCisgICAgdWlkX3QgY2xpZW50VWlkOworICAgIHBpZF90IGNsaWVudFBpZDsKKyAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDUwZTEyZjQuLjc3MWYxYjggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDMwOWMyM2QuLmNlMzBhNzggMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DYXNJbXBsLmggYi9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ZjFjZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENBU19JTVBMX0hfCi0jZGVmaW5lIENBU19JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkNhcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhc0xpc3RlbmVyOwotfQotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhQ2FzOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzUGx1Z2luOwotY2xhc3MgU2hhcmVkTGlicmFyeTsKLQotY2xhc3MgQ2FzSW1wbCA6IHB1YmxpYyBCbkNhcyB7Ci1wdWJsaWM6Ci0gICAgQ2FzSW1wbChjb25zdCBzcDxJQ2FzTGlzdGVuZXI+ICZsaXN0ZW5lcik7Ci0gICAgdmlydHVhbCB+Q2FzSW1wbCgpOwotCi0gICAgc3RhdGljIHZvaWQgT25FdmVudCgKLSAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBpbml0KGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBDYXNQbHVnaW4gKnBsdWdpbik7Ci0gICAgdm9pZCBvbkV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgICAgIGludDMyX3QgYXJnLAotICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKLSAgICAgICAgICAgIHNpemVfdCBzaXplKTsKLQotICAgIC8vIElDYXMgaW5oZXJpdHMKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldFByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSYgcHZ0RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBvcGVuU2Vzc2lvbihDYXNTZXNzaW9uSWQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBjbG9zZVNlc3Npb24oY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0U2Vzc2lvblByaXZhdGVEYXRhKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb2Nlc3NFY20oCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm9jZXNzRW1tKGNvbnN0IFBhcmNlbGFibGVDYXNEYXRhJiBlbW0pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2VuZEV2ZW50KAotICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZldmVudERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzE2JiBwcm92aXNpb25TdHJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgICAgIGludDMyX3QgcmVmcmVzaFR5cGUsIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPENhc0RhdGE+ICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWxlYXNlKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFBsdWdpbkhvbGRlcjsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IG1QbHVnaW5Ib2xkZXI7Ci0gICAgc3A8SUNhc0xpc3RlbmVyPiBtTGlzdGVuZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXNJbXBsKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIENBU19JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oIGIvaW5jbHVkZS9tZWRpYS9EZXNjcmFtYmxlckltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMTJhYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREVTQ1JBTUJMRVJfSU1QTF9IXwotI2RlZmluZSBERVNDUkFNQkxFUl9JTVBMX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkRlc2NyYW1ibGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYURlc2NyYW1ibGVyOwotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgRGVzY3JhbWJsZXJQbHVnaW47Ci1jbGFzcyBTaGFyZWRMaWJyYXJ5OwotCi1jbGFzcyBEZXNjcmFtYmxlckltcGwgOiBwdWJsaWMgQm5EZXNjcmFtYmxlciB7Ci1wdWJsaWM6Ci0gICAgRGVzY3JhbWJsZXJJbXBsKGNvbnN0IHNwPFNoYXJlZExpYnJhcnk+JiBsaWJyYXJ5LCBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlckltcGwoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHNldE1lZGlhQ2FzU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgZGVzY3JhbWJsZSgKLSAgICAgICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBkZXNjcmFtYmxlSW5mbywgaW50MzJfdCAqcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbiAqbVBsdWdpbjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVySW1wbCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBERVNDUkFNQkxFUl9JTVBMX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNhc0RlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YTk2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX0RFRlNfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX0RFRlNfSF8KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1jbGFzcyBJTWVtb3J5OwotbmFtZXNwYWNlIG1lZGlhIHsKLQotbmFtZXNwYWNlIE1lZGlhQ2FzIHsKLWNsYXNzIFBhcmNlbGFibGVDYXNEYXRhIDogcHVibGljIENhc0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBQYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgUGFyY2VsYWJsZUNhc0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIDoKLSAgICAgICAgQ2FzRGF0YShkYXRhLCBkYXRhICsgc2l6ZSkge30KLSAgICB2aXJ0dWFsIH5QYXJjZWxhYmxlQ2FzRGF0YSgpIHt9Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcmNlbGFibGVDYXNEYXRhKTsKLX07Ci0KLWNsYXNzIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIDogcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBjb25zdCBjaGFyICpuYW1lKQotICAgICAgICA6IG1DQVN5c3RlbUlkKENBX3N5c3RlbV9pZCksIG1OYW1lKG5hbWUpIHt9Ci0KLSAgICBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigpIDogbUNBU3lzdGVtSWQoMCkge30KLQotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yJiYgZGVzYykgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB+UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoKSB7fQotCi0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgU3RyaW5nMTYgbU5hbWU7Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IpOwotfTsKLX0KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotY2xhc3MgRGVzY3JhbWJsZUluZm8gOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBEZXN0aW5hdGlvblR5cGUgewotICAgICAgICBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyLCAgICAvLyBub24tc2VjdXJlCi0gICAgICAgIGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUgIC8vIHNlY3VyZQotICAgIH07Ci0KLSAgICBEZXN0aW5hdGlvblR5cGUgZHN0VHlwZTsKLSAgICBEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wgc2NyYW1ibGluZ0NvbnRyb2w7Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXM7Ci0gICAgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlczsKLSAgICBzcDxJTWVtb3J5PiBzcmNNZW07Ci0gICAgaW50MzJfdCBzcmNPZmZzZXQ7Ci0gICAgdm9pZCAqZHN0UHRyOwotICAgIGludDMyX3QgZHN0T2Zmc2V0OwotCi0gICAgRGVzY3JhbWJsZUluZm8oKTsKLSAgICB2aXJ0dWFsIH5EZXNjcmFtYmxlSW5mbygpOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotcHJpdmF0ZToKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyYW1ibGVJbmZvKTsKLX07Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIG1lZGlhCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vIE1FRElBX0NBU19ERUZTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdkOWE3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwgYi9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCmluZGV4IDM3ZTJjMzkuLmY0MDA1ODIgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKKysrIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpbyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8KZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDY3ZDBiYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpbworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU1ODQxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjViY2M3NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDNiZmFjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44YTEzYjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjc1MGZkZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRlYTQzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzBmNDI2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mZjZhMTUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9OQkFJTy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmMzNTQwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43YWNmYzkwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE0YmJiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjRiMjFjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43NGEzYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oIGIvaW5jbHVkZS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNGNkOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ09ERUNTX1hNTF9QQVJTRVJfSF8KLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfWE1MX1BBUlNFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIFF1aXJrIHN0aWxsIHN1cHBvcnRlZCwgZXZlbiB0aG91Z2ggZGVwcmVjYXRlZAotZW51bSBRdWlya3MgewotICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzICAgPSAxLAotICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyAgPSAyLAotCi0gICAga1F1aXJrc01hc2sgPSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cwotICAgICAgICAgICAgICAgIHwga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzLAotfTsKLQotLy8gTGlnaHR3ZWlnaHQgc3RydWN0IGZvciBxdWVyeWluZyBjb21wb25lbnRzLgotc3RydWN0IFR5cGVJbmZvIHsKLSAgICBBU3RyaW5nIG1OYW1lOwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+IG1TdHJpbmdGZWF0dXJlczsKLSAgICBzdGQ6Om1hcDxBU3RyaW5nLCBib29sPiBtQm9vbEZlYXR1cmVzOwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+IG1EZXRhaWxzOwotfTsKLQotc3RydWN0IFByb2ZpbGVMZXZlbCB7Ci0gICAgdWludDMyX3QgbVByb2ZpbGU7Ci0gICAgdWludDMyX3QgbUxldmVsOwotfTsKLQotc3RydWN0IENvZGVjSW5mbyB7Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZUluZm8+IG1UeXBlczsKLSAgICBzdGQ6OnZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzOwotICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1Jc0VuY29kZXI7Ci19OwotCi1jbGFzcyBNZWRpYUNvZGVjc1htbFBhcnNlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKLSAgICB+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKLQotICAgIHZvaWQgZ2V0R2xvYmFsU2V0dGluZ3Moc3RkOjptYXA8QVN0cmluZywgQVN0cmluZz4gKnNldHRpbmdzKSBjb25zdDsKLQotICAgIHN0YXR1c190IGdldENvZGVjSW5mbyhjb25zdCBjaGFyICpuYW1lLCBDb2RlY0luZm8gKmluZm8pIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZ2V0UXVpcmtzKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6dmVjdG9yPEFTdHJpbmc+ICpxdWlya3MpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGVudW0gU2VjdGlvbiB7Ci0gICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCi0gICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUiwKLSAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCi0gICAgICAgIFNFQ1RJT05fSU5DTFVERSwKLSAgICB9OwotCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7Ci0gICAgaW50MzJfdCBtRGVwdGg7Ci0gICAgQVN0cmluZyBtSHJlZkJhc2U7Ci0KLSAgICBzdGQ6Om1hcDxBU3RyaW5nLCBBU3RyaW5nPiBtR2xvYmFsU2V0dGluZ3M7Ci0KLSAgICAvLyBuYW1lIC0+IENvZGVjSW5mbwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIENvZGVjSW5mbz4gbUNvZGVjSW5mb3M7Ci0gICAgc3RkOjptYXA8QVN0cmluZywgc3RkOjp2ZWN0b3I8QVN0cmluZz4+IG1RdWlya3M7Ci0gICAgQVN0cmluZyBtQ3VycmVudE5hbWU7Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZUluZm8+OjppdGVyYXRvciBtQ3VycmVudFR5cGU7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgaWdub3JlX2Vycm9ycyA9IGZhbHNlKTsKLQotICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0gICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLQotICAgIHN0YXRpYyB2b2lkIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKLQotICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKTsKLSAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjc1htbFBhcnNlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0NPREVDU19YTUxfUEFSU0VSX0hfCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDlkYTVlZjMuLmZmNDQwYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTY4LDYgKzU2OCw5IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKwogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZAogICAgIC8vIHRvIGJlIGNhbGxlZCBmcm9tIGF0IG1vc3Qgb25lIHRocmVhZCBvZiBzZXJ2ZXIsIGFuZCBvbmUgdGhyZWFkIG9mIGNsaWVudC4KQEAgLTYyMCw2ICs2MjMsNyBAQAogCiBwdWJsaWM6CiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBmcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCmluZGV4IDUxMDUwY2QuLmE5ZDRkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaApAQCAtMzAsMTQgKzMwLDQxIEBACiBjbGFzcyBWaWRlb0ZyYW1lCiB7CiBwdWJsaWM6Ci0gICAgVmlkZW9GcmFtZSgpOiBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1EaXNwbGF5V2lkdGgoMCksIG1EaXNwbGF5SGVpZ2h0KDApLCBtU2l6ZSgwKSwKLSAgICAgICAgICAgIG1Sb3RhdGlvbkFuZ2xlKDApLCBtRGF0YSgwKSB7fQorICAgIC8vIENvbnN0cnVjdCBhIFZpZGVvRnJhbWUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLAorICAgIC8vIHdpbGwgYWxsb2NhdGUgZnJhbWUgYnVmZmVyIGlmIHxhbGxvY2F0ZXwgaXMgc2V0IHRvIHRydWUsIHdpbGwKKyAgICAvLyBhbGxvY2F0ZSBidWZmZXIgdG8gaG9sZCBJQ0MgZGF0YSBpZiB8aWNjRGF0YXwgYW5kIHxpY2NTaXplfAorICAgIC8vIGluZGljYXRlIGl0cyBwcmVzZW5jZS4KKyAgICBWaWRlb0ZyYW1lKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBkaXNwbGF5V2lkdGgsIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCBib29sIGFsbG9jYXRlLAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqaWNjRGF0YSwgc2l6ZV90IGljY1NpemUpOgorICAgICAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgIG1EaXNwbGF5V2lkdGgoZGlzcGxheVdpZHRoKSwgbURpc3BsYXlIZWlnaHQoZGlzcGxheUhlaWdodCksCisgICAgICAgIG1Sb3RhdGlvbkFuZ2xlKGFuZ2xlKSwgbUJ5dGVzUGVyUGl4ZWwoYnBwKSwgbVJvd0J5dGVzKGJwcCAqIHdpZHRoKSwKKyAgICAgICAgbVNpemUoMCksIG1JY2NTaXplKDApLCBtUmVzZXJ2ZWQoMCksIG1EYXRhKDApLCBtSWNjRGF0YSgwKSB7CisgICAgICAgIGlmIChhbGxvY2F0ZSkgeworICAgICAgICAgICAgbVNpemUgPSBtUm93Qnl0ZXMgKiBtSGVpZ2h0OworICAgICAgICAgICAgbURhdGEgPSBuZXcgdWludDhfdFttU2l6ZV07CisgICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCisgICAgICAgIGlmIChpY2NEYXRhICE9IE5VTEwgJiYgaWNjU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1JY2NTaXplID0gaWNjU2l6ZTsKKyAgICAgICAgICAgIG1JY2NEYXRhID0gbmV3IHVpbnQ4X3RbaWNjU2l6ZV07CisgICAgICAgICAgICBpZiAobUljY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtSWNjRGF0YSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERlZXAgY29weSBvZiBib3RoIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMgYW5kIHRoZSBmcmFtZSBkYXRhCiAgICAgVmlkZW9GcmFtZShjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7Ci0gICAgICAgIG1XaWR0aCA9IGNvcHkubVdpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gY29weS5tSGVpZ2h0OwotICAgICAgICBtRGlzcGxheVdpZHRoID0gY29weS5tRGlzcGxheVdpZHRoOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IGNvcHkubURpc3BsYXlIZWlnaHQ7CisgICAgICAgIGNvcHlJbmZvT25seShjb3B5KTsKKwogICAgICAgICBtU2l6ZSA9IGNvcHkubVNpemU7CiAgICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKICAgICAgICAgaWYgKG1TaXplID4gMCAmJiBjb3B5Lm1EYXRhICE9IE5VTEwpIHsKQEAgLTQ4LDI2ICs3NSw5OSBAQAogICAgICAgICAgICAgICAgIG1TaXplID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7CisKKyAgICAgICAgbUljY1NpemUgPSBjb3B5Lm1JY2NTaXplOworICAgICAgICBtSWNjRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChtSWNjU2l6ZSA+IDAgJiYgY29weS5tSWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtSWNjRGF0YSA9IG5ldyB1aW50OF90W21JY2NTaXplXTsKKyAgICAgICAgICAgIGlmIChtSWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1JY2NEYXRhLCBjb3B5Lm1JY2NEYXRhLCBtSWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIH5WaWRlb0ZyYW1lKCkgewogICAgICAgICBpZiAobURhdGEgIT0gMCkgewogICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY2NEYXRhICE9IDApIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JY2NEYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSB8Y29weXwgdG8gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5LCAndGhpcycgbXVzdCBwb2ludCB0bworICAgIC8vIGEgY2h1bmsgb2YgbWVtb3J5IGJhY2sgYnkgSU1lbW9yeSBvZiBzaXplIGF0IGxlYXN0IGdldEZsYXR0ZW5lZFNpemUoKQorICAgIC8vIG9mIHxjb3B5fC4KKyAgICB2b2lkIGNvcHlGbGF0dGVuZWQoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgeworICAgICAgICBjb3B5SW5mb09ubHkoY29weSk7CisKKyAgICAgICAgbVNpemUgPSBjb3B5Lm1TaXplOworICAgICAgICBtRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChjb3B5Lm1TaXplID4gMCAmJiBjb3B5Lm1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShnZXRGbGF0dGVuZWREYXRhKCksIGNvcHkubURhdGEsIGNvcHkubVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgbUljY1NpemUgPSBjb3B5Lm1JY2NTaXplOworICAgICAgICBtSWNjRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0CisgICAgICAgIGlmIChjb3B5Lm1JY2NTaXplID4gMCAmJiBjb3B5Lm1JY2NEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShnZXRGbGF0dGVuZWRJY2NEYXRhKCksIGNvcHkubUljY0RhdGEsIGNvcHkubUljY1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBmbGF0dGVuZWQgc2l6ZSB0byBwdXQgaXQgaW4gSU1lbW9yeQorICAgIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZW9mKFZpZGVvRnJhbWUpICsgbVNpemUgKyBtSWNjU2l6ZTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGZyYW1lIGRhdGEgaW4gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5CisgICAgdWludDhfdCogZ2V0RmxhdHRlbmVkRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKFZpZGVvRnJhbWUpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgcG9pbnRlciB0byB0aGUgSUNDIGRhdGEgaW4gYSBmbGF0dGVuZWQgVmlkZW9GcmFtZSBpbiBJTWVtb3J5CisgICAgdWludDhfdCogZ2V0RmxhdHRlbmVkSWNjRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKFZpZGVvRnJhbWUpICsgbVNpemU7CiAgICAgfQogCiAgICAgLy8gSW50ZW50aW9uYWwgcHVibGljIGFjY2VzcyBtb2RpZmllcjoKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLSAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOwotICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OworICAgIHVpbnQzMl90IG1XaWR0aDsgICAgICAgICAgIC8vIERlY29kZWQgaW1hZ2Ugd2lkdGggYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbUhlaWdodDsgICAgICAgICAgLy8gRGVjb2RlZCBpbWFnZSBoZWlnaHQgYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbURpc3BsYXlXaWR0aDsgICAgLy8gRGlzcGxheSB3aWR0aCBiZWZvcmUgcm90YXRpb24KKyAgICB1aW50MzJfdCBtRGlzcGxheUhlaWdodDsgICAvLyBEaXNwbGF5IGhlaWdodCBiZWZvcmUgcm90YXRpb24KKyAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKKyAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisgICAgdWludDMyX3QgbVJvd0J5dGVzOyAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgYmVmb3JlIHJvdGF0aW9uCiAgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgLy8gcm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCi0gICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0IGJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCisgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgdWludDMyX3QgbVJlc2VydmVkOyAgICAgICAgLy8gKHBhZGRpbmcgdG8gbWFrZSBtRGF0YSA2NC1iaXQgYWxpZ25lZCkKKworICAgIC8vIG1EYXRhIHNob3VsZCBiZSA2NC1iaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZwogICAgIHVpbnQ4X3QqIG1EYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQotICAgIC8vIHBhZCBzdHJ1Y3R1cmUgc28gaXQncyB0aGUgc2FtZSBzaXplIG9uIDY0IGJpdCBhbmQgMzIgYml0CisgICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQtYml0IGFuZCAzMi1iaXQKICAgICBjaGFyICAgICBtUGFkZGluZ1s4IC0gc2l6ZW9mKG1EYXRhKV07CisKKyAgICAvLyBtSWNjRGF0YSBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKKyAgICB1aW50OF90KiBtSWNjRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NC1iaXQgYW5kIDMyLWJpdAorICAgIGNoYXIgICAgIG1JY2NQYWRkaW5nWzggLSBzaXplb2YobUljY0RhdGEpXTsKKworcHJpdmF0ZToKKyAgICAvLworICAgIC8vIFV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgd2l0aGluIFZpZGVvRnJhbWUgc3RydWN0CisgICAgLy8KKworICAgIC8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBvbmx5CisgICAgdm9pZCBjb3B5SW5mb09ubHkoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgeworICAgICAgICBtV2lkdGggPSBjb3B5Lm1XaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGNvcHkubUhlaWdodDsKKyAgICAgICAgbURpc3BsYXlXaWR0aCA9IGNvcHkubURpc3BsYXlXaWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBjb3B5Lm1EaXNwbGF5SGVpZ2h0OworICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7CisgICAgICAgIG1CeXRlc1BlclBpeGVsID0gY29weS5tQnl0ZXNQZXJQaXhlbDsKKyAgICAgICAgbVJvd0J5dGVzID0gY29weS5tUm93Qnl0ZXM7CisgICAgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc3ZjhmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbyA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpbzogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYyYWQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb0NsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9DbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lSQURJT19DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9TZXJ2aWNlLmggYi9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NmRkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lSQURJT19TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW87Ci1jbGFzcyBJUmFkaW9DbGllbnQ7Ci0KLWNsYXNzIElSYWRpb1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCByYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUmFkaW9TZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpby5oIGIvaW5jbHVkZS9yYWRpby9SYWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRkZDJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHJhZGlvL1JhZGlvQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVtb3J5RGVhbGVyOwotCi1jbGFzcyBSYWRpbyA6IHB1YmxpYyBCblJhZGlvQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5SYWRpbygpOwotCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLSAgICBzdGF0aWMgIHNwPFJhZGlvPiBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+JiBjYWxsYmFjayk7Ci0KLQotICAgICAgICAgICAgdm9pZCBkZXRhY2goKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICAgICAgIC8vIEJwUmFkaW9DbGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7Ci0KLSAgICAgICAgICAgIC8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi1wcml2YXRlOgotICAgICAgICAgICAgUmFkaW8ocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJhZGlvQ2FsbGJhY2s+Jik7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gZ2V0UmFkaW9TZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgc3A8SVJhZGlvPiAgICAgICAgICAgICAgbUlSYWRpbzsKLSAgICAgICAgICAgIHNwPFJhZGlvQ2FsbGJhY2s+ICAgICAgIG1DYWxsYmFjazsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9SYWRpb0NhbGxiYWNrLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ZjFhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBSYWRpb0NhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLQotICAgICAgICAgICAgUmFkaW9DYWxsYmFjaygpIHt9Ci0gICAgdmlydHVhbCB+UmFkaW9DYWxsYmFjaygpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50KSA9IDA7Ci0KLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDVlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9PV05FUlMKQEAgLTAsMCArMSwxOCBAQAorY2h6QGdvb2dsZS5jb20KK2R3a2FuZ0Bnb29nbGUuY29tCitlbGF1cmVudEBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQoraHVuZ2FAZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQorcGhpbGJ1cmtAZ29vZ2xlLmNvbQorcG1jbGVhbkBnb29nbGUuY29tCityYWNoYWRAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCityb2JlcnRzaGloQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IGFmZDExODkuLjNlZTc0OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsNiBAQAogCWxpYmxvZyBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCi0JbGlicmFkaW9zZXJ2aWNlIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscyBcCiAJbGliaHdiaW5kZXIKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggYmE0N2ZkNC4uNDc0ZWY5NyAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTMyLDExICszMiwxMiBAQAogI2luY2x1ZGUgPGh3YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKKyNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvVGVzdGluZy5oIgogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgotI2luY2x1ZGUgIlJhZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTEzMiw5ICsxMzMsMTYgQEAKICAgICAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKICAgICAgICAgQXVkaW9GbGluZ2VyOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7Ci0gICAgICAgIC8vIEFBdWRpb1NlcnZpY2UgZGlzYWJsZWQgYmVjYXVzZSB3ZSBkbyBub3Qgc3VwcG9ydCBNTUFQIG1vZGUgaW4gT0Mgb3IgT0MtRFIxLgotICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICAgICAgLy8gQUF1ZGlvU2VydmljZSBzaG91bGQgb25seSBiZSB1c2VkIGluIE9DLU1SMSBhbmQgbGF0ZXIuCisgICAgICAgIC8vIEFuZCBvbmx5IGVuYWJsZSB0aGUgQUF1ZGlvU2VydmljZSBpZiB0aGUgc3lzdGVtIE1NQVAgcG9saWN5IGV4cGxpY2l0bHkgYWxsb3dzIGl0LgorICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgY2xpZW50IGZyb20gbWlzdXNpbmcgQUF1ZGlvU2VydmljZSB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUE9MSUNZX05FVkVSKTsKKyAgICAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BVVRPIHx8IG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BTFdBWVMpIHsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIH0KKwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAppbmRleCBmNTM5YmE5Li42ZTYwZjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icApAQCAtMTYsMTIgKzE2LDE0IEBACiAgICAgbmFtZTogImxpYkFBdWRpb19oZWFkZXJzIiwKICAgICBmcm9tOiAiaW5jbHVkZSIsCiAgICAgdG86ICIiLAotICAgIHNyY3M6IFsiaW5jbHVkZS9hYXVkaW8vKi5oIl0sCisgICAgLy8gb21pdCBBQXVkaW9UZXN0aW5nLmg7IHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gdGhvc2Ugd2hvIG5lZWQgaXQKKyAgICBzcmNzOiBbImluY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIl0sCiAgICAgbGljZW5zZTogImluY2x1ZGUvYWF1ZGlvL05PVElDRSIsCiB9CiAKIG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliYWF1ZGlvIiwKKyAgICAvLyBkZWxpYmVyYXRlbHkgaW5jbHVkZXMgc3ltYm9scyBmcm9tIEFBdWRpb1Rlc3RpbmcuaAogICAgIHN5bWJvbF9maWxlOiAibGliYWF1ZGlvLm1hcC50eHQiLAogICAgIGZpcnN0X3ZlcnNpb246ICIyNiIsCiAgICAgdW52ZXJzaW9uZWRfdW50aWw6ICJjdXJyZW50IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZSBiL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZQppbmRleCBlMmM0OTYwLi43Mjk4ZDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vRG94eWZpbGUKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlCkBAIC03NDQsMTIgKzc0NCwxMiBAQAogIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCiAKIElOUFVUICAgICAgICAgICAgICAgICAgPSBpbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9sZWdhY3kvQUF1ZGlvTGVnYWN5LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvY29yZS9BdWRpb1N0cmVhbS5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL09XTkVSUyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRkNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDkxMGIxMGMuLjlmZWIxMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTI3LDkgKzI3LDExIEBACiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKIAogLy8gVE9ETyBzdXBwb3J0IEZMT0FUCi0jZGVmaW5lIFJFUVVJUkVEX0ZPUk1BVCAgQUFVRElPX0ZPUk1BVF9QQ01fSTE2CisjZGVmaW5lIFJFUVVJUkVEX0ZPUk1BVCAgICBBQVVESU9fRk9STUFUX1BDTV9JMTYKICNkZWZpbmUgTUlOX0ZSQU1FU19UT19SRUFEIDQ4ICAvKiBhcmJpdHJhcnksIDEgbXNlYyBhdCA0ODAwMCBIeiAqLwogCitzdGF0aWMgY29uc3QgaW50IEZSQU1FU19QRVJfTElORSA9IDIwMDAwOworCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7CiAgICAgQUF1ZGlvQXJnc1BhcnNlciAgIGFyZ1BhcnNlcjsKQEAgLTQ2LDcgKzQ4LDEwIEBACiAgICAgaW50MzJfdCBmcmFtZXNQZXJSZWFkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSAwOworICAgIGludDMyX3QgbmV4dEZyYW1lQ291bnQgPSAwOworICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCB4UnVuQ291bnQgPSAwOworICAgIGludDY0X3QgcHJldmlvdXNGcmFtZVBvc2l0aW9uID0gLTE7CiAgICAgaW50MTZfdCAqZGF0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgcGVha0xldmVsID0gMC4wOwogICAgIGludCBsb29wQ291bnRlciA9IDA7CkBAIC01Niw3ICs2MSw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBNb25pdG9yIGlucHV0IGxldmVsIHVzaW5nIEFBdWRpb1xuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIE1vbml0b3IgaW5wdXQgbGV2ZWwgdXNpbmcgQUF1ZGlvIHJlYWQsIFYwLjEuMlxuIiwgYXJndlswXSk7CiAKICAgICBhcmdQYXJzZXIuc2V0Rm9ybWF0KFJFUVVJUkVEX0ZPUk1BVCk7CiAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKQEAgLTc0LDcgKzc5LDcgQEAKICAgICBkZXZpY2VJZCA9IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiZGV2aWNlSWQgPSAlZFxuIiwgZGV2aWNlSWQpOwogCi0gICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoYWF1ZGlvU3RyZWFtKTsKICAgICBwcmludGYoIlNhbXBsZXNQZXJGcmFtZSA9ICVkXG4iLCBhY3R1YWxTYW1wbGVzUGVyRnJhbWUpOwogICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZVJhdGUpOwpAQCAtMTMzLDYgKzEzOCw3IEBACiAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgfQogICAgICAgICBmcmFtZXNMZWZ0IC09IGFjdHVhbDsKKyAgICAgICAgZnJhbWVDb3VudCArPSBhY3R1YWw7CiAKICAgICAgICAgLy8gUGVhayBmaW5kZXIuCiAgICAgICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgYWN0dWFsOyBmcmFtZUluZGV4KyspIHsKQEAgLTE0Myw5ICsxNDksMzYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIERpc3BsYXkgbGV2ZWwgYXMgc3RhcnMsIGVnLiAiKioqKioqIi4KLSAgICAgICAgaWYgKChsb29wQ291bnRlcisrICUgMTApID09IDApIHsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiBuZXh0RnJhbWVDb3VudCkgewogICAgICAgICAgICAgZGlzcGxheVBlYWtMZXZlbChwZWFrTGV2ZWwpOwogICAgICAgICAgICAgcGVha0xldmVsID0gMC4wOworICAgICAgICAgICAgbmV4dEZyYW1lQ291bnQgKz0gRlJBTUVTX1BFUl9MSU5FOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJpbnQgdGltZXN0YW1wcy4KKyAgICAgICAgaW50NjRfdCBmcmFtZVBvc2l0aW9uID0gMDsKKyAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUgPSAwOworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGltZVJlc3VsdDsKKyAgICAgICAgdGltZVJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLCBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVBvc2l0aW9uLCAmZnJhbWVUaW1lKTsKKworICAgICAgICBpZiAodGltZVJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGlmIChmcmFtZVBvc2l0aW9uID4gKHByZXZpb3VzRnJhbWVQb3NpdGlvbiArIEZSQU1FU19QRVJfTElORSkpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChhYXVkaW9TdHJlYW0pOworCisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNaWxsaXMgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKGZyYW1lc1JlYWQsIHJlYWxUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVBvc2l0aW9uLCBmcmFtZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCItLS0gdGltZXN0YW1wOiByZXN1bHQgPSAlNGQsIHBvc2l0aW9uID0gJWxsZCwgYXQgJWxsZCBuYW5vcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBsYXRlbmN5ID0gJTcuMmYgbXNlY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TWlsbGlzKTsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0ZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKaW5kZXggOWRlMmViMC4uODkzNzk1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwotICAgIHByaW50ZigiJXMgLSBEaXNwbGF5IGF1ZGlvIGlucHV0IHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFja1xuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIERpc3BsYXkgYXVkaW8gaW5wdXQgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrLCBWMC4xLjJcbiIsIGFyZ3ZbMF0pOwogCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbigyLCA0ODAwMCwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LAogICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVSZWNvcmRlckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVJlY29yZGVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCAxNDRjOTQxLi5kZjBkZjA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtNDE3LDExICs0MTcsMTggQEAKICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICAgICAgcHJpbnRmKCIlNGQ6ICIsIGkpOwogICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5wcmludFN0YXR1cygpOwotICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4obG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBwcmludGYoIiBpbnB1dCB3cml0dGVuID0gJWxsZCwgcmVhZCAlbGxkLCB4cnVucyA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVzUmVhZCwKKworICAgICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRGcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICBwcmludGYoIiBJTlBVVDogd3IgJWxsZCByZCAlbGxkIHN0YXRlICVzLCBPVVRQVVQ6IHdyICVsbGQgcmQgJWxsZCBzdGF0ZSAlcywgeHJ1bnMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgaW5wdXRGcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGlucHV0RnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pKSwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvdXRwdXRGcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG91dHB1dEZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChBQXVkaW9TdHJlYW1fZ2V0U3RhdGUob3V0cHV0U3RyZWFtKSksCiAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pCiAgICAgICAgICAgICApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAppbmRleCA0NmJjOTllLi5hZGEzN2UyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDggQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgotI2luY2x1ZGUgPEFBdWRpb0V4YW1wbGVVdGlscy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKIC8vIFRPRE8gdXNlIHRoaXMgYXMgYSBiYXNlIGNsYXNzIHdpdGhpbiBBQXVkaW8KIGNsYXNzIEFBdWRpb1BhcmFtZXRlcnMgewpAQCAtMTQ5LDYgKzE1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNldENoYW5uZWxDb3VudChhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgIHNldERldmljZUlkKGF0b2koJmFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uU2Vjb25kcyA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ20nOiB7CkBAIC0yMDEsNyArMjA1LDggQEAKICAgICAgICAgcHJpbnRmKCIgICAgICBEZWZhdWx0IHZhbHVlcyBhcmUgVU5TUEVDSUZJRUQgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtYntidWZmZXJDYXBhY2l0eX0gZnJhbWVzXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtY3tjaGFubmVsc30gZm9yIGV4YW1wbGUgMiBmb3Igc3RlcmVvXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkZXZpY2VJZH0gZGVmYXVsdCBpcyAlZFxuIiwgQUFVRElPX1VOU1BFQ0lGSUVEKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtc3tkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtbXswfDF8MnwzfSBzZXQgTU1BUCBwb2xpY3lcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAwID0gX1VOU1BFQ0lGSUVELCBkZWZhdWx0XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUlxuIik7CkBAIC0yMzksNyArMjQ0LDcgQEAKICAgICAgKiBQcmludCBzdHJlYW0gcGFyYW1ldGVycyBpbiBjb21wYXJpc29uIHdpdGggcmVxdWVzdGVkIHZhbHVlcy4KICAgICAgKiBAcGFyYW0gc3RyZWFtCiAgICAgICovCi0gICAgdm9pZCBjb21wYXJlV2l0aFN0cmVhbShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgeworICAgIHZvaWQgY29tcGFyZVdpdGhTdHJlYW0oQUF1ZGlvU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKIAogICAgICAgICBwcmludGYoIiAgRGV2aWNlSWQ6ICAgICByZXF1ZXN0ZWQgPSAlZCwgYWN0dWFsID0gJWRcbiIsCiAgICAgICAgICAgICAgICBnZXREZXZpY2VJZCgpLCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoc3RyZWFtKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKaW5kZXggNjZkZTI1Zi4uYzE3OWNlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaApAQCAtMTcsMjcgKzE3LDcxIEBACiAjaWZuZGVmIEFBVURJT19FWEFNUExFX1VUSUxTX0gKICNkZWZpbmUgQUFVRElPX0VYQU1QTEVfVVRJTFNfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCiAjZGVmaW5lIE5BTk9TX1BFUl9NSUNST1NFQ09ORCAoKGludDY0X3QpMTAwMCkKICNkZWZpbmUgTkFOT1NfUEVSX01JTExJU0VDT05EIChOQU5PU19QRVJfTUlDUk9TRUNPTkQgKiAxMDAwKQogI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgICAgKE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAqIDEwMDApCiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKLSAgICBjb25zdCBjaGFyICptb2RlVGV4dCA9ICJ1bmtub3duIjsKK2NvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgeworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAidW5rbm93biI7CiAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKLSAgICAgICAgbW9kZVRleHQgPSAiRVhDTFVTSVZFIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKLSAgICAgICAgbW9kZVRleHQgPSAiU0hBUkVEIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CisgICAgICAgICAgICB0ZXh0ID0gIkVYQ0xVU0lWRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKKyAgICAgICAgICAgIHRleHQgPSAiU0hBUkVEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBtb2RlVGV4dDsKKyAgICByZXR1cm4gdGV4dDsKK30KKworY29uc3QgY2hhciAqZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CisgICAgICAgICAgICB0ZXh0ID0gIk5PTkUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CisgICAgICAgICAgICB0ZXh0ID0gIkxPV19MQVRFTkNZIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKKyAgICAgICAgICAgIHRleHQgPSAiUE9XRVJfU0FWSU5HIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworfQorCitjb25zdCBjaGFyICpnZXREaXJlY3Rpb25UZXh0KGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKKyAgICAgICAgICAgIHRleHQgPSAiSU5QVVQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICB0ZXh0ID0gIk9VVFBVVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworc3RhdGljIHZvaWQgY29udmVydE5hbm9zZWNvbmRzVG9UaW1lc3BlYyhpbnQ2NF90IG5hbm9zZWNvbmRzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKKyAgICB0aW1lLT50dl9zZWMgPSBuYW5vc2Vjb25kcyAvIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgLy8gQ2FsY3VsYXRlIHRoZSBmcmFjdGlvbmFsIG5hbm9zZWNvbmRzLiBBdm9pZHMgZXhwZW5zaXZlICUgb3BlcmF0aW9uLgorICAgIHRpbWUtPnR2X25zZWMgPSBuYW5vc2Vjb25kcyAtICh0aW1lLT50dl9zZWMgKiBOQU5PU19QRVJfU0VDT05EKTsKIH0KIAogc3RhdGljIGludDY0X3QgZ2V0TmFub3NlY29uZHMoY2xvY2tpZF90IGNsb2NrSWQgPSBDTE9DS19NT05PVE9OSUMpIHsKQEAgLTQ5LDcgKzkzLDcgQEAKICAgICByZXR1cm4gKHRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCkgKyB0aW1lLnR2X25zZWM7CiB9CiAKLXZvaWQgZGlzcGxheVBlYWtMZXZlbChmbG9hdCBwZWFrTGV2ZWwpIHsKK3N0YXRpYyB2b2lkIGRpc3BsYXlQZWFrTGV2ZWwoZmxvYXQgcGVha0xldmVsKSB7CiAgICAgcHJpbnRmKCIlNS4zZiAiLCBwZWFrTGV2ZWwpOwogICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDUwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKICAgICBpbnQgbnVtU3RhcnMgPSAoaW50KSAocGVha0xldmVsICogbWF4U3RhcnMpOwpAQCAtNTksNCArMTAzLDk3IEBACiAgICAgcHJpbnRmKCJcbiIpOwogfQogCisvKioKKyAqIEBwYXJhbSBwb3NpdGlvbjEgcG9zaXRpb24gb2YgaGFyZHdhcmUgZnJhbWUKKyAqIEBwYXJhbSBuYW5vc2Vjb25kczEKKyAqIEBwYXJhbSBwb3NpdGlvbjIgcG9zaXRpb24gb2YgY2xpZW50IHJlYWQvd3JpdGUKKyAqIEBwYXJhbSBuYW5vc2Vjb25kczIKKyAqIEBwYXJhbSBzYW1wbGVSYXRlCisgKiBAcmV0dXJuIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzCisgKi8KK3N0YXRpYyBkb3VibGUgY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyhpbnQ2NF90IHBvc2l0aW9uMSwgaW50NjRfdCBuYW5vc2Vjb25kczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uMiwgaW50NjRfdCBuYW5vc2Vjb25kczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZVJhdGUpIHsKKyAgICBpbnQ2NF90IGRlbHRhRnJhbWVzID0gcG9zaXRpb24yIC0gcG9zaXRpb24xOworICAgIGludDY0X3QgZGVsdGFUaW1lID0KKyAgICAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogZGVsdGFGcmFtZXMgLyBzYW1wbGVSYXRlKTsKKyAgICBpbnQ2NF90IHRpbWVDdXJyZW50RnJhbWVQbGF5ZWQgPSBuYW5vc2Vjb25kczEgKyBkZWx0YVRpbWU7CisgICAgaW50NjRfdCBsYXRlbmN5TmFub3MgPSB0aW1lQ3VycmVudEZyYW1lUGxheWVkIC0gbmFub3NlY29uZHMyOworICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0gbGF0ZW5jeU5hbm9zIC8gMTAwMDAwMC4wOworICAgIHJldHVybiBsYXRlbmN5TWlsbGlzOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhlc2UgRnV0ZXggY2FsbHMgYXJlIGNvbW1vbiBvbmxpbmUgZXhhbXBsZXMuCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3Qgc3lzX2Z1dGV4KHZvaWQgKmFkZHIxLCBpbnQgb3AsIGludCB2YWwxLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCwgdm9pZCAqYWRkcjIsIGludCB2YWwzKSB7CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gKGFuZHJvaWQ6OnN0YXR1c190KSBzeXNjYWxsKFNZU19mdXRleCwgYWRkcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLCB2YWwxLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyMiwgdmFsMyk7CisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCkgPyAwIDogLWVycm5vOworfQorCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FrZSh2b2lkICphZGRyLCBpbnQgbnVtV2FrZSkgeworICAgIC8vIFVzZSBfUFJJVkFURSBiZWNhdXNlIHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBmdXRleCBpbiBvbmUgcHJvY2Vzcy4KKyAgICByZXR1cm4gc3lzX2Z1dGV4KGFkZHIsIEZVVEVYX1dBS0VfUFJJVkFURSwgbnVtV2FrZSwgTlVMTCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWl0KHZvaWQgKmFkZHIsIGludCBjdXJyZW50LCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpIHsKKyAgICAvLyBVc2UgX1BSSVZBVEUgYmVjYXVzZSB3ZSBhcmUganVzdCB1c2luZyB0aGUgZnV0ZXggaW4gb25lIHByb2Nlc3MuCisgICAgcmV0dXJuIHN5c19mdXRleChhZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIGN1cnJlbnQsIHRpbWUsIE5VTEwsIDApOworfQorCisvLyBUT0RPIGJldHRlciBuYW1lPworLyoqCisgKiBUaGUgV2FrZVVwIGNsYXNzIGlzIHVzZWQgdG8gc2VuZCBhIHdha2V1cCBzaWduYWwgdG8gb25lIG9yIG1vcmUgc2xlZXBpbmcgdGhyZWFkcy4KKyAqLworY2xhc3MgV2FrZVVwIHsKK3B1YmxpYzoKKyAgICBXYWtlVXAoKSA6IG1WYWx1ZSgwKSB7fQorICAgIGV4cGxpY2l0IFdha2VVcChpbnQzMl90IHZhbHVlKSA6IG1WYWx1ZSh2YWx1ZSkge30KKworICAgIC8qKgorICAgICAqIFdhaXQgdW50aWwgdGhlIGludGVybmFsIHZhbHVlIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHVzZXMgYSBmdXRleCwgd2hpY2ggaXMgc3ViamVjdCB0byBzcHVyaW91cyB3YWtlLXVwcy4KKyAgICAgKiBTbyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGVzaXJlZCBjb25kaXRpb24gaGFzIGJlZW4gbWV0LgorICAgICAqCisgICAgICogQHJldHVybiB6ZXJvIGlmIHRoZSB2YWx1ZSBjaGFuZ2VzIG9yIHZhcmlvdXMgbmVnYXRpdmUgZXJyb3JzIGluY2x1ZGluZworICAgICAqICAgIC1FVElNRURPVVQgaWYgYSB0aW1lb3V0IG9jY3VycywKKyAgICAgKiAgICBvciAtRUlOVFIgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwsCisgICAgICogICAgb3IgLUVBR0FJTiBvciAtRVdPVUxEQkxPQ0sgaWYgdGhlIGludGVybmFsIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgKi8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCB3YWl0KGludDMyX3QgdmFsdWUsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOworICAgICAgICBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKHRpbWVvdXROYW5vc2Vjb25kcywgJnRpbWUpOworICAgICAgICByZXR1cm4gZnV0ZXhfd2FpdCgmbVZhbHVlLCB2YWx1ZSwgJnRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB2YWx1ZSBhbmQgd2FrZSB1cCBhbnkgdGhyZWFkcyB0aGF0IG5lZWQgdG8gYmUgd29rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiB3YWl0ZXJzIHdva2VuIHVwCisgICAgICovCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgd2FrZSgpIHsKKyAgICAgICAgKyttVmFsdWU7CisgICAgICAgIHJldHVybiBmdXRleF93YWtlKCZtVmFsdWUsIElOVF9NQVgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB2YWx1ZSBhbmQgd2FrZSB1cCBhbnkgdGhyZWFkcyB0aGF0IG5lZWQgdG8gYmUgd29rZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiB3YWl0ZXJzIHdva2VuIHVwCisgICAgICovCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgd2FrZShpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIG1WYWx1ZS5zdG9yZSh2YWx1ZSk7CisgICAgICAgIHJldHVybiBmdXRleF93YWtlKCZtVmFsdWUsIElOVF9NQVgpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0KCkgeworICAgICAgICByZXR1cm4gbVZhbHVlLmxvYWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICBtVmFsdWU7Cit9OworCiAjZW5kaWYgLy8gQUFVRElPX0VYQU1QTEVfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCmluZGV4IGNjMGNiMzQuLjYwNmM0YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxzY2hlZC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAjaW5jbHVkZSAiU2luZUdlbmVyYXRvci5oIgogCkBAIC0zNSw2ICszNiwxMyBAQAogLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCisjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wIHsKKyAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgIGludDY0X3QgbmFub3NlY29uZHM7Cit9IFRpbWVzdGFtcDsKKwogLyoqCiAgKiBTaW1wbGUgd3JhcHBlciBmb3IgQUF1ZGlvIHRoYXQgb3BlbnMgYW4gb3V0cHV0IHN0cmVhbSBlaXRoZXIgaW4gY2FsbGJhY2sgb3IgYmxvY2tpbmcgd3JpdGUgbW9kZS4KICAqLwpAQCAtMjE5LDE4ICsyMjcsMjggQEAKICAgICBBQXVkaW9TdHJlYW0gICAgICAgICAgICAgKm1TdHJlYW0gPSBudWxscHRyOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgbVJlcXVlc3RlZFNoYXJpbmdNb2RlID0gU0hBUklOR19NT0RFOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgbVJlcXVlc3RlZFBlcmZvcm1hbmNlTW9kZSA9IFBFUkZPUk1BTkNFX01PREU7CisKIH07CiAKIHR5cGVkZWYgc3RydWN0IFNpbmVUaHJlYWRlZERhdGFfcyB7CisKICAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMTsKICAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMjsKKyAgICBUaW1lc3RhbXAgICAgICB0aW1lc3RhbXBzW01BWF9USU1FU1RBTVBTXTsKICAgICBpbnQ2NF90ICAgICAgICBmcmFtZXNUb3RhbCA9IDA7CiAgICAgaW50NjRfdCAgICAgICAgbmV4dEZyYW1lVG9HbGl0Y2ggPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKICAgICBpbnQzMl90ICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CiAgICAgaW50MzJfdCAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKLSAgICBpbnQgICAgICAgICAgICBzY2hlZHVsZXI7CisgICAgaW50MzJfdCAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCisKKyAgICBpbnQgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwogICAgIGJvb2wgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBib29sICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworCisgICAgQUF1ZGlvU2ltcGxlUGxheWVyIHNpbXBsZVBsYXllcjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgY2FsbGJhY2tDb3VudCA9IDA7CisgICAgV2FrZVVwICAgICAgICAgICAgIHdha2Vye0FBVURJT19PS307CisKIH0gU2luZVRocmVhZGVkRGF0YV90OwogCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgpAQCAtMjQ3LDYgKzI2NSw3IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogICAgIFNpbmVUaHJlYWRlZERhdGFfdCAqc2luZURhdGEgPSAoU2luZVRocmVhZGVkRGF0YV90ICopIHVzZXJEYXRhOworICAgIHNpbmVEYXRhLT5jYWxsYmFja0NvdW50Kys7CiAKICAgICBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOwogCkBAIC0yNjMsNiArMjgyLDE3IEBACiAgICAgICAgIHNpbmVEYXRhLT5zY2hlZHVsZXJDaGVja2VkID0gdHJ1ZTsKICAgICB9CiAKKyAgICBpZiAoc2luZURhdGEtPnRpbWVzdGFtcENvdW50IDwgTUFYX1RJTUVTVEFNUFMpIHsKKyAgICAgICAgVGltZXN0YW1wICp0aW1lc3RhbXAgPSAmc2luZURhdGEtPnRpbWVzdGFtcHNbc2luZURhdGEtPnRpbWVzdGFtcENvdW50XTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoc3RyZWFtLAorICAgICAgICAgICAgQ0xPQ0tfTU9OT1RPTklDLCAmdGltZXN0YW1wLT5wb3NpdGlvbiwgJnRpbWVzdGFtcC0+bmFub3NlY29uZHMpOworICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiAvLyB2YWxpZD8KKyAgICAgICAgICAgICAgICAoc2luZURhdGEtPnRpbWVzdGFtcENvdW50ID09IDAgfHwgLy8gZmlyc3Qgb25lPworICAgICAgICAgICAgICAgICh0aW1lc3RhbXAtPnBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+cG9zaXRpb24pKSkgeyAvLyBhZHZhbmNlZCBwb3NpdGlvbj8KKyAgICAgICAgICAgIHNpbmVEYXRhLT50aW1lc3RhbXBDb3VudCsrOyAvLyBrZWVwIHRoaXMgb25lCisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobnVtRnJhbWVzID4gc2luZURhdGEtPm1heE51bUZyYW1lcykgewogICAgICAgICBzaW5lRGF0YS0+bWF4TnVtRnJhbWVzID0gbnVtRnJhbWVzOwogICAgIH0KQEAgLTMwNCw5ICszMzQsMTYgQEAKIHZvaWQgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAogICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKQotewotICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZS4uLgorICAgIGlmICh1c2VyRGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBNeVBsYXllckVycm9yQ2FsbGJhY2tQcm9jIG5lZWRzIHVzZXJEYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBzaW5lRGF0YS0+d2FrZXIud2FrZShlcnJvcik7CisgICAgcHJpbnRmKCJFcnJvciBDYWxsYmFjaywgZXJyb3I6ICVkLCBmdXRleCB3YWtlIHJldHVybnMgJWRcbiIsIGVycm9yLCByZXQpOwogfQogCisKICNlbmRpZiAvL0FBVURJT19TSU1QTEVfUExBWUVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggNWVjYWMwNC4uMTM0NDI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgICAgaWYgKG1TdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOworICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTs7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODcsNyArMTg3LDcgQEAKIAogICAgIC8vIFdyaXRlIHplcm8gZGF0YSB0byBmaWxsIHVwIHRoZSBidWZmZXIgYW5kIHByZXZlbnQgdW5kZXJydW5zLgogICAgIGFhdWRpb19yZXN1bHRfdCBwcmltZSgpIHsKLSAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW0pOworICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7CiAgICAgICAgIGNvbnN0IGludCBudW1GcmFtZXMgPSAzMjsgLy8gYXJiaXRyYXJ5CiAgICAgICAgIGZsb2F0IHplcm9zW251bUZyYW1lcyAqIHNhbXBsZXNQZXJGcmFtZV07CiAgICAgICAgIG1lbXNldCh6ZXJvcywgMCwgc2l6ZW9mKHplcm9zKSk7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB9CiAgICAgUGVha1RyYWNrZXJEYXRhX3QgKmRhdGEgPSAoUGVha1RyYWNrZXJEYXRhX3QgKikgdXNlckRhdGE7CiAgICAgLy8gcHJpbnRmKCJNeUNhbGxiYWNrUHJvYygpOiBmcmFtZUNvdW50ID0gJWRcbiIsIG51bUZyYW1lcyk7Ci0gICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKHN0cmVhbSk7CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7CiAgICAgZmxvYXQgc2FtcGxlOwogICAgIC8vIFRoaXMgY29kZSBhc3N1bWUgbW9ubyBvciBzdGVyZW8uCiAgICAgc3dpdGNoIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCmluZGV4IDY0Yjc3MmQuLmE3NTU1ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaApAQCAtNTgsNiArNTgsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgc2V0QW1wbGl0dWRlKGRvdWJsZSBhbXBsaXR1ZGUpIHsKKyAgICAgICAgbUFtcGxpdHVkZSA9IGFtcGxpdHVkZTsKKyAgICB9CisgICAgZG91YmxlIGdldEFtcGxpdHVkZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbXBsaXR1ZGU7CisgICAgfQorCiBwcml2YXRlOgogICAgIHZvaWQgYWR2YW5jZVBoYXNlKCkgewogICAgICAgICBtUGhhc2UgKz0gbVBoYXNlSW5jcmVtZW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCmluZGV4IDg3ZmI0MGIuLjY3N2ZiNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuMVxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuMlxuIiwgYXJndlswXSk7CiAKICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IGI1NjAyZTkuLjRmOWNkZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAvLyBQbGF5IHNpbmUgd2F2ZXMgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrLgorLy8gSWYgYSBkaXNjb25uZWN0aW9uIG9jY3VycyB0aGVuIHJlb3BlbiB0aGUgc3RyZWFtIG9uIHRoZSBuZXcgZGV2aWNlLgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0yMiwzMyArMjMsMzIgQEAKICNpbmNsdWRlIDxzY2hlZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgiCiAKLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKKy8qKgorICogT3BlbiBzdHJlYW0sIHBsYXkgc29tZSBzaW5lIHdhdmVzLCB0aGVuIGNsb3NlIHRoZSBzdHJlYW0uCisgKgorICogQHBhcmFtIGFyZ1BhcnNlcgorICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlcikKIHsKLSAgICBBQXVkaW9BcmdzUGFyc2VyICAgYXJnUGFyc2VyOwotICAgIEFBdWRpb1NpbXBsZVBsYXllciBwbGF5ZXI7CiAgICAgU2luZVRocmVhZGVkRGF0YV90IG15RGF0YTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwotICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZTsKKyAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgJnBsYXllciA9IG15RGF0YS5zaW1wbGVQbGF5ZXI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCAgICAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zOwogCi0gICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawotICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCi0gICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7Ci0KLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYwLjEuMlxuIiwgYXJndlswXSk7Ci0KKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJ1biBjb21wbGV0ZSB0ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOworICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKICAgICBteURhdGEuZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsgLy8gc2V0IHRydWUgdG8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKIAotICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQotCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLCAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNTgsMTMgKzU4LDE5IEBACiAKICAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ocGxheWVyLmdldFN0cmVhbSgpKTsKIAotICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOwotICAgIG15RGF0YS5zaW5lT3NjMS5zZXR1cCg0NDAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgbXlEYXRhLnNpbmVPc2MxLnNldFN3ZWVwKDMwMC4wLCA2MDAuMCwgNS4wKTsKLSAgICBteURhdGEuc2luZU9zYzIuc2V0dXAoNjYwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgIG15RGF0YS5zaW5lT3NjMi5zZXRTd2VlcCgzNTAuMCwgOTAwLjAsIDcuMCk7CisgICAgLy8gU2V0dXAgc2luZSB3YXZlIGdlbmVyYXRvcnMuCisgICAgeworICAgICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0dXAoNDQwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0U3dlZXAoMzAwLjAsIDYwMC4wLCA1LjApOworICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0QW1wbGl0dWRlKDAuMik7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXR1cCg2NjAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRTd2VlcCgzNTAuMCwgOTAwLjAsIDcuMCk7CisgICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRBbXBsaXR1ZGUoMC4yKTsKKyAgICB9CiAKICNpZiAwCisgICAgLy8gIHdyaXRlcyBub3QgYWxsb3dlZCBmb3IgY2FsbGJhY2sgc3RyZWFtcwogICAgIHJlc3VsdCA9IHBsYXllci5wcmltZSgpOyAvLyBGSVhNRSBjcmFzaGVzIEF1ZGlvVHJhY2suY3BwCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIHBsYXllci5wcmltZSgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwpAQCAtNzgsMzQgKzg0LDMyIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCisgICAgLy8gUGxheSBhIHNpbmUgd2F2ZSBpbiB0aGUgYmFja2dyb3VuZC4KICAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHBsYXlzIGluIGEgY2FsbGJhY2sgdGhyZWFkLlxuIiwKICAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpKTsKKyAgICBzdGFydGVkQXROYW5vcyA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CiAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOyBzZWNvbmQrKykKICAgICB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXF1ZXN0ID0geyAudHZfc2VjID0gMSwgLnR2X25zZWMgPSAwIH07Ci0gICAgICAgICh2b2lkKSBjbG9ja19uYW5vc2xlZXAoQ0xPQ0tfTU9OT1RPTklDLCAwIC8qZmxhZ3MqLywgJnJlcXVlc3QsIE5VTEwgLypyZW1haW4qLyk7Ci0KLSAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlOwotICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKHBsYXllci5nZXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUuIFdha2UgdXAgZWFybHkgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIGEgRElTQ09OTkVDVC4KKyAgICAgICAgbG9uZyByZXQgPSBteURhdGEud2FrZXIud2FpdChBQVVESU9fT0ssIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICBpbnQ2NF90IG1pbGxpcyA9IChnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRlZEF0TmFub3MpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7CisgICAgICAgIHByaW50Zigid2FpdCgpIHJldHVybnMgJWxkLCBhYXVkaW9fcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCisgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlZCwgZnJhbWVzV3JpdHRlbiA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICByZXQsIHJlc3VsdCwgKGludCkgbWlsbGlzLAorICAgICAgICAgICAgICAgc2Vjb25kLAorICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKKyAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyAmJiBzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKLSAgICAgICAgICAgIHByaW50ZigiU3RyZWFtIHN0YXRlIGlzICVkICVzIVxuIiwgc3RhdGUsIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwcmludGYoImZyYW1lc1dyaXR0ZW4gPSAlZCwgdW5kZXJydW5zID0gJWRcbiIsCi0gICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpCi0gICAgICAgICk7CiAgICAgfQotICAgIHByaW50ZigiV29rZSB1cCBub3cuXG4iKTsKKyAgICBwcmludGYoIkFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogCi0gICAgcHJpbnRmKCJjYWxsIHN0b3AoKVxuIik7CisgICAgcHJpbnRmKCJjYWxsIHN0b3AoKSBjYWxsYmFjayAjID0gJWRcbiIsIG15RGF0YS5jYWxsYmFja0NvdW50KTsKICAgICByZXN1bHQgPSBwbGF5ZXIuc3RvcCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xMTYsNiArMTIwLDE4IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteURhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgeworICAgICAgICBUaW1lc3RhbXAgKnRpbWVzdGFtcCA9ICZteURhdGEudGltZXN0YW1wc1tpXTsKKyAgICAgICAgYm9vbCByZXRybyA9IChpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICgodGltZXN0YW1wLT5wb3NpdGlvbiA8ICh0aW1lc3RhbXAgLSAxKS0+cG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICgodGltZXN0YW1wLT5uYW5vc2Vjb25kcyA8ICh0aW1lc3RhbXAgLSAxKS0+bmFub3NlY29uZHMpKSkpOworICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlID0gcmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIjsKKyAgICAgICAgcHJpbnRmKCJUaW1lc3RhbXAgJTNkIDogJThsbGQsICU4bGxkICVzXG4iLCBpLAorICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+bmFub3NlY29uZHMsCisgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICB9CisKICAgICBpZiAobXlEYXRhLnNjaGVkdWxlckNoZWNrZWQpIHsKICAgICAgICAgcHJpbnRmKCJzY2hlZHVsZXIgPSAweCUwOHgsIFNDSEVEX0ZJRk8gPSAweCUwOFhcbiIsCiAgICAgICAgICAgICAgICBteURhdGEuc2NoZWR1bGVyLApAQCAtMTI2LDEwICsxNDIsMjggQEAKICAgICBwcmludGYoIm1heCBudW1GcmFtZXMgPSAlOGRcbiIsIChpbnQpIG15RGF0YS5tYXhOdW1GcmFtZXMpOwogCiAgICAgcHJpbnRmKCJTVUNDRVNTXG4iKTsKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogZXJyb3I6CiAgICAgcGxheWVyLmNsb3NlKCk7Ci0gICAgcHJpbnRmKCJleGl0aW5nIC0gQUF1ZGlvIHJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7Ci0gICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICByZXR1cm4gZGlzY29ubmVjdGVkID8gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCA6IHJlc3VsdDsKIH0KIAoraW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgIEFBdWRpb0FyZ3NQYXJzZXIgICBhcmdQYXJzZXI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdDsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjJcbiIsIGFyZ3ZbMF0pOworCisgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KKyAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyKSkgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICByZXR1cm4gKHJlc3VsdCkgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggZTE4ODZhYy4uM2MyMzczNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMjM0LDEwICsyMzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KTsKIAogLyoqCisgKiBJZGVudGljYWwgdG8gQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKS4KICAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoKQorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBmcmFtZS4KICAqLwotLy8gVE9ETyByZW1vdmUgYXMgc29vbiBhcyB0aGUgTkRLIGFuZCBPUyBhcmUgaW4gc3luYywgYmVmb3JlIFJDMQogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpOwogCkBAIC03MjksMTEgKzczMCwxMCBAQAogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCiAvKioKLSAqIFRoZSBzYW1wbGVzUGVyRnJhbWUgaXMgYWxzbyBrbm93biBhcyBjaGFubmVsQ291bnQuCisgKiBJZGVudGljYWwgdG8gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudCgpLgogICoKLSAqIEBkZXByZWNhdGVkIHVzZSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGFjdHVhbCBzYW1wbGVzIHBlciBmcmFtZQorICogQHJldHVybiBhY3R1YWwgbnVtYmVyIG9mIHNhbXBsZXMgZnJhbWUKICAqLwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOwogCkBAIC04MTAsNyArODEwLDcgQEAKICAqIFRoZSBwb3NpdGlvbiBhbmQgdGltZSBwYXNzZWQgYmFjayBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcGFyYW0gY2xvY2tpZCBBQVVESU9fQ0xPQ0tfTU9OT1RPTklDIG9yIEFBVURJT19DTE9DS19CT09UVElNRQorICogQHBhcmFtIGNsb2NraWQgQ0xPQ0tfTU9OT1RPTklDIG9yIENMT0NLX0JPT1RUSU1FCiAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgcG9zaXRpb24KICAqIEBwYXJhbSB0aW1lTmFub3NlY29uZHMgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHRpbWUKICAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tawppbmRleCBjZmNmMjdhLi42ODYxMjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLm1rCkBAIC0zNiw3ICszNiw2IEBACiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBcCiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBcCiAgICAgbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIFwKLSAgICB1dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwIFwKICAgICB1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgXAogICAgIHV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIFwKICAgICB1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIFwKQEAgLTk1LDcgKzk0LDYgQEAKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIFwKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIFwKICAgICBsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgXAotICAgIHV0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAgXAogICAgIHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBcCiAgICAgdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAgXAogICAgIHV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCBhMjY4ZTQ5Li4wN2VlMmRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtNDUsNiArNDUsNyBAQAogdXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7CiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OndwOwogCkBAIC01MiwxNSArNTMsMTkgQEAKIAogQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKEFBdWRpb0JpbmRlckNsaWVudCk7CiAKKy8vIElmIHdlIGRvbid0IGtlZXAgYSBzdHJvbmcgcG9pbnRlciBoZXJlIHRoZW4gdGhpcyBzaW5nbGV0b24gY2FuIGdldCBkZWxldGVkIQorYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBnS2VlcEJpbmRlckNsaWVudDsKKwogQUF1ZGlvQmluZGVyQ2xpZW50OjpBQXVkaW9CaW5kZXJDbGllbnQoKQogICAgICAgICA6IEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKQogICAgICAgICAsIFNpbmdsZXRvbjxBQXVkaW9CaW5kZXJDbGllbnQ+KCkgewotCisgICAgZ0tlZXBCaW5kZXJDbGllbnQgPSB0aGlzOyAvLyBzbyB0aGlzIHNpbmdsZXRvbiB3b24ndCBnZXQgZGVsZXRlZAogICAgIG1BQXVkaW9DbGllbnQgPSBuZXcgQUF1ZGlvQ2xpZW50KHRoaXMpOwotICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKSBjcmVhdGVkIG1BQXVkaW9DbGllbnQgPSAlcCIsIG1BQXVkaW9DbGllbnQuZ2V0KCkpOworICAgIEFMT0dWKCJBQXVkaW9CaW5kZXJDbGllbnQoKSB0aGlzID0gJXAsIGNyZWF0ZWQgbUFBdWRpb0NsaWVudCA9ICVwIiwgdGhpcywgbUFBdWRpb0NsaWVudC5nZXQoKSk7CiB9CiAKIEFBdWRpb0JpbmRlckNsaWVudDo6fkFBdWRpb0JpbmRlckNsaWVudCgpIHsKKyAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCk6On5BQXVkaW9CaW5kZXJDbGllbnQoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7CiAgICAgaWYgKG1BQXVkaW9TZXJ2aWNlICE9IDApIHsKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUFBdWRpb1NlcnZpY2UpLT51bmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOwpAQCAtNzUsMTkgKzgwLDE5IEBACiAgICAgYm9vbCBuZWVkVG9SZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGlmIChtQUF1ZGlvU2VydmljZSA9PSAwKSB7CisgICAgICAgIGlmIChtQUF1ZGlvU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCB0aW1lcyB0byBnZXQgdGhlIHNlcnZpY2UuCiAgICAgICAgICAgICBpbnQgcmV0cmllcyA9IDQ7CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoQUFVRElPX1NFUlZJQ0VfTkFNRSkpOyAvLyBUaGlzIHdpbGwgd2FpdCBhIHdoaWxlLgotICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChiaW5kZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChyZXRyaWVzLS0gPiAwKTsKIAotICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYmluZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAvLyBBc2sgZm9yIG5vdGlmaWNhdGlvbiBpZiB0aGUgc2VydmljZSBkaWVzLgogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGJpbmRlci0+bGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7CiAgICAgICAgICAgICAgICAgLy8gVE9ETyByZXZpZXcgd2hhdCB3ZSBzaG91bGQgZG8gaWYgdGhpcyBmYWlscwpAQCAtOTgsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICBtQUF1ZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBQXVkaW9TZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICAgICAgICAgIG5lZWRUb1JlZ2lzdGVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FsbGJhY2tzIGNhbiBiZSByZWNlaXZlZCBieSBtQUF1ZGlvQ2xpZW50Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0JpbmRlckNsaWVudCBjb3VsZCBub3QgY29ubmVjdCB0byAlcyIsIEFBVURJT19TRVJWSUNFX05BTUUpOwogICAgICAgICAgICAgfQpAQCAtMTA2LDcgKzExMSw3IEBACiAgICAgICAgIGFhdWRpb1NlcnZpY2UgPSBtQUF1ZGlvU2VydmljZTsKICAgICB9CiAgICAgLy8gRG8gdGhpcyBvdXRzaWRlIHRoZSBtdXRleCBsb2NrLgotICAgIGlmIChuZWVkVG9SZWdpc3RlciAmJiBhYXVkaW9TZXJ2aWNlICE9IDApIHsgLy8gbmV3IGNsaWVudD8KKyAgICBpZiAobmVlZFRvUmVnaXN0ZXIgJiYgYWF1ZGlvU2VydmljZS5nZXQoKSAhPSBudWxscHRyKSB7IC8vIG5ldyBjbGllbnQ/CiAgICAgICAgIGFhdWRpb1NlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1BQXVkaW9DbGllbnQpOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvU2VydmljZTsKQEAgLTExNyw3ICsxMjIsNiBAQAogICAgIG1BQXVkaW9TZXJ2aWNlLmNsZWFyKCk7IC8vIGZvcmNlIGEgcmVjb25uZWN0CiB9CiAKLQogLyoqCiAqIEBwYXJhbSByZXF1ZXN0IGluZm8gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtCiAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjcmVhdGVkIHN0cmVhbQpAQCAtMTI4LDE0ICsxMzIsMTIgQEAKICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwotICAgICAgICB9CisgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKIAogICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9CaW5kZXJDbGllbnQ6IGxvc3QgY29ubmVjdGlvbiB0byBBQXVkaW9TZXJ2aWNlLiIpOworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0JpbmRlckNsaWVudDo6b3BlblN0cmVhbSBsb3N0IGNvbm5lY3Rpb24gdG8gQUF1ZGlvU2VydmljZS4iKTsKICAgICAgICAgICAgIGRyb3BBQXVkaW9TZXJ2aWNlKCk7IC8vIGZvcmNlIGEgcmVjb25uZWN0CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0NSw4ICsxNDcsOCBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpjbG9zZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmNsb3NlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTE1NSwzMiArMTU3LDMyIEBACiAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwgcGFyY2VsYWJsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnN0YXJ0U3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+c3RhcnRTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5wYXVzZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+c3RvcFN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPmZsdXNoU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTE5MCw4ICsxOTIsOCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2ROYW5vc2Vjb25kcyk7CkBAIC0xOTksOCArMjAxLDggQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZElkKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaAppbmRleCA4OWFlODVjLi5mOWRhOGI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCkBAIC0xMTgsMTMgKzExOCwxMyBAQAogICAgIHsKICAgICBwdWJsaWM6CiAgICAgICAgIEFBdWRpb0NsaWVudChhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IGFhdWRpb0JpbmRlckNsaWVudCkKLSAgICAgICAgICAgIDogbUJpbmRlckNsaWVudChhYXVkaW9CaW5kZXJDbGllbnQpIHsKKyAgICAgICAgICAgICAgICA6IG1CaW5kZXJDbGllbnQoYWF1ZGlvQmluZGVyQ2xpZW50KSB7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpbXBsZW1lbnQgRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3QgYW5kcm9pZDo6d3A8YW5kcm9pZDo6SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgICAgICAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5kcm9wQUF1ZGlvU2VydmljZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1coIkFBdWRpbyBzZXJ2aWNlIGJpbmRlckRpZWQoKSEiKTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAvLyBpbXBsZW1lbnQgQm5BQXVkaW9DbGllbnQKICAgICAgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgewogICAgICAgICAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5vblN0cmVhbUNoYW5nZShoYW5kbGUsIG9wY29kZSwgdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDEsMTAgKzE0MSwxMSBAQAogICAgICAgICBhbmRyb2lkOjp3cDxBQXVkaW9CaW5kZXJDbGllbnQ+IG1CaW5kZXJDbGllbnQ7CiAgICAgfTsKIAorcHJpdmF0ZToKIAotICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlPiAgbUFBdWRpb1NlcnZpY2U7Ci0gICAgYW5kcm9pZDo6c3A8QUF1ZGlvQ2xpZW50PiAgICBtQUF1ZGlvQ2xpZW50OworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gICAgICAgbUFBdWRpb0NsaWVudDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmgKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyYW1ibGVyLmFpZGwKcmVuYW1lIHRvIG1lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9Db21tb24uaAppbmRleCBlNzg5MjQ0Li5lM2U5ZTgyIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JhbWJsZXIuYWlkbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmgKQEAgLTE0LDcgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7CisjaWZuZGVmIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICiAKLS8qKiBAaGlkZSAqLwotcGFyY2VsYWJsZSBNZWRpYURlc2NyYW1ibGVyLkRlc2NyYW1ibGVJbmZvIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qCisgKiBJbnRlcm5hbCBoZWFkZXIgdGhhdCBpcyBjb21tb24gdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlci4KKyAqCisgKi8KK25hbWVzcGFjZSBhYXVkaW8geworCit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2hhbmRsZV90OworCit9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KKworI2VuZGlmIC8vIEFORFJPSURfQUFVRElPX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCmluZGV4IGI0Mzc3ZmIuLjU0ZTgwMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCkBAIC0yOCw3ICsyOCw2IEBACiAvLyBVc2VkIHRvIHNlbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEhBTCB0byB0aGUgY2xpZW50Lgogc3RydWN0IEFBdWRpb01lc3NhZ2VUaW1lc3RhbXAgewogICAgIGludDY0X3QgcG9zaXRpb247ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHRyYW5zZmVycmVkIHNvIGZhcgotICAgIGludDY0X3QgZGV2aWNlT2Zmc2V0OyAvLyBhZGQgdG8gY2xpZW50IHBvc2l0aW9uIHRvIGdldCBkZXZpY2UgcG9zaXRpb24KICAgICBpbnQ2NF90IHRpbWVzdGFtcDsgICAgLy8gdGltZSB3aGVuIHRoYXQgcG9zaXRpb24gd2FzIHJlYWNoZWQKIH07CiAKQEAgLTUxLDcgKzUwLDggQEAKIHR5cGVkZWYgc3RydWN0IEFBdWRpb1NlcnZpY2VNZXNzYWdlX3MgewogICAgIGVudW0gY2xhc3MgY29kZSA6IHVpbnQzMl90IHsKICAgICAgICAgTk9USElORywKLSAgICAgICAgVElNRVNUQU1QLAorICAgICAgICBUSU1FU1RBTVBfU0VSVklDRSwgLy8gd2hlbiBmcmFtZSBpcyByZWFkIG9yIHdyaXR0ZW4gYnkgdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudAorICAgICAgICBUSU1FU1RBTVBfSEFSRFdBUkUsIC8vIHdoZW4gZnJhbWUgaXMgYXQgREFDIG9yIEFEQwogICAgICAgICBFVkVOVCwKICAgICB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggZTc2MzkzNC4uMTUzZmNlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtNDYsNiArNDYsOCBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldERpcmVjdGlvbigpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTczLDkgKzc1LDEyIEBACiAgICAgc2V0Rm9ybWF0KHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0QnVmZmVyQ2FwYWNpdHkodmFsdWUpOwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgogICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCmluZGV4IGFiZGNmNWIuLjEyMDBhYjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKQEAgLTQ2LDkgKzQ2LDYgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1Vc2VySWQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1EaXJlY3Rpb24pOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogCkBAIC03MSwxMCArNjgsNiBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgbVVzZXJJZCA9ICh1aWRfdCkgdGVtcDsKIAotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0ZW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIG1EaXJlY3Rpb24gPSAoYWF1ZGlvX2RpcmVjdGlvbl90KSB0ZW1wOwotCiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKIApAQCAtOTgsNyArOTEsNiBAQAogdm9pZCBBQXVkaW9TdHJlYW1SZXF1ZXN0OjpkdW1wKCkgY29uc3QgewogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1Vc2VySWQgICAgPSAlZCIsIG1Vc2VySWQpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1Qcm9jZXNzSWQgPSAlZCIsIG1Qcm9jZXNzSWQpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1EaXJlY3Rpb24gPSAlZCIsIG1EaXJlY3Rpb24pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSAlZCIsIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1SZXF1ZXN0IG1JblNlcnZpY2UgPSAlZCIsIG1JblNlcnZpY2UpOwogICAgIG1Db25maWd1cmF0aW9uLmR1bXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oCmluZGV4IGIwZmE5NmEuLjQ5MmY2OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaApAQCAtNTIsMTQgKzUyLDYgQEAKICAgICAgICAgbVByb2Nlc3NJZCA9IHByb2Nlc3NJZDsKICAgICB9CiAKLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERpcmVjdGlvbihhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7Ci0gICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0gICAgfQotCiAgICAgYm9vbCBpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQ7CiAgICAgfQpAQCAtOTQsOSArODYsOCBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAgbUNvbmZpZ3VyYXRpb247Ci0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgbVVzZXJJZDsKLSAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc0lkOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb247CisgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgbVVzZXJJZCA9ICh1aWRfdCkgLTE7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NJZCA9IChwaWRfdCkgLTE7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsgLy8gU3RyZWFtIG9wZW5lZCBieSBBQXVkaW9zZXJ2aWNlCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgKaW5kZXggMjFjYzMzYi4uZjIxZmQ5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKLSNpbmNsdWRlICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvQ2xpZW50KTsKIAotICAgIHZpcnR1YWwgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGludDMyX3Qgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKaW5kZXggMzBiM2VhZC4uNmJkYjgyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgKQEAgLTI0LDEyICsyNCwxMiBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCi0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTEsNyArNTEsNyBAQAogICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjcmVhdGVkIHN0cmVhbQogICAgICAqIEByZXR1cm4gaGFuZGxlIHRvIHRoZSBzdHJlYW0gb3IgYSBuZWdhdGl2ZSBlcnJvcgogICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgIHZpcnR1YWwgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSA9IDA7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpID0gMDsKQEAgLTg5LDExICs4OSwxMSBAQAogICAgIC8qKgogICAgICAqIE1hbmFnZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBhcyBhIGxvdyBsYXRlbmN5IGF1ZGlvIHRocmVhZC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IDZlYzI4NWYuLjYwNGVlZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0zMiwxNCArMzIsMTcgQEAKICNkZWZpbmUgUklESUNVTE9VU0xZX0xBUkdFX0ZSQU1FX1NJWkUgICAgICAgIDQwOTYKIAogQXVkaW9FbmRwb2ludDo6QXVkaW9FbmRwb2ludCgpCi0gICAgOiBtRnJlZVJ1bm5pbmcoZmFsc2UpCisgICAgOiBtVXBDb21tYW5kUXVldWUobnVsbHB0cikKKyAgICAsIG1EYXRhUXVldWUobnVsbHB0cikKKyAgICAsIG1GcmVlUnVubmluZyhmYWxzZSkKICAgICAsIG1EYXRhUmVhZENvdW50ZXIoMCkKICAgICAsIG1EYXRhV3JpdGVDb3VudGVyKDApCiB7CiB9CiAKLUF1ZGlvRW5kcG9pbnQ6On5BdWRpb0VuZHBvaW50KCkKLXsKK0F1ZGlvRW5kcG9pbnQ6On5BdWRpb0VuZHBvaW50KCkgeworICAgIGRlbGV0ZSBtRGF0YVF1ZXVlOworICAgIGRlbGV0ZSBtVXBDb21tYW5kUXVldWU7CiB9CiAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgQXVkaW9FbmRwb2ludF92YWxpZGF0ZVF1ZXVlRGVzY3JpcHRvcihjb25zdCBjaGFyICp0eXBlLApAQCAtMTE4LDI0ICsxMjEsMjggQEAKIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9FbmRwb2ludF92YWxpZGF0ZURlc2NyaXB0b3IocEVuZHBvaW50RGVzY3JpcHRvcik7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IgcmV0dXJuZWQgJWQgJXMiLAotICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gdXAgbWVzc2FnZSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcjsKICAgICBpZihkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lICE9IHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSkpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQ6OmNvbmZpZ3VyZSgpIGJ5dGVzUGVyRnJhbWUgIT0gc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSA9ICVkIiwKKyAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgYnl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpID0gJWQiLAogICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5ieXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKICAgICBpZihkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IoKSBOVUxMIGNvdW50ZXIgYWRkcmVzcyIpOworICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBOVUxMIGNvdW50ZXIgYWRkcmVzcyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogCisgICAgLy8gUHJldmVudCBtZW1vcnkgbGVhayBhbmQgcmV1c2UuCisgICAgaWYobVVwQ29tbWFuZFF1ZXVlICE9IG51bGxwdHIgfHwgbURhdGFRdWV1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGVuZHBvaW50IGFscmVhZHkgdXNlZCIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKwogICAgIG1VcENvbW1hbmRRdWV1ZSA9IG5ldyBGaWZvQnVmZmVyKAogICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSwKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNhcGFjaXR5SW5GcmFtZXMsCkBAIC0xNDYsOCArMTUzLDggQEAKIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gZGF0YSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGRlc2NyaXB0b3IgPSAmcEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvcjsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludDo6Y29uZmlndXJlKCkgZGF0YSBmcmFtZXNQZXJCdXJzdCA9ICVkIiwgZGVzY3JpcHRvci0+ZnJhbWVzUGVyQnVyc3QpOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50Ojpjb25maWd1cmUoKSBkYXRhIHJlYWRDb3VudGVyQWRkcmVzcyA9ICVwIiwKKyAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBkYXRhIGZyYW1lc1BlckJ1cnN0ID0gJWQiLCBkZXNjcmlwdG9yLT5mcmFtZXNQZXJCdXJzdCk7CisgICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCiAgICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzKTsKIAogICAgIC8vIEFuIGV4YW1wbGUgb2YgZnJlZSBydW5uaW5nIGlzIHdoZW4gdGhlIG90aGVyIHNpZGUgaXMgcmVhZCBvciB3cml0dGVuIGJ5IGhhcmR3YXJlIERNQQpAQCAtMTU2LDcgKzE2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzIC8vIHJlYWQgYnkgb3RoZXIgc2lkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQogICAgIG1GcmVlUnVubmluZyA9IChyZW1vdGVDb3VudGVyID09IG51bGxwdHIpOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50Ojpjb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKKyAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKIAogICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZtRGF0YVJlYWRDb3VudGVyCkBAIC0yNTQsMyArMjYxLDcgQEAKICAgICBBTE9HRCgiQXVkaW9FbmRwb2ludDogZGF0YSByZWFkQ291bnRlciAgPSAlbGxkIiwgKGxvbmcgbG9uZykgbURhdGFRdWV1ZS0+Z2V0UmVhZENvdW50ZXIoKSk7CiAgICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnQ6IGRhdGEgd3JpdGVDb3VudGVyID0gJWxsZCIsIChsb25nIGxvbmcpIG1EYXRhUXVldWUtPmdldFdyaXRlQ291bnRlcigpKTsKIH0KKwordm9pZCBBdWRpb0VuZHBvaW50OjplcmFzZURhdGFNZW1vcnkoKSB7CisgICAgbURhdGFRdWV1ZS0+ZXJhc2VNZW1vcnkoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAppbmRleCA4MWE0ZjdiLi5mNWI2N2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCkBAIC04Niw2ICs4NiwxMSBAQAogCiAgICAgaW50MzJfdCBnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBXcml0ZSB6ZXJvcyB0byB0aGUgZGF0YSBxdWV1ZSBtZW1vcnkuCisgICAgICovCisgICAgdm9pZCBlcmFzZURhdGFNZW1vcnkoKTsKKwogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA0YzdkMGY3Li4yZmRiZmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCkBAIC01NSw3ICs1NCw3IEBACiAvLyBXYWl0IGF0IGxlYXN0IHRoaXMgbWFueSB0aW1lcyBsb25nZXIgdGhhbiB0aGUgb3BlcmF0aW9uIHNob3VsZCB0YWtlLgogI2RlZmluZSBNSU5fVElNRU9VVF9PUEVSQVRJT05TICAgIDQKIAotI2RlZmluZSBMT0dfVElNRVNUQU1QUyAgIDAKKyNkZWZpbmUgTE9HX1RJTUVTVEFNUFMgICAgICAgICAgICAwCiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OkF1ZGlvU3RyZWFtSW50ZXJuYWwoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsIGJvb2wgaW5TZXJ2aWNlKQogICAgICAgICA6IEF1ZGlvU3RyZWFtKCkKQEAgLTYzLDkgKzYyLDkgQEAKICAgICAgICAgLCBtQXVkaW9FbmRwb2ludCgpCiAgICAgICAgICwgbVNlcnZpY2VTdHJlYW1IYW5kbGUoQUFVRElPX0hBTkRMRV9JTlZBTElEKQogICAgICAgICAsIG1GcmFtZXNQZXJCdXJzdCgxNikKLSAgICAgICAgLCBtU3RyZWFtVm9sdW1lKDEuMGYpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKKyAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKICAgICAgICAgLCBtV2FrZXVwRGVsYXlOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRXYWtldXBEZWxheU1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgLCBtTWluaW11bVNsZWVwTmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0TWluaW11bVNsZWVwTWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICB7CkBAIC03OSw5ICs3OCwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGludDMyX3QgY2FwYWNpdHk7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwotICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25PdXRwdXQ7CiAKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogYWxyZWFkeSBvcGVuISBzdGF0ZSA9ICVkIiwgZ2V0U3RhdGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHRvIHRoZSBzdHJlYW0uCiAgICAgcmVzdWx0ID0gQXVkaW9TdHJlYW06Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk3LDEwMyArMTAzLDEwOCBAQAogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICByZXF1ZXN0LnNldFVzZXJJZChnZXR1aWQoKSk7CiAgICAgcmVxdWVzdC5zZXRQcm9jZXNzSWQoZ2V0cGlkKCkpOwotICAgIHJlcXVlc3Quc2V0RGlyZWN0aW9uKGdldERpcmVjdGlvbigpKTsKICAgICByZXF1ZXN0LnNldFNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZChpc1NoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCgpKTsKICAgICByZXF1ZXN0LnNldEluU2VydmljZShtSW5TZXJ2aWNlKTsKIAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGdldERldmljZUlkKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbihnZXREaXJlY3Rpb24oKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoZ2V0U2hhcmluZ01vZGUoKSk7CiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRCdWZmZXJDYXBhY2l0eShidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCi0gICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pOworICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7CiAgICAgICAgIHJlc3VsdCA9IG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbC5vcGVuKCk6IG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gY29uZmlndXJhdGlvbi52YWxpZGF0ZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgotICAgICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICBzZXREZXZpY2VJZChjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOwotICAgICAgICBzZXRTaGFyaW5nTW9kZShjb25maWd1cmF0aW9uLmdldFNoYXJpbmdNb2RlKCkpOwotCi0gICAgICAgIC8vIFNhdmUgZGV2aWNlIGZvcm1hdCBzbyB3ZSBjYW4gZG8gZm9ybWF0IGNvbnZlcnNpb24gYW5kIHZvbHVtZSBzY2FsaW5nIHRvZ2V0aGVyLgotICAgICAgICBtRGV2aWNlRm9ybWF0ID0gY29uZmlndXJhdGlvbi5nZXRGb3JtYXQoKTsKLQotICAgICAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5nZXRTdHJlYW1EZXNjcmlwdGlvbihtU2VydmljZVN0cmVhbUhhbmRsZSwgbUVuZFBvaW50UGFyY2VsYWJsZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVzb2x2ZSBwYXJjZWxhYmxlIGludG8gYSBkZXNjcmlwdG9yCi0gICAgICAgIHJlc3VsdCA9IG1FbmRQb2ludFBhcmNlbGFibGUucmVzb2x2ZSgmbUVuZHBvaW50RGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIGVuZHBvaW50IGJhc2VkIG9uIGRlc2NyaXB0b3IuCi0gICAgICAgIG1BdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgmbUVuZHBvaW50RGVzY3JpcHRvciwgZ2V0RGlyZWN0aW9uKCkpOwotCi0gICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzOwotCi0gICAgICAgIC8vIFZhbGlkYXRlIHJlc3VsdCBmcm9tIHNlcnZlci4KLSAgICAgICAgaWYgKG1GcmFtZXNQZXJCdXJzdCA8IDE2IHx8IG1GcmFtZXNQZXJCdXJzdCA+IDE2ICogMTAyNCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpvcGVuKCk6IGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYXBhY2l0eSA8IG1GcmFtZXNQZXJCdXJzdCB8fCBjYXBhY2l0eSA+IDMyICogMTAyNCkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpvcGVuKCk6IGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgY2FwYWNpdHkpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KG1GcmFtZXNQZXJCdXJzdCk7Ci0KLSAgICAgICAgaWYgKGdldERhdGFDYWxsYmFja1Byb2MoKSkgewotICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUludGVyZmFjZS5jbG9zZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKLSAgICAgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwotICAgICAgICAvLyBvbmx5IGNvbm5lY3QgdG8gQXVkaW9NYW5hZ2VyIGlmIHRoaXMgaXMgYSBwbGF5YmFjayBzdHJlYW0gcnVubmluZyBpbiBjbGllbnQgcHJvY2VzcwotICAgICAgICBpZiAoIW1JblNlcnZpY2UgJiYgZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIGluaXQoYW5kcm9pZDo6UExBWUVSX1RZUEVfQUFVRElPLCBBVURJT19VU0FHRV9NRURJQSk7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogb3BlblN0cmVhbSgpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICByZXN1bHQgPSBjb25maWd1cmF0aW9uT3V0cHV0LnZhbGlkYXRlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLy8gU2F2ZSByZXN1bHRzIG9mIHRoZSBvcGVuLgorICAgIHNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVSYXRlKCkpOworICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICBzZXREZXZpY2VJZChjb25maWd1cmF0aW9uT3V0cHV0LmdldERldmljZUlkKCkpOworICAgIHNldFNoYXJpbmdNb2RlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2hhcmluZ01vZGUoKSk7CisKKyAgICAvLyBTYXZlIGRldmljZSBmb3JtYXQgc28gd2UgY2FuIGRvIGZvcm1hdCBjb252ZXJzaW9uIGFuZCB2b2x1bWUgc2NhbGluZyB0b2dldGhlci4KKyAgICBtRGV2aWNlRm9ybWF0ID0gY29uZmlndXJhdGlvbk91dHB1dC5nZXRGb3JtYXQoKTsKKworICAgIHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLmdldFN0cmVhbURlc2NyaXB0aW9uKG1TZXJ2aWNlU3RyZWFtSGFuZGxlLCBtRW5kUG9pbnRQYXJjZWxhYmxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIFJlc29sdmUgcGFyY2VsYWJsZSBpbnRvIGEgZGVzY3JpcHRvci4KKyAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLnJlc29sdmUoJm1FbmRwb2ludERlc2NyaXB0b3IpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIGVuZHBvaW50IGJhc2VkIG9uIGRlc2NyaXB0b3IuCisgICAgcmVzdWx0ID0gbUF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCZtRW5kcG9pbnREZXNjcmlwdG9yLCBnZXREaXJlY3Rpb24oKSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtRnJhbWVzUGVyQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisgICAgY2FwYWNpdHkgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lczsKKworICAgIC8vIFZhbGlkYXRlIHJlc3VsdCBmcm9tIHNlcnZlci4KKyAgICBpZiAobUZyYW1lc1BlckJ1cnN0IDwgMTYgfHwgbUZyYW1lc1BlckJ1cnN0ID4gMTYgKiAxMDI0KSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckJ1cnN0IG91dCBvZiByYW5nZSA9ICVkIiwgbUZyYW1lc1BlckJ1cnN0KTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKGNhcGFjaXR5IDwgbUZyYW1lc1BlckJ1cnN0IHx8IGNhcGFjaXR5ID4gMzIgKiAxMDI0KSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgY2FwYWNpdHkpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1DbG9ja01vZGVsLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworCisgICAgaWYgKGdldERhdGFDYWxsYmFja1Byb2MoKSkgeworICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOworICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID4gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAvIDIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCisgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgfSBlbHNlIGlmIChtQ2FsbGJhY2tGcmFtZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07CisgICAgfQorCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIGNsb3NlKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmNsb3NlKCkgewotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpOiBtU2VydmljZVN0cmVhbUhhbmRsZSA9IDB4JTA4WCIsCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBBTE9HRCgiY2xvc2UoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLAogICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgIT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIC8vIERvbid0IGNsb3NlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuCkBAIC0yMDIsMTAgKzIxMywxMCBAQAogICAgICAgICAgICAgcmVxdWVzdFN0b3AoKTsKICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBuZXh0U3RhdGU7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyA9IE1JTl9USU1FT1VUX05BTk9TOwotICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHdhaXRGb3JTdGF0ZUNoYW5nZShjdXJyZW50U3RhdGUsICZuZXh0U3RhdGUsCisgICAgICAgICAgICByZXN1bHQgPSB3YWl0Rm9yU3RhdGVDaGFuZ2UoY3VycmVudFN0YXRlLCAmbmV4dFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXROYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkICVzIiwKKyAgICAgICAgICAgICAgICBBTE9HRSgiY2xvc2UoKSB3YWl0Rm9yU3RhdGVDaGFuZ2UoKSByZXR1cm5lZCAlZCAlcyIsCiAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE2LDE0ICsyMjcsMTYgQEAKICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZVtdIG1DYWxsYmFja0J1ZmZlcjsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbnVsbHB0cjsKKwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7Ci0gICAgICAgIHJldHVybiBtRW5kUG9pbnRQYXJjZWxhYmxlLmNsb3NlKCk7CisgICAgICAgIHJlc3VsdCA9IG1FbmRQb2ludFBhcmNlbGFibGUuY2xvc2UoKTsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDIgPSBBdWRpb1N0cmVhbTo6Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgIT0gQUFVRElPX09LKSA/IHJlc3VsdCA6IHJlc3VsdDI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiB9CiAKLQogc3RhdGljIHZvaWQgKmFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYyh2b2lkICpjb250ZXh0KQogewogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKnN0cmVhbSA9IChBdWRpb1N0cmVhbUludGVybmFsICopY29udGV4dDsKQEAgLTIzNSwyNCArMjQ4LDQ2IEBACiAgICAgfQogfQogCisvKgorICogSXQgbm9ybWFsbHkgdGFrZXMgYWJvdXQgMjAtMzAgbXNlYyB0byBzdGFydCBhIHN0cmVhbSBvbiB0aGUgc2VydmVyLgorICogQnV0IHRoZSBmaXJzdCB0aW1lIGNhbiB0YWtlIGFzIG11Y2ggYXMgMjAwLTMwMCBtc2VjLiBUaGUgSFcKKyAqIHN0YXJ0cyByaWdodCBhd2F5IHNvIGJ5IHRoZSB0aW1lIHRoZSBjbGllbnQgZ2V0cyBhIGNoYW5jZSB0byB3cml0ZSBpbnRvCisgKiB0aGUgYnVmZmVyLCBpdCBpcyBhbHJlYWR5IGluIGEgZGVlcCB1bmRlcmZsb3cgc3RhdGUuIFRoYXQgY2FuIGNhdXNlIHRoZQorICogWFJ1bkNvdW50IHRvIGJlIG5vbi16ZXJvLCB3aGljaCBjb3VsZCBsZWFkIGFuIGFwcCB0byB0dW5lIGl0cyBsYXRlbmN5IGhpZ2hlci4KKyAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2Ugc2V0IGEgcmVxdWVzdCBmb3IgdGhlIHByb2Nlc3NpbmcgY29kZSB0byBzdGFydCB0aGUKKyAqIGNsaWVudCBzdHJlYW0gYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgdGhlIHNlcnZlciBzdHJlYW0uCisgKiBUaGUgcHJvY2Vzc2luZyBjb2RlIHdpbGwgdGhlbiBzYXZlIHRoZSBjdXJyZW50IG9mZnNldAorICogYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBhbmQgYXBwbHkgdGhhdCB0byBhbnkgcG9zaXRpb24gZ2l2ZW4gdG8gdGhlIGFwcC4KKyAqLwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdGFydCgpCiB7CiAgICAgaW50NjRfdCBzdGFydFRpbWU7Ci0gICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWwoKTo6cmVxdWVzdFN0YXJ0KCkiKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgaWYgKGlzQWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIGFscmVhZHkgYWN0aXZlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUgPSBnZXRTdGF0ZSgpOwogCisgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUgPSBnZXRTdGF0ZSgpOworICAgIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBidXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOworICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhcnRXaXRoU3RhdHVzKCkpOworCisgICAgLy8gQ2xlYXIgYW55IHN0YWxlIHRpbWVzdGFtcHMgZnJvbSB0aGUgcHJldmlvdXMgcnVuLgorICAgIGRyYWluVGltZXN0YW1wc0Zyb21TZXJ2aWNlKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogCiAgICAgc3RhcnRUaW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKICAgICBtQ2xvY2tNb2RlbC5zdGFydChzdGFydFRpbWUpOworICAgIG1OZWVkQ2F0Y2hVcC5yZXF1ZXN0KCk7ICAvLyBBc2sgZGF0YSBwcm9jZXNzaW5nIGNvZGUgdG8gY2F0Y2ggdXAgd2hlbiBmaXJzdCB0aW1lc3RhbXAgcmVjZWl2ZWQuCiAKKyAgICAvLyBTdGFydCBkYXRhIGNhbGxiYWNrIHRocmVhZC4KICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiBnZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBMYXVuY2ggdGhlIGNhbGxiYWNrIGxvb3AgdGhyZWFkLgogICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zID0gbUNhbGxiYWNrRnJhbWVzCkBAIC0yOTcsMTQgKzMzMiwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wSW50ZXJuYWwoKQogewogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKICAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RvcFdpdGhTdGF0dXMoKSk7CisgICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworCisgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnN0b3BTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQpAQCAtMzE5LDYgKzM1Niw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJyZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucmVnaXN0ZXJBdWRpb1RocmVhZChtU2VydmljZVN0cmVhbUhhbmRsZSwKQEAgLTMyOCw2ICszNjYsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dW5yZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyVGhyZWFkKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS51bnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGdldHRpZCgpKTsKQEAgLTMzOCw2ICszNzcsNyBAQAogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdGFydENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwgY2xpZW50LCBjbGllbnRIYW5kbGUpOwogfQogCkBAIC0zNTEsMTUgKzM5MSwyMCBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKLSAgICAvLyBUT0RPIEdlbmVyYXRlIGluIHNlcnZlciBhbmQgcGFzcyB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaW50NjRfdCB0aW1lID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKLSAgICAqZnJhbWVQb3NpdGlvbiA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbih0aW1lKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvLyBUT0RPIEdldCBhIG1vcmUgYWNjdXJhdGUgdGltZXN0YW1wIGZyb20gdGhlIHNlcnZpY2UuIFRoaXMgY29kZSBqdXN0IGFkZHMgYSBmdWRnZSBmYWN0b3IuCi0gICAgKnRpbWVOYW5vc2Vjb25kcyA9IHRpbWUgKyAoNiAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgLy8gR2VuZXJhdGVkIGluIHNlcnZlciBhbmQgcGFzc2VkIHRvIGNsaWVudC4gUmV0dXJuIGxhdGVzdC4KKyAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgICAgICBpbnQ2NF90IHBvc2l0aW9uID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCkgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CisgICAgICAgIGlmIChwb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAqZnJhbWVQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgKnRpbWVOYW5vc2Vjb25kcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjp1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKSB7CiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsgLy8gc3RhdGUgaXMgZ2V0dGluZyB1cGRhdGVkIGJ5IHRoZSBjYWxsYmFjayB0aHJlYWQgcmVhZC93cml0ZSBjYWxsCiAgICAgfQpAQCAtMzcxLDIxICs0MTYsMjEgQEAKICAgICBzdGF0aWMgaW50NjRfdCBvbGRUaW1lID0gMDsKICAgICBpbnQ2NF90IGZyYW1lUG9zaXRpb24gPSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9UaW1lID0gY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOiB0aW1lc3RhbXAgc2F5cyBmcmFtZVBvc2l0aW9uID0gJTA4bGxkIGF0IG5hbm9UaW1lICVsbGQiLAorICAgIEFMT0dEKCJsb2dUaW1lc3RhbXA6IHRpbWVzdGFtcCBzYXlzIGZyYW1lUG9zaXRpb24gPSAlOGxsZCBhdCBuYW5vVGltZSAlbGxkIiwKICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lUG9zaXRpb24sCiAgICAgICAgICAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgaW50NjRfdCBuYW5vc0RlbHRhID0gbmFub1RpbWUgLSBvbGRUaW1lOwogICAgIGlmIChuYW5vc0RlbHRhID4gMCAmJiBvbGRUaW1lID4gMCkgewogICAgICAgICBpbnQ2NF90IGZyYW1lc0RlbHRhID0gZnJhbWVQb3NpdGlvbiAtIG9sZFBvc2l0aW9uOwogICAgICAgICBpbnQ2NF90IHJhdGUgPSAoZnJhbWVzRGVsdGEgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORCkgLyBuYW5vc0RlbHRhOwotICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDogZnJhbWVzRGVsdGEgPSAlMDhsbGQsIG5hbm9zRGVsdGEgPSAlMDhsbGQsIHJhdGUgPSAlbGxkIiwKKyAgICAgICAgQUxPR0QoImxvZ1RpbWVzdGFtcDogICAgIGZyYW1lc0RlbHRhID0gJThsbGQsIG5hbm9zRGVsdGEgPSAlOGxsZCwgcmF0ZSA9ICVsbGQiLAogICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZXNEZWx0YSwgKGxvbmcgbG9uZykgbmFub3NEZWx0YSwgKGxvbmcgbG9uZykgcmF0ZSk7CiAgICAgfQogICAgIG9sZFBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKICAgICBvbGRUaW1lID0gbmFub1RpbWU7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvblRpbWVzdGFtcEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvblRpbWVzdGFtcFNlcnZpY2UoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICNpZiBMT0dfVElNRVNUQU1QUwogICAgIGxvZ1RpbWVzdGFtcCgqbWVzc2FnZSk7CiAjZW5kaWYKQEAgLTM5MywyMyArNDM4LDI5IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBUaW1lc3RhbXAgdGltZXN0YW1wKG1lc3NhZ2UtPnRpbWVzdGFtcC5wb3NpdGlvbiwgbWVzc2FnZS0+dGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcihBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgc3dpdGNoIChtZXNzYWdlLT5ldmVudC5ldmVudCkgewogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIik7CisgICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCIpOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQiKTsKKyAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQiKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXJnb3QoKSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEIik7CisgICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCIpOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CiAgICAgICAgICAgICB9CkBAIC00MjYsMTAgKzQ3NywxNCBAQAogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgLy8gUHJldmVudCBoYXJkd2FyZSBmcm9tIGxvb3Bpbmcgb24gb2xkIGRhdGEgYW5kIG1ha2luZyBidXp6aW5nIHNvdW5kcy4KKyAgICAgICAgICAgIGlmIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICAgICAgICAgIG1BdWRpb0VuZHBvaW50LmVyYXNlRGF0YU1lbW9yeSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HIC0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQgLSBGSUZPIGNsZWFyZWQiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRToKICAgICAgICAgICAgIG1TdHJlYW1Wb2x1bWUgPSAoZmxvYXQpbWVzc2FnZS0+ZXZlbnQuZGF0YURvdWJsZTsKQEAgLTQ0NSw2ICs1MDAsMzQgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6ZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKworICAgIHdoaWxlIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmIChtQXVkaW9FbmRwb2ludC5yZWFkVXBDb21tYW5kKCZtZXNzYWdlKSAhPSAxKSB7CisgICAgICAgICAgICBicmVhazsgLy8gbm8gY29tbWFuZCB0aGlzIHRpbWUsIG5vIHByb2JsZW0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgLy8gaWdub3JlIG1vc3QgbWVzc2FnZXMKKyAgICAgICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOgorICAgICAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX0hBUkRXQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpFVkVOVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvbkV2ZW50RnJvbVNlcnZlcigmbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIldBUk5JTkcgLSBkcmFpblRpbWVzdGFtcHNGcm9tU2VydmljZSgpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIFByb2Nlc3MgYWxsIHRoZSBjb21tYW5kcyBjb21pbmcgZnJvbSB0aGUgc2VydmVyLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NDb21tYW5kcygpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwpAQCAtNDU2LDggKzUzOSwxMiBAQAogICAgICAgICAgICAgYnJlYWs7IC8vIG5vIGNvbW1hbmQgdGhpcyB0aW1lLCBubyBwcm9ibGVtCiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QOgotICAgICAgICAgICAgcmVzdWx0ID0gb25UaW1lc3RhbXBGcm9tU2VydmVyKCZtZXNzYWdlKTsKKyAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX1NFUlZJQ0U6CisgICAgICAgICAgICByZXN1bHQgPSBvblRpbWVzdGFtcFNlcnZpY2UoJm1lc3NhZ2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX0hBUkRXQVJFOgorICAgICAgICAgICAgcmVzdWx0ID0gb25UaW1lc3RhbXBIYXJkd2FyZSgmbWVzc2FnZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpFVkVOVDoKQEAgLTQ2NSw3ICs1NTIsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJXQVJOSU5HIC0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0NvbW1hbmRzKCkgVW5yZWNvZ25pemVkIHdoYXQgPSAlZCIsCisgICAgICAgICAgICBBTE9HRSgiV0FSTklORyAtIHByb2Nlc3NDb21tYW5kcygpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAogICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MTcsMTIgKzYwNCwxOSBAQAogICAgICAgICAgICAgICAgIHdha2VUaW1lTmFub3MgKz0gbVdha2V1cERlbGF5TmFub3M7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgaW50NjRfdCBlYXJsaWVzdFdha2VUaW1lID0gY3VycmVudFRpbWVOYW5vcyArIG1NaW5pbXVtU2xlZXBOYW5vczsKKyAgICAgICAgICAgIC8vIEd1YXJhbnRlZSBhIG1pbmltdW0gc2xlZXAgdGltZS4KKyAgICAgICAgICAgIGlmICh3YWtlVGltZU5hbm9zIDwgZWFybGllc3RXYWtlVGltZSkgeworICAgICAgICAgICAgICAgIHdha2VUaW1lTmFub3MgPSBlYXJsaWVzdFdha2VUaW1lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAod2FrZVRpbWVOYW5vcyA+IGRlYWRsaW5lTmFub3MpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB0aW1lIG91dCwganVzdCByZXR1cm4gdGhlIGZyYW1lc1dyaXR0ZW4gc28gZmFyLgogICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIHdlIGZpeCB0aGUgZGVhZGxpbmUgYnVnCiAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IGVudGVyZWQgYXQgJWxsZCBuYW5vcywgY3VycmVudGx5ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGVudHJ5VGltZU5hbm9zLCAobG9uZyBsb25nKSBjdXJyZW50VGltZU5hbm9zKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogdGltZWQgb3V0IGFmdGVyICVsbGQgbmFub3MiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzRGF0YSgpOiBUSU1FT1VUIGFmdGVyICVsbGQgbmFub3MiLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVvdXROYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IHdha2VUaW1lID0gJWxsZCwgZGVhZGxpbmUgPSAlbGxkIG5hbm9zIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB3YWtlVGltZU5hbm9zLCAobG9uZyBsb25nKSBkZWFkbGluZU5hbm9zKTsKQEAgLTUzMywxMyArNjI3LDYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY3VycmVudFRpbWVOYW5vcyA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGVhcmxpZXN0V2FrZVRpbWUgPSBjdXJyZW50VGltZU5hbm9zICsgbU1pbmltdW1TbGVlcE5hbm9zOwotICAgICAgICAgICAgLy8gR3VhcmFudGVlIGEgbWluaW11bSBzbGVlcCB0aW1lLgotICAgICAgICAgICAgaWYgKHdha2VUaW1lTmFub3MgPCBlYXJsaWVzdFdha2VUaW1lKSB7Ci0gICAgICAgICAgICAgICAgd2FrZVRpbWVOYW5vcyA9IGVhcmxpZXN0V2FrZVRpbWU7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBmdWxsRnJhbWVzID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoZmlmb05hbWUsIGZ1bGxGcmFtZXMpOwpAQCAtNTc2LDcgKzY2Myw3IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhyZXF1ZXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CisgICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC01OTksMzIgKzY4NiwzIEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwogfQotCi12b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmRvU2V0Vm9sdW1lKCkgewotICAgIC8vIE5vIHBhbiBhbmQgb25seSBsZWZ0IHZvbHVtZSBpcyB0YWtlbiBpbnRvIGFjY291bnQgZnJvbSBJUExheWVyIGludGVyZmFjZQotICAgIG1Wb2x1bWVSYW1wLnNldFRhcmdldChtU3RyZWFtVm9sdW1lICogbVZvbHVtZU11bHRpcGxpZXJMIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW1wbGVtZW50YXRpb24gb2YgUGxheWVyQmFzZQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cGxheWVyU3RhcnQoKSB7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1TZXJ2aWNlSW50ZXJmYWNlLnN0YXJ0U3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnBsYXllclBhdXNlKCkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsOjpwbGF5ZXJTdG9wKCkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnBsYXllclNldFZvbHVtZSgpIHsKLSAgICBkb1NldFZvbHVtZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1N0cmVhbUludGVybmFsOjpkZXN0cm95KCkgewotICAgIGJhc2VEZXN0cm95KCk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMWI5OTFkZS4uNDcwMjRjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBBTkRST0lEX0FBVURJT19BVURJT19TVFJFQU1fSU5URVJOQUxfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvUGxheWVyQmFzZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKQEAgLTM2LDcgKzM1LDcgQEAKIG5hbWVzcGFjZSBhYXVkaW8gewogCiAvLyBBIHN0cmVhbSB0aGF0IHRhbGtzIHRvIHRoZSBBQXVkaW9TZXJ2aWNlIG9yIGRpcmVjdGx5IHRvIGEgSEFMLgotY2xhc3MgQXVkaW9TdHJlYW1JbnRlcm5hbCA6IHB1YmxpYyBBdWRpb1N0cmVhbSwgcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgIHsKK2NsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWwgOiBwdWJsaWMgQXVkaW9TdHJlYW0gewogCiBwdWJsaWM6CiAgICAgQXVkaW9TdHJlYW1JbnRlcm5hbChBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UpOwpAQCAtNTAsNyArNDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVwZGF0ZVN0YXRlTWFjaGluZSgpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSBvdmVycmlkZTsKIApAQCAtODUsMTQgKzg0LDE1IEBACiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVvdXQgYmFzZWQgb24gZnJhbWVzUGVyQnVyc3QKICAgICBpbnQ2NF90IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KCk7CiAKLSAgICAvL1BsYXllckJhc2UgdmlydHVhbHMKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7CiAKKyAgICBhYXVkaW9faGFuZGxlX3QgZ2V0U2VydmljZUhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlU3RyZWFtSGFuZGxlOworICAgIH0KKwogcHJvdGVjdGVkOgogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByb2Nlc3NEYXRhKHZvaWQgKmJ1ZmZlciwKQEAgLTExMSwzMiArMTExLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKndha2VUaW1lUHRyKSA9IDA7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCBwcm9jZXNzQ29tbWFuZHMoKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcEludGVybmFsKCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENhbGxiYWNrKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIHt9CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb25FdmVudEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9uVGltZXN0YW1wRnJvbVNlcnZlcihBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IG9uVGltZXN0YW1wU2VydmljZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSk7CiAKICAgICB2b2lkIGxvZ1RpbWVzdGFtcChBQXVkaW9TZXJ2aWNlTWVzc2FnZSAmbWVzc2FnZSk7CiAKICAgICAvLyBDYWxjdWxhdGUgdGltZW91dCBmb3IgYW4gb3BlcmF0aW9uIGludm9sdmluZyBmcmFtZXNQZXJPcGVyYXRpb24uCiAgICAgaW50NjRfdCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChpbnQzMl90IGZyYW1lc1Blck9wZXJhdGlvbik7CiAKLSAgICB2b2lkIGRvU2V0Vm9sdW1lKCk7Ci0KLSAgICAvL1BsYXllckJhc2UgdmlydHVhbHMKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBsYXllclN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheWVyU3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCk7Ci0KICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKQEAgLTE0Nyw5ICsxNDQsNiBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3Q7ICAgICAvLyBmcmFtZXMgcGVyIEhBTCB0cmFuc2ZlcgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtWFJ1bkNvdW50ID0gMDsgICAgICAvLyBob3cgbWFueSB1bmRlcnJ1biBldmVudHM/CiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Wb2x1bWU7Ci0KICAgICAvLyBPZmZzZXQgZnJvbSB1bmRlcmx5aW5nIGZyYW1lIHBvc2l0aW9uLgogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgPSAwOyAvLyBvZmZzZXQgZm9yIHRpbWVzdGFtcHMKIApAQCAtMTYxLDYgKzE1NSwxMiBAQAogCiAgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJm1TZXJ2aWNlSW50ZXJmYWNlOyAgIC8vIGFic3RyYWN0IGludGVyZmFjZSB0byB0aGUgc2VydmljZQogCisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisKKyAgICBBdG9taWNSZXF1ZXN0b3IgICAgICAgICAgbU5lZWRDYXRjaFVwOyAgIC8vIEFzayByZWFkKCkgb3Igd3JpdGUoKSB0byBzeW5jIG9uIGZpcnN0IHRpbWVzdGFtcC4KKworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lID0gMS4wZjsKKwogcHJpdmF0ZToKICAgICAvKgogICAgICAqIEFzeW5jaHJvbm91cyB3cml0ZSB3aXRoIGRhdGEgY29udmVyc2lvbi4KQEAgLTE4MSw2ICsxODEsOCBAQAogCiAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgIG1FbmRQb2ludFBhcmNlbGFibGU7IC8vIGRlc2NyaXB0aW9uIG9mIHRoZSBidWZmZXJzIGZpbGxlZCBieSBzZXJ2aWNlCiAgICAgRW5kcG9pbnREZXNjcmlwdG9yICAgICAgIG1FbmRwb2ludERlc2NyaXB0b3I7IC8vIGJ1ZmZlciBkZXNjcmlwdGlvbiB3aXRoIHJlc29sdmVkIGFkZHJlc3NlcworCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCmluZGV4IDdiMWU1M2UuLmI3OTJlY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKQEAgLTM5LDYgKzM5LDIxIEBACiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjp+QXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKSB7fQogCit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgeworICAgIGludDY0X3QgcmVhZENvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKKyAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKKworICAgIC8vIEJ1bXAgb2Zmc2V0IHNvIGNhbGxlciBkb2VzIG5vdCBzZWUgdGhlIHJldHJvZ3JhZGUgbW90aW9uIGluIGdldEZyYW1lc1JlYWQoKS4KKyAgICBpbnQ2NF90IG9mZnNldCA9IHJlYWRDb3VudGVyIC0gd3JpdGVDb3VudGVyOworICAgIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSArPSBvZmZzZXQ7CisgICAgQUxPR0QoImFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSByZWFkTiA9ICVsbGQsIHdyaXRlTiA9ICVsbGQsIG9mZnNldCA9ICVsbGQiLAorICAgICAgICAgIChsb25nIGxvbmcpcmVhZENvdW50ZXIsIChsb25nIGxvbmcpd3JpdGVDb3VudGVyLCAobG9uZyBsb25nKW1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7CisKKyAgICAvLyBGb3JjZSByZWFkQ291bnRlciB0byBtYXRjaCB3cml0ZUNvdW50ZXIuCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHdyaXRlIGNvdW50ZXIgaW4gdGhlIGhhcmR3YXJlLgorICAgIG1BdWRpb0VuZHBvaW50LnNldERhdGFSZWFkQ291bnRlcih3cml0ZUNvdW50ZXIpOworfQorCiAvLyBXcml0ZSB0aGUgZGF0YSwgYmxvY2sgaWYgbmVlZGVkIGFuZCB0aW1lb3V0TWlsbGlzID4gMAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQpAQCAtNTcsNiArNzIsMTggQEAKICAgICBjb25zdCBjaGFyICp0cmFjZU5hbWUgPSAiYWFSZE5vdyI7CiAgICAgQVRSQUNFX0JFR0lOKHRyYWNlTmFtZSk7CiAKKyAgICBpZiAobUNsb2NrTW9kZWwuaXNTdGFydGluZygpKSB7CisgICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgZ290IGFueSB0aW1lc3RhbXBzIGZyb20gc2VydmVyLgorICAgICAgICAvLyBLZWVwIHdhaXRpbmcgdW50aWwgd2UgZ2V0IHNvbWUgdmFsaWQgdGltZXN0YW1wcyB0aGVuIHN0YXJ0IHdyaXRpbmcgdG8gdGhlCisgICAgICAgIC8vIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgorICAgICAgICBBTE9HRCgicHJvY2Vzc0RhdGFOb3coKSB3YWl0IGZvciB2YWxpZCB0aW1lc3RhbXBzIik7CisgICAgICAgIC8vIFNsZWVwIHZlcnkgYnJpZWZseSBhbmQgaG9wZSB3ZSBnZXQgYSB0aW1lc3RhbXAgc29vbi4KKyAgICAgICAgKndha2VUaW1lUHRyID0gY3VycmVudE5hbm9UaW1lICsgKDIwMDAgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gSWYgd2UgaGF2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB0aW1lc3RhbXAgZnJvbSBzZXJ2ZXIuCisKICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuaXNGcmVlUnVubmluZygpKSB7CiAgICAgICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpwcm9jZXNzRGF0YU5vdygpIC0gdXBkYXRlIHJlbW90ZSBjb3VudGVyIik7CiAgICAgICAgIC8vIFVwZGF0ZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIHRoZSB0aW1pbmcgbW9kZWwuCkBAIC02NSw2ICs5MiwxNCBAQAogICAgICAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhV3JpdGVDb3VudGVyKGVzdGltYXRlZFJlbW90ZUNvdW50ZXIpOwogICAgIH0KIAorICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHZhbGlkIHRpbWVzdGFtcHMuCisgICAgaWYgKG1OZWVkQ2F0Y2hVcC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIC8vIENhdGNoIGFuIE1NQVAgcG9pbnRlciB0aGF0IGlzIGFscmVhZHkgYWR2YW5jaW5nLgorICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgaW5pdGlhbCB1bmRlcnJ1bnMgY2F1c2VkIGJ5IGEgc2xvdyBjb2xkIHN0YXJ0LgorICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCk7CisgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOworICAgIH0KKwogICAgIC8vIElmIHRoZSB3cml0ZSBpbmRleCBwYXNzZWQgdGhlIHJlYWQgaW5kZXggdGhlbiBjb25zaWRlciBpdCBhbiBvdmVycnVuLgogICAgIGlmIChtQXVkaW9FbmRwb2ludC5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgewogICAgICAgICBtWFJ1bkNvdW50Kys7CkBAIC0xMDAsOCArMTM1LDggQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSByZWFkQ291bnRlciBiZWNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFJlYWRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0OwotICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRSZWFkUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCkgKyBtRnJhbWVzUGVyQnVyc3Q7CisgICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUobmV4dFBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODYsOCArMjIxLDcgQEAKIH0KIAogaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Z2V0RnJhbWVzUmVhZCgpIHsKLSAgICBpbnQ2NF90IGZyYW1lcyA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOworICAgIGludDY0X3QgZnJhbWVzID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCkgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgLy9BTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1JlYWQoKSByZXR1cm5zICVsbGQiLCAobG9uZyBsb25nKWZyYW1lcyk7CiAgICAgcmV0dXJuIGZyYW1lczsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCmluZGV4IDE3ZjM3ZTguLjI5NGRiYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaApAQCAtNDYsNiArNDYsOCBAQAogICAgIH0KIHByb3RlY3RlZDoKIAorICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworCiAvKioKICAqIExvdyBsZXZlbCBkYXRhIHByb2Nlc3NpbmcgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHJlYWQgb3Igd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDMxZTBhNDAuLjFlMDJlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQ4LDcgKzQ4LDggQEAKIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQocGF1c2VXaXRoU3RhdHVzKCkpOworICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKyAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucGF1c2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZSgpCkBAIC03MiwyMSArNzMsMjUgQEAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UuZmx1c2hTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvbkZsdXNoRnJvbVNlcnZlcigpIHsKK3ZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSB7CiAgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpOwogICAgIGludDY0X3Qgd3JpdGVDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpOwogCiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgotICAgIGludDY0X3QgZnJhbWVzRmx1c2hlZCA9IHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyOwotICAgIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSArPSBmcmFtZXNGbHVzaGVkOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkZsdXNoRnJvbVNlcnZlcigpIHJlYWROID0gJWxsZCwgd3JpdGVOID0gJWxsZCwgb2Zmc2V0ID0gJWxsZCIsCisgICAgaW50NjRfdCBvZmZzZXQgPSB3cml0ZUNvdW50ZXIgLSByZWFkQ291bnRlcjsKKyAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgKz0gb2Zmc2V0OworICAgIEFMT0dEKCJhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgcmVhZE4gPSAlbGxkLCB3cml0ZU4gPSAlbGxkLCBvZmZzZXQgPSAlbGxkIiwKICAgICAgICAgICAobG9uZyBsb25nKXJlYWRDb3VudGVyLCAobG9uZyBsb25nKXdyaXRlQ291bnRlciwgKGxvbmcgbG9uZyltRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwogCi0gICAgLy8gRmx1c2ggd3JpdHRlbiBmcmFtZXMgYnkgZm9yY2luZyB3cml0ZUNvdW50ZXIgdG8gcmVhZENvdW50ZXIuCi0gICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBtb3ZlIHRoZSByZWFkIGNvdW50ZXIgaW4gdGhlIGhhcmR3YXJlLgorICAgIC8vIEZvcmNlIHdyaXRlQ291bnRlciB0byBtYXRjaCByZWFkQ291bnRlci4KKyAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgY2Fubm90IGNoYW5nZSB0aGUgcmVhZCBjb3VudGVyIGluIHRoZSBoYXJkd2FyZS4KICAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhV3JpdGVDb3VudGVyKHJlYWRDb3VudGVyKTsKIH0KIAordm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b25GbHVzaEZyb21TZXJ2ZXIoKSB7CisgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworfQorCiAvLyBXcml0ZSB0aGUgZGF0YSwgYmxvY2sgaWYgbmVlZGVkIGFuZCB0aW1lb3V0TWlsbGlzID4gMAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQpAQCAtMTA2LDYgKzExMSwxOCBAQAogICAgIGNvbnN0IGNoYXIgKnRyYWNlTmFtZSA9ICJhYVdyTm93IjsKICAgICBBVFJBQ0VfQkVHSU4odHJhY2VOYW1lKTsKIAorICAgIGlmIChtQ2xvY2tNb2RlbC5pc1N0YXJ0aW5nKCkpIHsKKyAgICAgICAgLy8gU3RpbGwgaGF2ZW4ndCBnb3QgYW55IHRpbWVzdGFtcHMgZnJvbSBzZXJ2ZXIuCisgICAgICAgIC8vIEtlZXAgd2FpdGluZyB1bnRpbCB3ZSBnZXQgc29tZSB2YWxpZCB0aW1lc3RhbXBzIHRoZW4gc3RhcnQgd3JpdGluZyB0byB0aGUKKyAgICAgICAgLy8gY3VycmVudCBidWZmZXIgcG9zaXRpb24uCisgICAgICAgIEFMT0dEKCJwcm9jZXNzRGF0YU5vdygpIHdhaXQgZm9yIHZhbGlkIHRpbWVzdGFtcHMiKTsKKyAgICAgICAgLy8gU2xlZXAgdmVyeSBicmllZmx5IGFuZCBob3BlIHdlIGdldCBhIHRpbWVzdGFtcCBzb29uLgorICAgICAgICAqd2FrZVRpbWVQdHIgPSBjdXJyZW50TmFub1RpbWUgKyAoMjAwMCAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpOworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBJZiB3ZSBoYXZlIGdvdHRlbiB0aGlzIGZhciB0aGVuIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHRpbWVzdGFtcCBmcm9tIHNlcnZlci4KKwogICAgIC8vIElmIGEgRE1BIGNoYW5uZWwgb3IgRFNQIGlzIHJlYWRpbmcgdGhlIG90aGVyIGVuZCB0aGVuIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSByZWFkQ291bnRlci4KICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuaXNGcmVlUnVubmluZygpKSB7CiAgICAgICAgIC8vIFVwZGF0ZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIHRoZSB0aW1pbmcgbW9kZWwuCkBAIC0xMTQsNiArMTMxLDEzIEBACiAgICAgICAgIG1BdWRpb0VuZHBvaW50LnNldERhdGFSZWFkQ291bnRlcihlc3RpbWF0ZWRSZWFkQ291bnRlcik7CiAgICAgfQogCisgICAgaWYgKG1OZWVkQ2F0Y2hVcC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIC8vIENhdGNoIGFuIE1NQVAgcG9pbnRlciB0aGF0IGlzIGFscmVhZHkgYWR2YW5jaW5nLgorICAgICAgICAvLyBUaGlzIHdpbGwgYXZvaWQgaW5pdGlhbCB1bmRlcnJ1bnMgY2F1c2VkIGJ5IGEgc2xvdyBjb2xkIHN0YXJ0LgorICAgICAgICBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCk7CisgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOworICAgIH0KKwogICAgIC8vIElmIHRoZSByZWFkIGluZGV4IHBhc3NlZCB0aGUgd3JpdGUgaW5kZXggdGhlbiBjb25zaWRlciBpdCBhbiB1bmRlcnJ1bi4KICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgewogICAgICAgICBtWFJ1bkNvdW50Kys7CkBAIC0xNTMsOSArMTc3LDkgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSB3cml0ZUNvdW50ZXIgYmVjYXVzZQogICAgICAgICAgICAgICAgIC8vIHRoZSByZWFkQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFJlYWRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKSArIG1GcmFtZXNQZXJCdXJzdAorICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAtIG1BdWRpb0VuZHBvaW50LmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOwotICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRSZWFkUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRQb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMjY2LDcgKzI5MCw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLQogaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzUmVhZCgpCiB7CiAgICAgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmU7CkBAIC0zNDAsMyArMzYzLDEwIEBACiAgICAgICAgICAgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKICAgICByZXR1cm4gTlVMTDsKIH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcGxlbWVudGF0aW9uIG9mIFBsYXllckJhc2UKK3N0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5Ojpkb1NldFZvbHVtZSgpIHsKKyAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQobVN0cmVhbVZvbHVtZSAqIGdldER1Y2tBbmRNdXRlVm9sdW1lKCkpOworICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IGU1OWQwMmMuLmQ1YzFiMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtNTQsOCArNTQsMTIgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2VJbnRlcm5hbCgpOwogCisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgb3ZlcnJpZGU7CisKICAgICB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkgb3ZlcnJpZGU7CiAKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkb1NldFZvbHVtZSgpIG92ZXJyaWRlOworCiAvKioKICAqIExvdyBsZXZlbCB3cml0ZSB0aGF0IHdpbGwgbm90IGJsb2NrLiBJdCB3aWxsIGp1c3Qgd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCiAgKgpAQCAtNzgsNiArODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKTsKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSAwOyAvLyB1c2VkIHRvIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24KKworICAgIExpbmVhclJhbXAgICAgICAgICAgICAgICBtVm9sdW1lUmFtcDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCA0ZDBhN2I4Li5iYWM2OWYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2RlZmluZSBNSU5fTEFURU5FU1NfTkFOT1MgKDEwICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBJc29jaHJvbm91c0Nsb2NrTW9kZWw6Oklzb2Nocm9ub3VzQ2xvY2tNb2RlbCgpCkBAIC00OSwxOSArNDgsMjYgQEAKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0YXJ0KGludDY0X3QgbmFub1RpbWUpIHsKLSAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzdGFydChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RhcnQobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIG1NYXJrZXJOYW5vVGltZSA9IG5hbm9UaW1lOwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUQVJUSU5HOwogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChpbnQ2NF90IG5hbm9UaW1lKSB7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgc2V0UG9zaXRpb25BbmRUaW1lKGNvbnZlcnRUaW1lVG9Qb3NpdGlvbihuYW5vVGltZSksIG5hbm9UaW1lKTsKICAgICAvLyBUT0RPIHNob3VsZCB3ZSBzZXQgcG9zaXRpb24/CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CisvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCisvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKKy8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IGZyYW1lUG9zaXRpb24gLSBtTWFya2VyRnJhbWVQb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9zRGVsdGEgPSBuYW5vVGltZSAtIG1NYXJrZXJOYW5vVGltZTsKICAgICBpZiAobmFub3NEZWx0YSA8IDEwMDApIHsKQEAgLTcxLDkgKzc3LDYgQEAKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtTWFya2VyRnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbU1hcmtlck5hbm9UaW1lICVsbHUiLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJGcmFtZVBvc2l0aW9uLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJOYW5vVGltZSk7Ci0vLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCi0vLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKLS8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAKICAgICBpbnQ2NF90IGV4cGVjdGVkTmFub3NEZWx0YSA9IGNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKGZyYW1lc0RlbHRhKTsKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBleHBlY3RlZE5hbm9zRGVsdGEgPSAlbGxkLCBuYW5vc0RlbHRhID0gJWxsdSIsCkBAIC0xMTcsNiArMTIwLDggQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CisKKy8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtU3RhdGUgPSAlZCIsIG1TdGF0ZSk7CiB9CiAKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA1ODVmNTNhLi43MTgyMzc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMzYsNiArMzYsOCBAQAogICAgIHZvaWQgc3RhcnQoaW50NjRfdCBuYW5vVGltZSk7CiAgICAgdm9pZCBzdG9wKGludDY0X3QgbmFub1RpbWUpOwogCisgICAgYm9vbCBpc1N0YXJ0aW5nKCk7CisKICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uMWVhZWU4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0yNCwxNSArMjQsMTQgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KIAorI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbS5oIgotI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCi0jaW5jbHVkZSAiSGFuZGxlVHJhY2tlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0KIC8vIE1hY3JvcyBmb3IgY29tbW9uIGNvZGUgdGhhdCBpbmNsdWRlcyBhIHJldHVybi4KIC8vIFRPRE8gQ29uc2lkZXIgdXNpbmcgZG97fXdoaWxlKDApIGNvbnN0cnVjdC4gSSB0cmllZCBidXQgaXQgaHVuZyBBbmRyb2lkU3R1ZGlvCiAjZGVmaW5lIENPTlZFUlRfQlVJTERFUl9IQU5ETEVfT1JfUkVUVVJOKCkgXApAQCAtMTAxLDcgKzEwMCw2IEBACiAgKi8KIHN0YXRpYyBhYXVkaW9fcG9saWN5X3Qgc19NTWFwUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCi0KIHN0YXRpYyBBdWRpb1N0cmVhbSAqY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIChBdWRpb1N0cmVhbSopIHN0cmVhbTsKQEAgLTE0NCwxNyArMTQyLDE2IEBACiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwogICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIyMSw2ICsyMTgsNyBAQAogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCiAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLCBhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgYXVkaW9TdHJlYW0tPnJlZ2lzdGVyUGxheWVyQmFzZSgpOwogICAgICAgICAqc3RyZWFtUHRyID0gKEFBdWRpb1N0cmVhbSopIGF1ZGlvU3RyZWFtOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpzdHJlYW1QdHIgPSBudWxscHRyOwpAQCAtMjQ0LDYgKzI0Miw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkiLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIGF1ZGlvU3RyZWFtLT5jbG9zZSgpOworICAgICAgICBhdWRpb1N0cmVhbS0+dW5yZWdpc3RlclBsYXllckJhc2UoKTsKICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KQEAgLTI1NCw4ICsyNTMsOCBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RhcnQoKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCglcCkgcmV0dXJuZWQgLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7CisgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjMsNyArMjYyLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0UGF1c2UoKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVBhdXNlKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKQpAQCAtMjc3LDcgKzI3Niw3IEBACiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RvcCgpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLApAQCAtMzU5LDggKzM1OCw3IEBACiAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewotICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggNjVjMmI0Ni4uODI0NDVlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtMzQsNiArMzQsMTYgQEAKIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6fkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogCit2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKSB7CisgICAgbVNhbXBsZXNQZXJGcmFtZSA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CisgICAgbVNhbXBsZVJhdGUgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOworICAgIG1EZXZpY2VJZCAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7CisgICAgbVNoYXJpbmdNb2RlICAgICA9IG90aGVyLm1TaGFyaW5nTW9kZTsKKyAgICBtQXVkaW9Gb3JtYXQgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OworICAgIG1EaXJlY3Rpb24gICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOworICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc4LDYgKzg4LDE2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAorICAgIHN3aXRjaCAobURpcmVjdGlvbikgeworICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBkaXJlY3Rpb24gbm90IHZhbGlkID0gJWQiLCBtRGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTg3LDUgKzEwNyw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNhbXBsZXNQZXJGcmFtZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNoYXJpbmdNb2RlICAgICA9ICVkIiwgKGludCltU2hhcmluZ01vZGUpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1BdWRpb0Zvcm1hdCAgICAgPSAlZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKKyAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtRGlyZWN0aW9uICAgICAgID0gJWQiLCBtRGlyZWN0aW9uKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtQnVmZmVyQ2FwYWNpdHkgID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggOTczNzljYy4uNWU2N2M5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTc5LDYgKzgwLDI0IEBACiAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGZyYW1lczsKICAgICB9CiAKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpcmVjdGlvbjsKKyAgICB9CisKKyAgICB2b2lkIHNldERpcmVjdGlvbihhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgfQorCisgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdmFyaWFibGVzIGRlZmluZWQgaW4gb3RoZXIgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBpbnN0YW5jZSB0byB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKi8KKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKTsKKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKQEAgLTg5LDkgKzEwOCwxMCBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCiAKLSNlbmRpZiAvL0FBVURJT19TVFJFQU1fUEFSQU1FVEVSU19IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmIC8vQUFVRElPX1NUUkVBTV9QQVJBTUVURVJTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDQ4NTljNjkuLjhkY2MzN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMjksMTMgKzI5LDI2IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb1N0cmVhbTo6QXVkaW9TdHJlYW0oKQotICAgICAgICA6IG1DYWxsYmFja0VuYWJsZWQoZmFsc2UpCisgICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKIHsKICAgICAvLyBtVGhyZWFkIGlzIGEgcHRocmVhZF90IG9mIHVua25vd24gc2l6ZSBzbyB3ZSBuZWVkIG1lbXNldC4KICAgICBtZW1zZXQoJm1UaHJlYWQsIDAsIHNpemVvZihtVGhyZWFkKSk7CiAgICAgc2V0UGVyaW9kTmFub3NlY29uZHMoMCk7CiB9CiAKK0F1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7CisgICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKyAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCisgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYXVkaW8gc3RyZWFtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKworICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewogICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKICAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7CkBAIC05MCwxNSArMTAzLDEyIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKLSAgICBjbG9zZSgpOwotfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OndhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICpuZXh0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0xMTIsNyArMTIyLDcgQEAKICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBGb3JOYW5vcyhkdXJhdGlvbk5hbm9zKTsKICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzIC09IGR1cmF0aW9uTmFub3M7CiAKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHVwZGF0ZVN0YXRlV2hpbGVXYWl0aW5nKCk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB1cGRhdGVTdGF0ZU1hY2hpbmUoKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE1Myw2ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRocmVhZEFyZykKIHsKICAgICBpZiAobUhhc1RocmVhZCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW06OmNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAodGhyZWFkUHJvYyA9PSBudWxscHRyKSB7CkBAIC0xNzQsNiArMTg1LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogI2lmIDAKQEAgLTE4NywzICsxOTksMzggQEAKICAgICByZXR1cm4gZXJyID8gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKSA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CiB9CiAKKworI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgorYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKKyAgICBBTE9HVygiYXBwbHlWb2x1bWVTaGFwZXIoKSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1czo6b2soKTsKK30KKyNlbmRpZgorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgeworfQorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgeworICAgIEFMT0dWKCJNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoJXApIGRlbGV0ZWQiLCB0aGlzKTsKK30KKwordm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CisgICAgaWYgKCFtUmVnaXN0ZXJlZCkgeworICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQVVESU9fVVNBR0VfTUVESUEpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkgeworICAgIGlmIChtUmVnaXN0ZXJlZCkgeworICAgICAgICBiYXNlRGVzdHJveSgpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIH0KK30KKworCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CisgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggZTVmZGNjNi4uMzQyMDJkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTIxLDEwICsyMSwxOCBAQAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAorI2luY2x1ZGUgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIgorI2luY2x1ZGUgIm1lZGlhL1BsYXllckJhc2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIgogCisvLyBDYW5ub3QgZ2V0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXIgdG8gY29tcGlsZSEKKyNkZWZpbmUgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSICAwCisKIG5hbWVzcGFjZSBhYXVkaW8gewogCiB0eXBlZGVmIHZvaWQgKigqYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QpKHZvaWQgKik7CkBAIC02OCwxMCArNzYsMTAgQEAKIAogCiAgICAgLyoqCi0gICAgICogVXBkYXRlIHN0YXRlIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygd2FpdEZvclN0YXRlQ2hhbmdlKCkKKyAgICAgKiBVcGRhdGUgc3RhdGUgbWFjaGluZS4oKQogICAgICAqIEByZXR1cm4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSA9IDA7CiAKIAogICAgIC8vID09PT09PT09PT09IEVuZCBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjM0LDggKzI0MiwxMzIgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIHRvIGR1Y2sgYW5kIG11dGUgdGhlIHN0cmVhbSB3aGVuIGNoYW5naW5nIGF1ZGlvIGZvY3VzLgorICAgIHZvaWQgc2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpIHsKKyAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gZHVja0FuZE11dGVWb2x1bWU7CisgICAgICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCisgICAgfQorCisgICAgZmxvYXQgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSB7CisgICAgICAgIHJldHVybiBtRHVja0FuZE11dGVWb2x1bWU7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGhlIG91dHB1dCBzdWJjbGFzc2VzLgorICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgZG9TZXRWb2x1bWUoKSB7IHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCk7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIgaWYgbmVlZGVkLgorICAgICAqIE9ubHkgcmVnaXN0ZXIgb3V0cHV0IHN0cmVhbXMuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGNsaWVudCBzdHJlYW1zIGFuZCBub3QgZm9yIHN0cmVhbXMKKyAgICAgKiB0aGF0IHJ1biBpbiB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgICAgICBtUGxheWVyQmFzZS0+cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIuCisgICAgICogVGhpcyB3aWxsIG9ubHkgdW5yZWdpc3RlciBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgeworICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKKyAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCisgICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgeworICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcCgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKIHByb3RlY3RlZDoKIAorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgorICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KKyAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KKyAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGZvciB2b2x1bWUgY2hhbmdlcyBhbmQgcmVtb3RlIGNvbnRyb2wuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVblJlZ2lzdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBKdXN0IGNhbGxzIHVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGRlc3Ryb3koKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gbVBhcmVudCBzaG91bGQgTk9UIGJlIG51bGwuIFNvIGdvIGFoZWFkIGFuZCBjcmFzaCBpZiBpdCBpcy4KKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RQYXVzZSgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RvcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RvcCgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gTm8gcGFuIGFuZCBvbmx5IGxlZnQgdm9sdW1lIGlzIHRha2VuIGludG8gYWNjb3VudCBmcm9tIElQTGF5ZXIgaW50ZXJmYWNlCisgICAgICAgICAgICBtUGFyZW50LT5zZXREdWNrQW5kTXV0ZVZvbHVtZShtVm9sdW1lTXVsdGlwbGllckwgIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKKyAgICAgICAgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFyZW50LT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvU3RyZWFtICAgICAgICAgICptUGFyZW50OworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgbVJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgfTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgpAQCAtMjc1LDcgKzQwNyw5IEBACiAKICAgICBzdGQ6Om11dGV4ICAgICAgICAgICBtU3RyZWFtTXV0ZXg7CiAKLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICBtQ2FsbGJhY2tFbmFibGVkOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gMS4wZjsKIAogcHJvdGVjdGVkOgogCkBAIC0yODgsNiArNDIyLDggQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOworCiAgICAgLy8gVGhlc2UgZG8gbm90IGNoYW5nZSBhZnRlciBvcGVuKCkuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IDQzYTFlZjEuLjA5ZWJiM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0xODQsMTYgKzE4NCw2IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgc3dpdGNoIChtRGlyZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjogZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgICAgICAgICAvLyBicmVhazsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG1QZXJmb3JtYW5jZU1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAppbmRleCA2ZTU0OGIxLi5hNDNjZmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCkBAIC0zNSwxNSArMzUsNiBAQAogCiAgICAgfkF1ZGlvU3RyZWFtQnVpbGRlcigpOwogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGdldERpcmVjdGlvbigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EaXJlY3Rpb247Ci0gICAgfQotCi0gICAgQXVkaW9TdHJlYW1CdWlsZGVyKiBzZXREaXJlY3Rpb24oYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKICAgICB9CkBAIC0xMTMsNyArMTA0LDYgQEAKIAogcHJpdmF0ZToKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIAogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgIG1EYXRhQ2FsbGJhY2tQcm9jID0gbnVsbHB0cjsgIC8vIGV4dGVybmFsIGNhbGxiYWNrIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IDhkMmM2MmQuLmM4ZWMxNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIyLDYgKzIyLDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIgpAQCAtODUsMTUgKzg3LDE0IEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7Ci0KICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KICAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07Ci0gICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OwotCisgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMDIsMTggKzEwMywxOSBAQAogICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IG51bGxwdHI7CiAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSAwOwogICAgIH0KLQogfQogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gbUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgorICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKIH0KIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0yMTAsMyArMjEyLDkgQEAKICAgICByZXR1cm4gbUZpZm8tPmdldENhcGFjaXR5KCk7CiB9CiAKK3ZvaWQgRmlmb0J1ZmZlcjo6ZXJhc2VNZW1vcnkoKSB7CisgICAgaW50MzJfdCBudW1CeXRlcyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKSk7CisgICAgaWYgKG51bUJ5dGVzID4gMCkgeworICAgICAgICBtZW1zZXQobVN0b3JhZ2UsIDAsIChzaXplX3QpIG51bUJ5dGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCBhOTRlOWIwLi5mNWE5ZTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTExMSw2ICsxMTEsMTEgQEAKICAgICAgICAgbUZpZm8tPnNldFdyaXRlQ291bnRlcihuKTsKICAgICB9CiAKKyAgICAvKgorICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgY2FsbGVkIGJlZm9yZSBvciBhZnRlciB0aGUgYnVmZmVyIGlzIHVzZWQuCisgICAgICovCisgICAgdm9pZCBlcmFzZU1lbW9yeSgpOworCiBwcml2YXRlOgogCiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAppbmRleCAxNGEyYmUxLi41MWE4ZTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcApAQCAtMzgsNyArMzgsNyBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9Db250cm9sbGVyQmFzZTo6Z2V0UmVhZEluZGV4KCkgewogICAgIC8vICUgd29ya3Mgd2l0aCBub24tcG93ZXIgb2YgdHdvIHNpemVzCi0gICAgcmV0dXJuIChmaWZvX2ZyYW1lc190KSAoZ2V0UmVhZENvdW50ZXIoKSAlIG1DYXBhY2l0eSk7CisgICAgcmV0dXJuIChmaWZvX2ZyYW1lc190KSAoKHVpbnQ2NF90KWdldFJlYWRDb3VudGVyKCkgJSBtQ2FwYWNpdHkpOwogfQogCiB2b2lkIEZpZm9Db250cm9sbGVyQmFzZTo6YWR2YW5jZVJlYWRJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewpAQCAtNTEsNyArNTEsNyBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9Db250cm9sbGVyQmFzZTo6Z2V0V3JpdGVJbmRleCgpIHsKICAgICAvLyAlIHdvcmtzIHdpdGggbm9uLXBvd2VyIG9mIHR3byBzaXplcwotICAgIHJldHVybiAoZmlmb19mcmFtZXNfdCkgKGdldFdyaXRlQ291bnRlcigpICUgbUNhcGFjaXR5KTsKKyAgICByZXR1cm4gKGZpZm9fZnJhbWVzX3QpICgodWludDY0X3QpZ2V0V3JpdGVDb3VudGVyKCkgJSBtQ2FwYWNpdHkpOwogfQogCiB2b2lkIEZpZm9Db250cm9sbGVyQmFzZTo6YWR2YW5jZVdyaXRlSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAppbmRleCBkZDVlM2MwLi5lZTI1MDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCkBAIC0zMCw3ICszMSw4IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb1N0cmVhbUxlZ2FjeTo6QXVkaW9TdHJlYW1MZWdhY3koKQotICAgICAgICA6IEF1ZGlvU3RyZWFtKCksIG1EZXZpY2VDYWxsYmFjayhuZXcgU3RyZWFtRGV2aWNlQ2FsbGJhY2sodGhpcykpIHsKKyAgICAgICAgOiBBdWRpb1N0cmVhbSgpCisgICAgICAgICwgbURldmljZUNhbGxiYWNrKG5ldyBTdHJlYW1EZXZpY2VDYWxsYmFjayh0aGlzKSkgewogfQogCiBBdWRpb1N0cmVhbUxlZ2FjeTo6fkF1ZGlvU3RyZWFtTGVnYWN5KCkgewpAQCAtNDYsMzMgKzQ4LDUxIEBACiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5X2NhbGxiYWNrOwogfQogCi0vLyBJbXBsZW1lbnQgRml4ZWRCbG9ja1Byb2Nlc3NvcgotaW50MzJfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25Qcm9jZXNzRml4ZWRCbG9jayh1aW50OF90ICpidWZmZXIsIGludDMyX3QgbnVtQnl0ZXMpIHsKLSAgICBpbnQzMl90IGZyYW1lQ291bnQgPSBudW1CeXRlcyAvIGdldEJ5dGVzUGVyRnJhbWUoKTsKK2ludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6OmNhbGxEYXRhQ2FsbGJhY2tGcmFtZXModWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGlmIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIC8vIEluY3JlbWVudCBiZWZvcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGdvdCB0aGUgZGF0YSBmcm9tIHRoZSBkZXZpY2UuCisgICAgICAgIGluY3JlbWVudEZyYW1lc1JlYWQobnVtRnJhbWVzKTsKKyAgICB9CisKICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgYXBwQ2FsbGJhY2sgPSBnZXREYXRhQ2FsbGJhY2tQcm9jKCk7Ci0gICAgcmV0dXJuICgqYXBwQ2FsbGJhY2spKAorICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0ID0gKCphcHBDYWxsYmFjaykoCiAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCiAgICAgICAgICAgICBnZXREYXRhQ2FsbGJhY2tVc2VyRGF0YSgpLAogICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBudW1GcmFtZXMpOworCisgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUKKyAgICAgICAgICAgICYmIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIC8vIEluY3JlbWVudCBhZnRlciBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGUgZGF0YSB0byB0aGUgZGV2aWNlLgorICAgICAgICBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBjYWxsYmFja1Jlc3VsdDsKK30KKworLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKK2ludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6Om9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSB7CisgICAgaW50MzJfdCBudW1GcmFtZXMgPSBudW1CeXRlcyAvIGdldEJ5dGVzUGVyRnJhbWUoKTsKKyAgICByZXR1cm4gY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIsIG51bUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OnByb2Nlc3NDYWxsYmFja0NvbW1vbihhYXVkaW9fY2FsbGJhY2tfb3BlcmF0aW9uX3Qgb3Bjb2RlLCB2b2lkICppbmZvKSB7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQ7CiAKLSAgICBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBOiB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgICAgICAgICAvLyBBdWRpb1JlY29yZDo6QnVmZmVyCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYXVkaW9CdWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgICAgIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIGFuIEF1ZGlvVHJhY2s6OkJ1ZmZlciBpcyB0aGUgc2FtZSBhcworICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgorICAgICAgICAgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgorICAgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICphdWRpb0J1ZmZlciA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKKyAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEIHx8ICFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgeworICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsgLy8gc2lsZW5jZSB0aGUgYnVmZmVyCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBhbiBleGFjdCBzaXplIHRoZW4gdXNlIGEgYmxvY2sgc2l6ZSBhZGFwdGVyLgogICAgICAgICAgICAgICAgIGlmIChtQmxvY2tBZGFwdGVyICE9IG51bGxwdHIpIHsKQEAgLTgxLDQ0ICsxMDEsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSBhdWRpb0J1ZmZlci0+cmF3LCBieXRlQ291bnQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKCpnZXREYXRhQ2FsbGJhY2tQcm9jKCkpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoKHVpbnQ4X3QgKilhdWRpb0J1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIEZBTEwgVEhST1VHSAogCi0gICAgICAgICAgICAvLyBTdHJlYW0gZ290IHJlcm91dGVkIHNvIHdlIGRpc2Nvbm5lY3QuCi0gICAgICAgIGNhc2UgQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9ESVNDT05ORUNURUQ6IHsKLSAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdHJlYW0gZGlzY29ubmVjdGVkIik7Ci0gICAgICAgICAgICBpZiAoZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAodXBkYXRlU3RhdGVNYWNoaW5lKCkgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgorICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOworICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCisKKwordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpIHsKKyAgICBpZiAobVJlcXVlc3REaXNjb25uZWN0LmlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgQUxPR0QoImNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKSBtUmVxdWVzdERpc2Nvbm5lY3QgYWNrbm93bGVkZ2VkIik7CisgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOworICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QuYWNrbm93bGVkZ2UoKTsKKyAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpmb3JjZURpc2Nvbm5lY3QoKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICBpZiAoZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAoKmdldEVycm9yQ2FsbGJhY2tQcm9jKCkpKAorICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVECisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQorCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1MZWdhY3k6OmdldEJlc3RUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzLApAQCAtMTM2LDggKzE3MSwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IGV4dGVuZGVkVGltZXN0YW1wLT5nZXRCZXN0VGltZXN0YW1wKGZyYW1lUG9zaXRpb24sIHRpbWVOYW5vc2Vjb25kcywgdGltZWJhc2UpOwotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIEV4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbiBsb2NhdGlvbiA9IEV4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fSU5WQUxJRDsKKyAgICBpbnQ2NF90IGxvY2FsUG9zaXRpb247CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXh0ZW5kZWRUaW1lc3RhbXAtPmdldEJlc3RUaW1lc3RhbXAoJmxvY2FsUG9zaXRpb24sIHRpbWVOYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZSwgJmxvY2F0aW9uKTsKKyAgICAvLyB1c2UgTW9ub3RvbmljQ291bnRlciB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgIG1UaW1lc3RhbXBQb3NpdGlvbi51cGRhdGUzMigoaW50MzJfdClsb2NhbFBvc2l0aW9uKTsKKyAgICAqZnJhbWVQb3NpdGlvbiA9IG1UaW1lc3RhbXBQb3NpdGlvbi5nZXQoKTsKKworLy8gICAgQUxPR0QoImdldEJlc3RUaW1lc3RhbXAoKSBmcG9zaXRpb246IHNlcnZlciA9ICU2bGxkLCBrZXJuZWwgPSAlNmxsZCwgbG9jYXRpb24gPSAlZCIsCisvLyAgICAgICAgICAobG9uZyBsb25nKSBleHRlbmRlZFRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fU0VSVkVSXSwKKy8vICAgICAgICAgIChsb25nIGxvbmcpIGV4dGVuZGVkVGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uOjpMT0NBVElPTl9LRVJORUxdLAorLy8gICAgICAgICAgKGludClsb2NhdGlvbik7CisgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCkBAIC0xNDUsMTUgKzE5NSwxOCBAQAogICAgIEFMT0dEKCJvbkF1ZGlvRGV2aWNlVXBkYXRlKCkgZGV2aWNlSWQgJWQiLCAoaW50KWRldmljZUlkKTsKICAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYgZ2V0RGV2aWNlSWQoKSAhPSBkZXZpY2VJZCAmJgogICAgICAgICAgICAgZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBkYXRhIGNhbGxiYWNrIGFuZCB0aGUgc3RyZWFtIGlzIGFjdGl2ZSwgc2VuZCB0aGUgZXJyb3IgY2FsbGJhY2sgZnJvbQotICAgICAgICAvLyBkYXRhIGNhbGxiYWNrIHRocmVhZCB3aGVuIGl0IHNlZXMgdGhlIERJU0NPTk5FQ1RFRCBzdGF0ZQotICAgICAgICBpZiAoIWlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgJiYgZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAoKmdldEVycm9yQ2FsbGJhY2tQcm9jKCkpKAotICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVECi0gICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIC8vIE5vdGUgdGhhdCBpc0RhdGFDYWxsYmFja0FjdGl2ZSgpIGlzIGFmZmVjdGVkIGJ5IHN0YXRlIHNvIGNhbGwgaXQgYmVmb3JlIERJU0NPTk5FQ1RJTkcuCisgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkYXRhIGNhbGxiYWNrIGFuZCB0aGUgc3RyZWFtIGlzIGFjdGl2ZSwgdGhlbiBhc2sgdGhlIGRhdGEgY2FsbGJhY2sKKyAgICAgICAgLy8gdG8gRElTQ09OTkVDVCBhbmQgY2FsbCB0aGUgZXJyb3IgY2FsbGJhY2suCisgICAgICAgIGlmIChpc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIHJlcXVlc3QgRElTQ09OTkVDVCBpbiBkYXRhIGNhbGxiYWNrIGR1ZSB0byBkZXZpY2UgY2hhbmdlIik7CisgICAgICAgICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBkYXRhIGNhbGxiYWNrIGhhcyBhIGNoYW5jZSB0byBoYW5kbGUgdGhlCisgICAgICAgICAgICAvLyByZXF1ZXN0IHRoZW4gdGhlIHJlcXVlc3RTdG9wKCkgYW5kIHJlcXVlc3RQYXVzZSgpIG1ldGhvZHMgd2lsbCBoYW5kbGUgaXQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayBoYXMgc3RvcHBlZC4KKyAgICAgICAgICAgIG1SZXF1ZXN0RGlzY29ubmVjdC5yZXF1ZXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIERJU0NPTk5FQ1QgdGhlIHN0cmVhbSBub3ciKTsKKyAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOwogICAgICAgICB9CiAgICAgfQogICAgIHNldERldmljZUlkKGRldmljZUlkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IGQyZWYzYzcuLjdlMjg1NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW0uaCIKICNpbmNsdWRlICJBQXVkaW9MZWdhY3kuaCIKKyNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuaCIKIAogbmFtZXNwYWNlIGFhdWRpbyB7CkBAIC02Myw2ICs2NCw4IEBACiAKICAgICBhYXVkaW9fbGVnYWN5X2NhbGxiYWNrX3QgZ2V0TGVnYWN5Q2FsbGJhY2soKTsKIAorICAgIGludDMyX3QgY2FsbERhdGFDYWxsYmFja0ZyYW1lcyh1aW50OF90ICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzKTsKKwogICAgIC8vIFRoaXMgaXMgcHVibGljIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgQyBjYWxsYmFjayBmdW5jdGlvbi4KICAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBBdWRpb1RyYWNrL0F1ZGlvUmVjb3JkIGNsaWVudC4KICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgPSAwOwpAQCAtMTA5LDYgKzExMiwxMCBAQAogCiAgICAgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwogCisgICAgdm9pZCBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CisKKyAgICB2b2lkIGZvcmNlRGlzY29ubmVjdCgpOworCiAgICAgdm9pZCBvblN0YXJ0KCkgeyBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOyB9CiAgICAgdm9pZCBvblN0b3AoKSB7IG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOyB9CiAKQEAgLTEyMiwxMSArMTI5LDE0IEBACiAKICAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsKICAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICBtRnJhbWVzUmVhZDsKKyAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICBtVGltZXN0YW1wUG9zaXRpb247CiAKICAgICBGaXhlZEJsb2NrQWRhcHRlciAgICAgICAgICptQmxvY2tBZGFwdGVyID0gbnVsbHB0cjsKICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICBtUG9zaXRpb25XaGVuU3RhcnRpbmcgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0J1ZmZlclNpemUgPSAwOwogICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFN0cmVhbURldmljZUNhbGxiYWNrPiAgIG1EZXZpY2VDYWxsYmFjazsKKworICAgIEF0b21pY1JlcXVlc3RvciAgICAgICAgICAgIG1SZXF1ZXN0RGlzY29ubmVjdDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDhlODA3MGMuLmJjNmU2MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBdWRpb1N0cmVhbVJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMTU5LDYgKzE1OSw5IEBACiAgICAgICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwogICAgIH0KICAgICBzZXRQZXJmb3JtYW5jZU1vZGUoYWN0dWFsUGVyZm9ybWFuY2VNb2RlKTsKKworICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsgLy8gRVhDTFVTSVZFIG1vZGUgbm90IHN1cHBvcnRlZCBpbiBsZWdhY3kKKwogICAgIC8vIExvZyB3YXJuaW5nIGlmIHdlIGRpZCBub3QgZ2V0IHdoYXQgd2UgYXNrZWQgZm9yLgogICAgIEFMT0dXX0lGKGFjdHVhbEZsYWdzICE9IGZsYWdzLAogICAgICAgICAgICAgICJBdWRpb1N0cmVhbVJlY29yZDo6b3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKQEAgLTE3OCwxMSArMTgxLDEyIEBACiB7CiAgICAgLy8gVE9ETyBhZGQgY2xvc2UoKSBvciByZWxlYXNlKCkgdG8gQXVkaW9SZWNvcmQgQVBJIHRoZW4gY2FsbCBpdCBmcm9tIGhlcmUKICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgeworICAgICAgICBtQXVkaW9SZWNvcmQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKICAgICB9CiAgICAgbUZpeGVkQmxvY2tXcml0ZXIuY2xvc2UoKTsKLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIHJldHVybiBBdWRpb1N0cmVhbTo6Y2xvc2UoKTsKIH0KIAogdm9pZCBBdWRpb1N0cmVhbVJlY29yZDo6cHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgewpAQCAtMjA3LDcgKzIxMSw3IEBACiAgICAgaWYgKG1BdWRpb1JlY29yZC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gc28gd2UgY2FuIGRldGVjdCB3aGVuIHRoZSB0cmFjayBpcyBwbGF5aW5nLgorICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcmVjb3JkaW5nLgogICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5TdGFydGluZyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKQEAgLTIzMCwxMiArMjM0LDE1IEBACiAgICAgb25TdG9wKCk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CiAgICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihnZXRGcmFtZXNSZWFkKCkgLSBnZXRGcmFtZXNXcml0dGVuKCkpOyAvLyBUT0RPIHJldmlldworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzUmVhZCgpKTsKICAgICBtQXVkaW9SZWNvcmQtPnN0b3AoKTsKICAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKKyAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjp1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnVwZGF0ZVN0YXRlTWFjaGluZSgpCiB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgcG9zaXRpb247CkBAIC0yOTIsNiArMjk5LDEyIEBACiAgICAgfQogICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KShieXRlc1JlYWQgLyBieXRlc1BlckZyYW1lKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGZyYW1lc1JlYWQpOworCisgICAgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICByZXR1cm4gKGFhdWRpb19yZXN1bHRfdCkgZnJhbWVzUmVhZDsKIH0KIApAQCAtMzI1LDggKzMzOCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldFRpbWVzdGFtcCgmZXh0ZW5kZWRUaW1lc3RhbXApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAoc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIGdldEJlc3RUaW1lc3RhbXAoY2xvY2tJZCwgZnJhbWVQb3NpdGlvbiwgdGltZU5hbm9zZWNvbmRzLCAmZXh0ZW5kZWRUaW1lc3RhbXApOwogfQorCitpbnQ2NF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpnZXRGcmFtZXNXcml0dGVuKCkgeworICAgIGFhdWRpb193cmFwcGluZ19mcmFtZXNfdCBwb3NpdGlvbjsKKyAgICBzdGF0dXNfdCByZXN1bHQ7CisgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKKyAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbi51cGRhdGUzMihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQXVkaW9TdHJlYW1MZWdhY3k6OmdldEZyYW1lc1dyaXR0ZW4oKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCmluZGV4IDJjNmE3ZWIuLmMxNzIzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaApAQCAtNTksOSArNTksMTEgQEAKIAogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAKKyAgICBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZTsKKwogICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19kaXJlY3Rpb25fdCBnZXREaXJlY3Rpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRElSRUNUSU9OX0lOUFVUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCA3N2YzMWUyLi4wZTlhYWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvU3RyZWFtVHJhY2siCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtVHJhY2s6Om9wZW4oKSwgcmVxdWVzdCBub3RpZmljYXRpb25GcmFtZXMgPSAlZCwgZnJhbWVDb3VudCA9ICV1IiwKICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsICh1aW50KWZyYW1lQ291bnQpOwotICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKKyAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7IC8vIFRPRE8gcmV2aWV3CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5zZXRPdXRwdXREZXZpY2UoZ2V0RGV2aWNlSWQoKSk7CiAgICAgfQpAQCAtMTQzLDggKzE0Myw3IEBACiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogICAgIH0KIAotICAgIC8vVHJhY2tQbGF5ZXJCYXNlIGluaXQKLSAgICBpbml0KG1BdWRpb1RyYWNrLmdldCgpLCBQTEFZRVJfVFlQRV9BQVVESU8sIEFVRElPX1VTQUdFX01FRElBKTsKKyAgICBkb1NldFZvbHVtZSgpOwogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7CkBAIC0xNzEsMTggKzE3MCwyMCBAQAogICAgIHNldERldmljZUlkKG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpKTsKICAgICBtQXVkaW9UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOwogCi0gICAgLy8gVXBkYXRlIHBlcmZvcm1hbmNlIG1vZGUgYmFzZWQgb24gdGhlIGFjdHVhbCBzdHJlYW0uCisgICAgLy8gVXBkYXRlIHBlcmZvcm1hbmNlIG1vZGUgYmFzZWQgb24gdGhlIGFjdHVhbCBzdHJlYW0gZmxhZ3MuCiAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBzYW1wbGUgcmF0ZSBpcyBub3QgYWxsb3dlZCB0aGVuIHlvdSB3b24ndCBnZXQgYSBGQVNUIHRyYWNrLgogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGFjdHVhbEZsYWdzID0gbUF1ZGlvVHJhY2stPmdldEZsYWdzKCk7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwotICAgIGlmICgoYWN0dWFsRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykpCi0gICAgICAgID09IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKSkgeworICAgIC8vIFdlIG1heSBub3QgZ2V0IHRoZSBSQVcgZmxhZy4gQnV0IGFzIGxvbmcgYXMgd2UgZ2V0IHRoZSBGQVNUIGZsYWcgd2UgY2FuIGNhbGwgaXQgTE9XX0xBVEVOQ1kuCisgICAgaWYgKChhY3R1YWxGbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICE9IDApIHsKICAgICAgICAgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7Ci0KICAgICB9IGVsc2UgaWYgKChhY3R1YWxGbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7CiAgICAgICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzsKICAgICB9CiAgICAgc2V0UGVyZm9ybWFuY2VNb2RlKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CisKKyAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7IC8vIEVYQ0xVU0lWRSBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gbGVnYWN5CisKICAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KICAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKICAgICAgICAgICAgICAiQXVkaW9TdHJlYW1UcmFjazo6b3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKQEAgLTE5Nyw3ICsxOTgsNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OmNsb3NlKCkKIHsKICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICBkZXN0cm95KCk7CisgICAgICAgIG1BdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKICAgICB9CiAgICAgbUZpeGVkQmxvY2tSZWFkZXIuY2xvc2UoKTsKQEAgLTIyMiwxMSArMjIzLDExIEBACiAgICAgcmV0dXJuOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkKLXsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RhcnQoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKIAogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RhcnQoKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gc28gd2UgY2FuIGRldGVjdCB3aGVuIHRoZSB0cmFjayBpcyBwbGF5aW5nLgpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0KIAotICAgIGVyciA9IHN0YXJ0V2l0aFN0YXR1cygpOworICAgIGVyciA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfSBlbHNlIHsKQEAgLTI0NSwxMSArMjQ2LDExIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpCi17CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7CiAKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfSBlbHNlIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcKICAgICAgICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7CkBAIC0yNTksNyArMjYwLDggQEAKICAgICB9CiAgICAgb25TdG9wKCk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICBwYXVzZSgpOworICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOworICAgIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5QYXVzaW5nKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwpAQCAtMjcxLDE0ICsyNzMsMTcgQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwogCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0gZWxzZSBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgbm90IHBhdXNlZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1JlYWQoZ2V0RnJhbWVzV3JpdHRlbigpIC0gZ2V0RnJhbWVzUmVhZCgpKTsKICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKICAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCkBAIC0yODYsMTcgKzI5MSwyMSBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7CiAKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgb25TdG9wKCk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOyAvLyBUT0RPIHJldmlldwotICAgIHN0b3AoKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1dyaXR0ZW4oKSk7CiAgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CisgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnVwZGF0ZVN0YXRlV2hpbGVXYWl0aW5nKCkKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKQogewogICAgIHN0YXR1c190IGVycjsKICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgcG9zaXRpb247CkBAIC0zNzMsNiArMzgyLDEyIEBACiAgICAgfQogICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IChpbnQzMl90KShieXRlc1dyaXR0ZW4gLyBieXRlc1BlckZyYW1lKTsKICAgICBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKGZyYW1lc1dyaXR0ZW4pOworCisgICAgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIApAQCAtNDMxLDggKzQ0Niw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV4dGVuZGVkVGltZXN0YW1wOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAoJmV4dGVuZGVkVGltZXN0YW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfSBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gZ2V0QmVzdFRpbWVzdGFtcChjbG9ja0lkLCBmcmFtZVBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsICZleHRlbmRlZFRpbWVzdGFtcCk7CisgICAgaW50NjRfdCBwb3NpdGlvbiA9IDA7CisgICAgaW50NjRfdCBuYW5vc2Vjb25kcyA9IDA7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldEJlc3RUaW1lc3RhbXAoY2xvY2tJZCwgJnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW5vc2Vjb25kcywgJmV4dGVuZGVkVGltZXN0YW1wKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBpZiAocG9zaXRpb24gPCBnZXRGcmFtZXNXcml0dGVuKCkpIHsKKyAgICAgICAgICAgICpmcmFtZVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICAqdGltZU5hbm9zZWNvbmRzID0gbmFub3NlY29uZHM7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOyAvLyBUT0RPIHJldmlldywgZG9jdW1lbnRlZCBidXQgbm90IGNvbnNpc3RlbnQKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQorCitzdGF0dXNfdCBBdWRpb1N0cmVhbVRyYWNrOjpkb1NldFZvbHVtZSgpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19JTklUOworICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGZsb2F0IHZvbHVtZSA9IGdldER1Y2tBbmRNdXRlVm9sdW1lKCk7CisgICAgICAgIG1BdWRpb1RyYWNrLT5zZXRWb2x1bWUodm9sdW1lLCB2b2x1bWUpOworICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjsKKworYmluZGVyOjpTdGF0dXMgQXVkaW9TdHJlYW1UcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgeworCisgICAgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBzcENvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOworICAgIHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiBzcE9wZXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbihvcGVyYXRpb24pOworCisgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoImFwcGx5Vm9sdW1lU2hhcGVyKCkgZnJvbSBJUGxheWVyIik7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihzcENvbmZpZ3VyYXRpb24sIHNwT3BlcmF0aW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsgLy8gYSBub24tbmVnYXRpdmUgdmFsdWUgaXMgdGhlIHZvbHVtZSBzaGFwZXIgaWQuCisgICAgICAgICAgICBBTE9HRSgiYXBwbHlWb2x1bWVTaGFwZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiYXBwbHlWb2x1bWVTaGFwZXIoKSIKKyAgICAgICAgICAgICAgICAgICAgICAiIG5vIEF1ZGlvVHJhY2sgZm9yIHZvbHVtZSBjb250cm9sIGZyb20gSVBsYXllciIpOworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKaW5kZXggZmY0MjllYS4uYTg3MWRiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPG1lZGlhL1RyYWNrUGxheWVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUJ1aWxkZXIuaCIKQEAgLTMyLDcgKzMzLDcgQEAKIC8qKgogICogSW50ZXJuYWwgc3RyZWFtIHRoYXQgdXNlcyB0aGUgbGVnYWN5IEF1ZGlvVHJhY2sgcGF0aC4KICAqLwotY2xhc3MgQXVkaW9TdHJlYW1UcmFjayA6IHB1YmxpYyBBdWRpb1N0cmVhbUxlZ2FjeSwgcHVibGljIGFuZHJvaWQ6OlRyYWNrUGxheWVyQmFzZSB7CitjbGFzcyBBdWRpb1N0cmVhbVRyYWNrIDogcHVibGljIEF1ZGlvU3RyZWFtTGVnYWN5IHsKIHB1YmxpYzoKICAgICBBdWRpb1N0cmVhbVRyYWNrKCk7CiAKQEAgLTY3LDcgKzY4LDcgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIH0KIAotICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKIAogICAgIC8vIFRoaXMgaXMgcHVibGljIHNvIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgQyBjYWxsYmFjayBmdW5jdGlvbi4KICAgICB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIG92ZXJyaWRlOwpAQCAtNzYsMTMgKzc3LDIyIEBACiAgICAgICAgIHJldHVybiBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKGZyYW1lcyk7CiAgICAgfQogCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgZG9TZXRWb2x1bWUoKSBvdmVycmlkZTsKKworI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgorICAgIHZpcnR1YWwgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIG92ZXJyaWRlOworI2VuZGlmCisKIHByaXZhdGU6CiAKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKKwogICAgIC8vIGFkYXB0cyBiZXR3ZWVuIHZhcmlhYmxlIHNpemVkIGJsb2NrcyBhbmQgZml4ZWQgc2l6ZSBibG9ja3MKICAgICBGaXhlZEJsb2NrUmVhZGVyICAgICAgICAgICAgICAgICBtRml4ZWRCbG9ja1JlYWRlcjsKIAotICAgIC8vIFRPRE8gYWRkIDY0LWJpdCBwb3NpdGlvbiByZXBvcnRpbmcgdG8gQXVkaW9SZWNvcmQgYW5kIHVzZSBpdC4KLSAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICAgICAgICBtUG9zaXRpb25XaGVuU3RhcnRpbmcgPSAwOworICAgIC8vIFRPRE8gYWRkIDY0LWJpdCBwb3NpdGlvbiByZXBvcnRpbmcgdG8gQXVkaW9UcmFjayBhbmQgdXNlIGl0LgogICAgIGFhdWRpb193cmFwcGluZ19mcmFtZXNfdCAgICAgICAgIG1Qb3NpdGlvbldoZW5QYXVzaW5nID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAppbmRleCBhY2QzMTliLi4zYWZhOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCkBAIC0yNTgsNCArMjU4LDExMiBAQAogICAgIH0KIH0KIAorCisvKioKKyAqIFNpbXBsZSBkb3VibGUgYnVmZmVyIGZvciBhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSB3cml0dGVuIG9jY2FzaW9uYWxseSBhbmQgcmVhZCBvY2Nhc2lvbmFsbHkuCisgKiBUaGlzIGFsbG93cyBhIFNJTkdMRSB3cml0ZXIgd2l0aCBtdWx0aXBsZSByZWFkZXJzLgorICoKKyAqIEl0IGlzIE9LIGlmIHRoZSBGSUZPIG92ZXJmbG93cyBhbmQgd2UgbG9zZSBvbGQgdmFsdWVzLgorICogSXQgaXMgYWxzbyBPSyBpZiB3ZSByZWFkIGFuIG9sZCB2YWx1ZS4KKyAqIFRocmVhZCBtYXkgcmV0dXJuIGEgbm9uLWF0b21pYyByZXN1bHQgaWYgdGhlIG90aGVyIHRocmVhZCBpcyByYXBpZGx5IHdyaXRpbmcKKyAqIG5ldyB2YWx1ZXMgb24gYW5vdGhlciBjb3JlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFNpbXBsZURvdWJsZUJ1ZmZlciB7CitwdWJsaWM6CisgICAgU2ltcGxlRG91YmxlQnVmZmVyKCkKKyAgICAgICAgICAgIDogbVZhbHVlcygpIHt9CisKKyAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyAgICB2b2lkIHdyaXRlKFQgdmFsdWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gbUNvdW50ZXIubG9hZCgpICYgMTsKKyAgICAgICAgbVZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgbUNvdW50ZXIrKzsgLy8gSW5jcmVtZW50IEFGVEVSIHVwZGF0aW5nIHN0b3JhZ2UsIE9LIGlmIGl0IHdyYXBzLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBzYW1lIHRocmVhZCB0aGF0IGNhbGxzIHdyaXRlKCkgb3Igd2hlbgorICAgICAqIG5vIG90aGVyIHRocmVhZCBpcyBjYWxsaW5nIHdyaXRlLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1Db3VudGVyLnN0b3JlKDApOworICAgIH0KKworICAgIFQgcmVhZCgpIGNvbnN0IHsKKyAgICAgICAgVCByZXN1bHQ7CisgICAgICAgIGludCBiZWZvcmU7CisgICAgICAgIGludCBhZnRlcjsKKyAgICAgICAgaW50IHRpbWVvdXQgPSAzOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYSB3cml0ZSBvY2N1cnJlZCB3aGlsZSB3ZXJlIHJlYWRpbmcuCisgICAgICAgICAgICBiZWZvcmUgPSBtQ291bnRlci5sb2FkKCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAoYmVmb3JlICYgMSkgXiAxOworICAgICAgICAgICAgcmVzdWx0ID0gbVZhbHVlc1tpbmRleF07CisgICAgICAgICAgICBhZnRlciA9IG1Db3VudGVyLmxvYWQoKTsKKyAgICAgICAgfSB3aGlsZSAoKGFmdGVyICE9IGJlZm9yZSkgJiYgKGFmdGVyID4gMCkgJiYgKC0tdGltZW91dCA+IDApKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIHZhbHVlIGhhcyBiZWVuIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ291bnRlci5sb2FkKCkgPiAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBUICAgICAgICAgICAgICAgICAgICBtVmFsdWVzWzJdOworICAgIHN0ZDo6YXRvbWljPGludD4gICAgIG1Db3VudGVyezB9OworfTsKKworY2xhc3MgVGltZXN0YW1wIHsKK3B1YmxpYzoKKyAgICBUaW1lc3RhbXAoKQorICAgICAgICAgICAgOiBtUG9zaXRpb24oMCkKKyAgICAgICAgICAgICwgbU5hbm9zZWNvbmRzKDApIHt9CisgICAgVGltZXN0YW1wKGludDY0X3QgcG9zaXRpb24sIGludDY0X3QgbmFub3NlY29uZHMpCisgICAgICAgICAgICA6IG1Qb3NpdGlvbihwb3NpdGlvbikKKyAgICAgICAgICAgICwgbU5hbm9zZWNvbmRzKG5hbm9zZWNvbmRzKSB7fQorCisgICAgaW50NjRfdCBnZXRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1Qb3NpdGlvbjsgfQorCisgICAgaW50NjRfdCBnZXROYW5vc2Vjb25kcygpIGNvbnN0IHsgcmV0dXJuIG1OYW5vc2Vjb25kczsgfQorCitwcml2YXRlOgorICAgIC8vIFRoZXNlIGNhbm5vdCBiZSBjb25zdCBiZWNhdXNlIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoZSBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgaW50NjRfdCBtUG9zaXRpb247CisgICAgaW50NjRfdCBtTmFub3NlY29uZHM7Cit9OworCisKKy8qKgorICogUGFzcyBhIHJlcXVlc3QgdG8gYW5vdGhlciB0aHJlYWQuCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBvbmUgdGhyZWFkLCBBLCB3YW50cyBhbm90aGVyIHRocmVhZCwgQiwgdG8gZG8gc29tZXRoaW5nLgorICogQSBuYWl2ZSBhcHByb2FjaCB3b3VsZCBiZSBmb3IgQSB0byBzZXQgYSBmbGFnIGFuZCBmb3IgQiB0byBjbGVhciBpdCB3aGVuIGRvbmUuCisgKiBCdXQgdGhhdCBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24uIFRoaXMgdGVjaG5pcXVlIGF2b2lkcyB0aGUgcmFjZSBjb25kaXRpb24uCisgKgorICogQXNzdW1lcyBvbmx5IG9uZSByZXF1ZXN0ZXIgYW5kIG9uZSBhY2tub3dsZWRnZXIuCisgKi8KK2NsYXNzIEF0b21pY1JlcXVlc3RvciB7CitwdWJsaWM6CisKKyAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyAgICB2b2lkIHJlcXVlc3QoKSB7CisgICAgICAgIG1SZXF1ZXN0ZWQrKzsKKyAgICB9CisKKyAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyAgICBib29sIGlzUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gKG1SZXF1ZXN0ZWQubG9hZCgpIC0gbUFja25vd2xlZGdlZC5sb2FkKCkpID4gMDsKKyAgICB9CisKKyAgICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyAgICB2b2lkIGFja25vd2xlZGdlKCkgeworICAgICAgICBtQWNrbm93bGVkZ2VkKys7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6YXRvbWljPGludD4gbVJlcXVlc3RlZHswfTsKKyAgICBzdGQ6OmF0b21pYzxpbnQ+IG1BY2tub3dsZWRnZWR7MH07Cit9OwogI2VuZGlmIC8vVVRJTElUWV9BQVVESU9fVVRJTElUSUVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZTk1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotCi0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgIkFBdWRpb1V0aWxpdGllcy5oIgotI2luY2x1ZGUgIkhhbmRsZVRyYWNrZXIuaCIKLQotdXNpbmcgYW5kcm9pZDo6TXV0ZXg7Ci0KLS8vIEhhbmRsZSBmb3JtYXQgaXM6IHRnZ2dpaWlpCi0vLyB3aGVyZSBlYWNoIGxldHRlciBpcyA0IGJpdHMsIHQ9dHlwZSwgZz1nZW5lcmF0aW9uLCBpPWluZGV4Ci0KLSNkZWZpbmUgVFlQRV9TSVpFICAgICAgICAgICA0Ci0jZGVmaW5lIEdFTkVSQVRJT05fU0laRSAgICAxMgotI2RlZmluZSBJTkRFWF9TSVpFICAgICAgICAgMTYKLQotI2RlZmluZSBHRU5FUkFUSU9OX0lOVkFMSUQgIDAKLSNkZWZpbmUgR0VORVJBVElPTl9TSElGVCAgICBJTkRFWF9TSVpFCi0KLSNkZWZpbmUgVFlQRV9NQVNLICAgICAgICAgICAoKDEgPDwgVFlQRV9TSVpFKSAtIDEpCi0jZGVmaW5lIEdFTkVSQVRJT05fTUFTSyAgICAgKCgxIDw8IEdFTkVSQVRJT05fU0laRSkgLSAxKQotI2RlZmluZSBJTkRFWF9NQVNLICAgICAgICAgICgoMSA8PCBJTkRFWF9TSVpFKSAtIDEpCi0KLSNkZWZpbmUgU0xPVF9VTkFWQUlMQUJMRSAgICAoLTEpCi0KLS8vIEVycm9yIGlmIGhhbmRsZSBpcyBuZWdhdGl2ZSBzbyB0eXBlIGlzIGxpbWl0ZWQgdG8gYm90dG9tIGhhbGYuCi0jZGVmaW5lIEhBTkRMRV9JTlZBTElEX1RZUEUgVFlQRV9NQVNLCi0KLXN0YXRpY19hc3NlcnQoSEFORExFX1RSQUNLRVJfTUFYX1RZUEVTID09ICgxIDw8IChUWVBFX1NJWkUgLSAxKSksCi0gICAgIk1pc21hdGNoIGJldHdlZW4gaGVhZGVyIGFuZCBjcHAuIik7Ci1zdGF0aWNfYXNzZXJ0KEhBTkRMRV9UUkFDS0VSX01BWF9IQU5ETEVTID09ICgxIDw8IChJTkRFWF9TSVpFKSksCi0gICAgIk1pc21hdGNoIGJldHdlZW4gaGVhZGVyIGFuZCBjcHAuIik7Ci0KLUhhbmRsZVRyYWNrZXI6OkhhbmRsZVRyYWNrZXIodWludDMyX3QgbWF4SGFuZGxlcykKLSAgICAgICAgOiBtTWF4SGFuZGxlQ291bnQobWF4SGFuZGxlcykKLSAgICAgICAgLCBtSGFuZGxlSGVhZGVycyhudWxscHRyKQotewotICAgIGFzc2VydChtYXhIYW5kbGVzIDw9IEhBTkRMRV9UUkFDS0VSX01BWF9IQU5ETEVTKTsKLSAgICAvLyBBbGxvY2F0ZSBhcnJheXMgdG8gaG9sZCBhZGRyZXNzZXMgYW5kIHZhbGlkYXRpb24gaW5mby4KLSAgICBtSGFuZGxlQWRkcmVzc2VzID0gKGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCAqKQotICAgICAgICAgICAgbmV3KHN0ZDo6bm90aHJvdykgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190W21heEhhbmRsZXNdOwotICAgIGlmIChtSGFuZGxlQWRkcmVzc2VzICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhhbmRsZUhlYWRlcnMgPSBuZXcoc3RkOjpub3Rocm93KSBoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdFttYXhIYW5kbGVzXTsKLQotICAgICAgICBpZiAobUhhbmRsZUhlYWRlcnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgaW5pdGlhbEhlYWRlciA9IGJ1aWxkSGVhZGVyKDAsIDEpOwotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBsaW5rZWQgbGlzdCBvZiBmcmVlIG5vZGVzLiBudWxscHRyIHRlcm1pbmF0ZWQuCi0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgKG1heEhhbmRsZXMgLSAxKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZUFkZHJlc3Nlc1tpXSA9ICZtSGFuZGxlQWRkcmVzc2VzW2kgKyAxXTsgLy8gcG9pbnQgdG8gbmV4dCBub2RlCi0gICAgICAgICAgICAgICAgbUhhbmRsZUhlYWRlcnNbaV0gPSBpbml0aWFsSGVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5leHRGcmVlQWRkcmVzcyA9ICZtSGFuZGxlQWRkcmVzc2VzWzBdOwotICAgICAgICAgICAgbUhhbmRsZUFkZHJlc3Nlc1ttYXhIYW5kbGVzIC0gMV0gPSBudWxscHRyOwotICAgICAgICAgICAgbUhhbmRsZUhlYWRlcnNbbWF4SGFuZGxlcyAtIDFdID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlbGV0ZVtdIG1IYW5kbGVBZGRyZXNzZXM7IC8vIHNvIHRoZSBjbGFzcyBhcHBlYXJzIHVuaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIG1IYW5kbGVBZGRyZXNzZXMgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgfQotfQotCi1IYW5kbGVUcmFja2VyOjp+SGFuZGxlVHJhY2tlcigpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBkZWxldGVbXSBtSGFuZGxlQWRkcmVzc2VzOwotICAgIGRlbGV0ZVtdIG1IYW5kbGVIZWFkZXJzOwotICAgIG1IYW5kbGVBZGRyZXNzZXMgPSBudWxscHRyOwotfQotCi1ib29sIEhhbmRsZVRyYWNrZXI6OmlzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IYW5kbGVBZGRyZXNzZXMgIT0gbnVsbHB0cjsKLX0KLQotCi0KLXN0ZDo6c3RyaW5nIEhhbmRsZVRyYWNrZXI6OmR1bXAoKSBjb25zdCB7Ci0gICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgcmV0dXJuICJIYW5kbGVUcmFja2VyIGlzIG5vdCBpbml0aWFsaXplZFxuIjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCi0gICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtTG9jay50cnlMb2NrKCk7IH0gLyogZiAqLywKLSAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAotICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7Ci0gICAgaWYgKCFpc0xvY2tlZCkgewotICAgICAgICByZXN1bHQgPDwgIkhhbmRsZVRyYWNrZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci0gICAgfQotCi0gICAgcmVzdWx0IDw8ICJIYW5kbGVUcmFja2VyOlxuIjsKLSAgICByZXN1bHQgPDwgIiAgSGFuZGxlSGVhZGVyczpcbiI7Ci0gICAgLy8gYXRMaW5lU3RhcnQoKSBjYW4gYmUgY2hhbmdlZCB0byBzdXBwb3J0IGFuIGFyYml0cmFyeSBsaW5lIGJyZWFraW5nIGFsZ29yaXRobTsKLSAgICAvLyBpdCBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBhIG5ldyBsaW5lIHN0YXJ0cy4KLSAgICAvLyBGb3Igc2ltcGxpY2l0eSwgd2Ugd2lsbCB1c2UgYSBjb25zdGFudCAxNiBpdGVtcyBwZXIgbGluZS4KLSAgICBjb25zdCBhdXRvIGF0TGluZVN0YXJ0ID0gW10oaW50IGluZGV4KSAtPiBib29sIHsKLSAgICAgICAgLy8gTWFnaWMgY29uc3RhbnQgb2YgMHhmIHVzZWQgZm9yIG1hc2sgdG8gZGV0ZWN0IHN0YXJ0IGV2ZXJ5IDE2IGl0ZW1zLgotICAgICAgICByZXR1cm4gKGluZGV4ICYgMHhmKSA9PSAwOyB9OwotICAgIGNvbnN0IGF1dG8gYXRMaW5lRW5kID0gW3RoaXMsICZhdExpbmVTdGFydF0oaW50IGluZGV4KSAtPiBib29sIHsKLSAgICAgICAgcmV0dXJuIGF0TGluZVN0YXJ0KGluZGV4ICsgMSkgfHwgaW5kZXggPT0gbU1heEhhbmRsZUNvdW50IC0gMTsgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1heEhhbmRsZUNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGF0TGluZVN0YXJ0KGkpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPDwgIiAgICAiOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldHcoNCkgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgbUhhbmRsZUhlYWRlcnNbaV0KLSAgICAgICAgICAgICAgIDw8IChhdExpbmVFbmQoaSkgPyAiXG4iIDogIiAiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNMb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuc3RyKCk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX3Nsb3RfdCBIYW5kbGVUcmFja2VyOjphbGxvY2F0ZVNsb3RfbCgpIHsKLSAgICB2b2lkICoqYWxsb2NhdGVkID0gbU5leHRGcmVlQWRkcmVzczsKLSAgICBpZiAoYWxsb2NhdGVkID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIFNMT1RfVU5BVkFJTEFCTEU7Ci0gICAgfQotICAgIC8vIFJlbW92ZSB0aGlzIHNsb3QgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlua2VkIGxpc3QuCi0gICAgbU5leHRGcmVlQWRkcmVzcyA9ICh2b2lkICoqKSAqYWxsb2NhdGVkOwotICAgIHJldHVybiAoYWxsb2NhdGVkIC0gbUhhbmRsZUFkZHJlc3Nlcyk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBIYW5kbGVUcmFja2VyOjpuZXh0R2VuZXJhdGlvbl9sKGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCkgewotICAgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uID0gKG1IYW5kbGVIZWFkZXJzW2luZGV4XSArIDEpICYgR0VORVJBVElPTl9NQVNLOwotICAgIC8vIEF2b2lkIGdlbmVyYXRpb24gemVybyBzbyB0aGF0IDB4MCBpcyBub3QgYSB2YWxpZCBoYW5kbGUuCi0gICAgaWYgKGdlbmVyYXRpb24gPT0gR0VORVJBVElPTl9JTlZBTElEKSB7Ci0gICAgICAgIGdlbmVyYXRpb24rKzsKLSAgICB9Ci0gICAgcmV0dXJuIGdlbmVyYXRpb247Ci19Ci0KLWFhdWRpb19oYW5kbGVfdCBIYW5kbGVUcmFja2VyOjpwdXQoaGFuZGxlX3RyYWNrZXJfdHlwZV90IHR5cGUsIHZvaWQgKmFkZHJlc3MpCi17Ci0gICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gSEFORExFX1RSQUNLRVJfTUFYX1RZUEVTKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxhYXVkaW9faGFuZGxlX3Q+KEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0UpOwotICAgIH0KLSAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfTk9fTUVNT1JZKTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgLy8gRmluZCBhbiBlbXB0eSBzbG90LgotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCA9IGFsbG9jYXRlU2xvdF9sKCk7Ci0gICAgaWYgKGluZGV4ID09IFNMT1RfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgQUxPR0UoIkhhbmRsZVRyYWNrZXI6OnB1dCgpIG5vIHJvb20gZm9yIG1vcmUgaGFuZGxlcyIpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfTk9fRlJFRV9IQU5ETEVTKTsKLSAgICB9Ci0KLSAgICAvLyBDeWNsZSB0aGUgZ2VuZXJhdGlvbiBjb3VudGVyIHNvIHN0YWxlIGhhbmRsZXMgY2FuIGJlIGRldGVjdGVkLgotICAgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uID0gbmV4dEdlbmVyYXRpb25fbChpbmRleCk7IC8vIHJlYWRzIGhlYWRlciB0YWJsZQotICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGlucHV0SGVhZGVyID0gYnVpbGRIZWFkZXIodHlwZSwgZ2VuZXJhdGlvbik7Ci0KLSAgICAvLyBUaGVzZSB0d28gd3JpdGVzIG1heSBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IG90aGVyIHRocmVhZHMgb3IgY29yZXMgZHVyaW5nIGdldCgpLgotICAgIG1IYW5kbGVIZWFkZXJzW2luZGV4XSA9IGlucHV0SGVhZGVyOwotICAgIG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdID0gYWRkcmVzczsKLSAgICAvLyBUT0RPIHVzZSBzdG9yZSByZWxlYXNlIHRvIGVuZm9yY2UgbWVtb3J5IG9yZGVyIHdpdGggZ2V0KCkKLQotICAgIC8vIEdlbmVyYXRlIGEgaGFuZGxlLgotICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBidWlsZEhhbmRsZShpbnB1dEhlYWRlciwgaW5kZXgpOwotCi0gICAgQUxPR1YoIkhhbmRsZVRyYWNrZXI6OnB1dCglcCkgcmV0dXJucyAweCUwOHgiLCBhZGRyZXNzLCBoYW5kbGUpOwotICAgIHJldHVybiBoYW5kbGU7Ci19Ci0KLWhhbmRsZV90cmFja2VyX3Nsb3RfdCBIYW5kbGVUcmFja2VyOjpoYW5kbGVUb0luZGV4KGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKLXsKLSAgICAvLyBWYWxpZGF0ZSB0aGUgaGFuZGxlLgotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCA9IGV4dHJhY3RJbmRleChoYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSBtTWF4SGFuZGxlQ291bnQpIHsKLSAgICAgICAgQUxPR0UoIkhhbmRsZVRyYWNrZXI6OmhhbmRsZVRvSW5kZXgoKSBpbnZhbGlkIGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxhYXVkaW9faGFuZGxlX3Q+KEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7Ci0gICAgfQotICAgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBoYW5kbGVHZW5lcmF0aW9uID0gZXh0cmFjdEdlbmVyYXRpb24oaGFuZGxlKTsKLSAgICBoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCBpbnB1dEhlYWRlciA9IGJ1aWxkSGVhZGVyKHR5cGUsIGhhbmRsZUdlbmVyYXRpb24pOwotICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIHN5bmNocm9uaXplIHRoaXMgYWNjZXNzIHRvIG1IYW5kbGVIZWFkZXJzIGJlY2F1c2UgaXQgaXMgY29uc3RhbnQgZm9yCi0gICAgLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBoYW5kbGUuCi0gICAgaWYgKGlucHV0SGVhZGVyICE9IG1IYW5kbGVIZWFkZXJzW2luZGV4XSkgewotICAgICAgICBBTE9HRSgiSGFuZGxlVHJhY2tlcjo6aGFuZGxlVG9JbmRleCgpIGlucHV0SGVhZGVyID0gMHglMDh4ICE9IG1IYW5kbGVIZWFkZXJzWyVkXSA9IDB4JTA4eCIsCi0gICAgICAgICAgICAgaW5wdXRIZWFkZXIsIGluZGV4LCBtSGFuZGxlSGVhZGVyc1tpbmRleF0pOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0KLWhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBIYW5kbGVUcmFja2VyOjpnZXQoaGFuZGxlX3RyYWNrZXJfdHlwZV90IHR5cGUsIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0Ci17Ci0gICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCA9IGhhbmRsZVRvSW5kZXgodHlwZSwgaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBzeW5jaHJvbml6ZSB0aGlzIGFjY2VzcyB0byBtSGFuZGxlSGVhZGVycyBiZWNhdXNlIHRoaXMgc2xvdAotICAgICAgICAvLyBpcyBhbGxvY2F0ZWQgYW5kLCB0aGVyZWZvcmUsIG5vdCBwYXJ0IG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBmcmVlIHNsb3RzLgotICAgICAgICByZXR1cm4gbUhhbmRsZUFkZHJlc3Nlc1tpbmRleF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1oYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgSGFuZGxlVHJhY2tlcjo6cmVtb3ZlKGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSB7Ci0gICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCA9IGhhbmRsZVRvSW5kZXgodHlwZSxoYW5kbGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBhZGRyZXNzID0gbUhhbmRsZUFkZHJlc3Nlc1tpbmRleF07Ci0KLSAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgaGVhZGVyIHR5cGUgYnV0IHByZXNlcnZlIHRoZSBnZW5lcmF0aW9uIGNvdW50LgotICAgICAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbiA9IG1IYW5kbGVIZWFkZXJzW2luZGV4XSAmIEdFTkVSQVRJT05fTUFTSzsKLSAgICAgICAgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgaW5wdXRIZWFkZXIgPSBidWlsZEhlYWRlcigKLSAgICAgICAgICAgICAgICAoaGFuZGxlX3RyYWNrZXJfdHlwZV90KSBIQU5ETEVfSU5WQUxJRF9UWVBFLCBnZW5lcmF0aW9uKTsKLSAgICAgICAgbUhhbmRsZUhlYWRlcnNbaW5kZXhdID0gaW5wdXRIZWFkZXI7Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgc2xvdCB0byB0aGUgaGVhZCBvZiB0aGUgbGlua2VkIGxpc3QuCi0gICAgICAgIG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdID0gbU5leHRGcmVlQWRkcmVzczsKLSAgICAgICAgbU5leHRGcmVlQWRkcmVzcyA9IChoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgKikgJm1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdOwotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLWFhdWRpb19oYW5kbGVfdCBIYW5kbGVUcmFja2VyOjpidWlsZEhhbmRsZShoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCB0eXBlR2VuZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3RyYWNrZXJfc2xvdF90IGluZGV4KSB7Ci0gICAgcmV0dXJuIChhYXVkaW9faGFuZGxlX3QpKCh0eXBlR2VuZXJhdGlvbiA8PCBHRU5FUkFUSU9OX1NISUZUKSB8IChpbmRleCAmIElOREVYX01BU0spKTsKLX0KLQotaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgSGFuZGxlVHJhY2tlcjo6YnVpbGRIZWFkZXIoaGFuZGxlX3RyYWNrZXJfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbikKLXsKLSAgICByZXR1cm4gKGhhbmRsZV90cmFja2VyX2hlYWRlcl90KSAoKCh0eXBlICYgVFlQRV9NQVNLKSA8PCBHRU5FUkFUSU9OX1NJWkUpCi0gICAgICAgIHwgKGdlbmVyYXRpb24gJiBHRU5FUkFUSU9OX01BU0spKTsKLX0KLQotaGFuZGxlX3RyYWNrZXJfc2xvdF90IEhhbmRsZVRyYWNrZXI6OmV4dHJhY3RJbmRleChhYXVkaW9faGFuZGxlX3QgaGFuZGxlKQotewotICAgIHJldHVybiBoYW5kbGUgJiBJTkRFWF9NQVNLOwotfQotCi1oYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgSGFuZGxlVHJhY2tlcjo6ZXh0cmFjdEdlbmVyYXRpb24oYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICByZXR1cm4gKGhhbmRsZSA+PiBHRU5FUkFUSU9OX1NISUZUKSAmIEdFTkVSQVRJT05fTUFTSzsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM1MWMwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBVVElMSVRZX0hBTkRMRV9UUkFDS0VSX0gKLSNkZWZpbmUgVVRJTElUWV9IQU5ETEVfVFJBQ0tFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotdHlwZWRlZiBpbnQzMl90ICBhYXVkaW9faGFuZGxlX3Q7Ci10eXBlZGVmIGludDMyX3QgIGhhbmRsZV90cmFja2VyX3R5cGVfdDsgICAgICAgLy8gd2hhdCBraW5kIG9mIGhhbmRsZQotdHlwZWRlZiBpbnQzMl90ICBoYW5kbGVfdHJhY2tlcl9zbG90X3Q7ICAgICAgIC8vIGluZGV4IGluIGFsbG9jYXRpb24gdGFibGUKLXR5cGVkZWYgaW50MzJfdCAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90OyAvLyBpbmNyZW1lbnRlZCB3aGVuIHNsb3QgdXNlZAotdHlwZWRlZiB1aW50MTZfdCBoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdDsgICAgIC8vIGNvbWJpbmVzIHR5cGUgYW5kIGdlbmVyYXRpb24KLXR5cGVkZWYgdm9pZCAgICAqaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190OyAgICAvLyBhZGRyZXNzIG9mIHNvbWV0aGluZyB0aGF0IGlzIHN0b3JlZCBoZXJlCi0KLSNkZWZpbmUgSEFORExFX1RSQUNLRVJfTUFYX1RZUEVTICAgICgxIDw8IDMpCi0jZGVmaW5lIEhBTkRMRV9UUkFDS0VSX01BWF9IQU5ETEVTICAoMSA8PCAxNikKLQotLyoqCi0gKiBSZXByZXNlbnQgT2JqZWN0cyB1c2luZyBhbiBpbnRlZ2VyIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggSmF2YS4KLSAqIFRoaXMgYWxzbyBtYWtlcyB0aGUgJ0MnIEFCSSBtb3JlIHJvYnVzdC4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCi0gKiBJZiB5b3UgY2FsbCBpdCBmcm9tIG1vcmUgdGhhbiBvbmUgdGhyZWFkIHRoZW4geW91IG5lZWQgdG8gdXNlIHlvdXIgb3duIG11dGV4LgotICovCi1jbGFzcyBIYW5kbGVUcmFja2VyIHsKLQotcHVibGljOgotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYXhIYW5kbGVzIGNhbm5vdCBleGNlZWQgSEFORExFX1RSQUNLRVJfTUFYX0hBTkRMRVMKLSAgICAgKi8KLSAgICBIYW5kbGVUcmFja2VyKHVpbnQzMl90IG1heEhhbmRsZXMgPSAyNTYpOwotICAgIHZpcnR1YWwgfkhhbmRsZVRyYWNrZXIoKTsKLQotICAgIC8qKgotICAgICAqIERvbid0IHVzZSBpZiB0aGlzIHJldHVybnMgZmFsc2U7Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbnRlcm5hbCBhbGxvY2F0aW9uIHN1Y2NlZWRlZAotICAgICAqLwotICAgIGJvb2wgaXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBIYW5kbGVUcmFja2VyIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogV2lsbCBhdHRlbXB0IHRvIGdldCB0aGUgb2JqZWN0IGxvY2ssIGJ1dCB3aWxsIHByb2NlZWQKLSAgICAgKiBldmVuIGlmIGl0IGNhbm5vdC4KLSAgICAgKgotICAgICAqIEVhY2ggbGluZSBvZiBpbmZvcm1hdGlvbiBlbmRzIHdpdGggYSBuZXdsaW5lLgotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIEhhbmRsZVRyYWNrZXIgaW5mby4KLSAgICAgKi8KLSAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZSBhIHBvaW50ZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBwb2ludGVyLgotICAgICAqCi0gICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHB1dCgpIG9yIHJlbW92ZSgpIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSB0cmFja2VkCi0gICAgICogQHBhcmFtIGFkZHJlc3MgcG9pbnRlciB0byBiZSBjb252ZXJ0ZWQgdG8gYSBoYW5kbGUKLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgaGFuZGxlIG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAgICAgKi8KLSAgICBhYXVkaW9faGFuZGxlX3QgcHV0KGhhbmRsZV90cmFja2VyX3R5cGVfdCBleHBlY3RlZFR5cGUsIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBhZGRyZXNzKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3JpZ2luYWwgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgICAgKiBUaGUgaGFuZGxlIHdpbGwgYmUgdmFsaWRhdGVkIHRvIHByZXZlbnQgc3RhbGUgaGFuZGxlcyBmcm9tIGJlaW5nIHJldXNlZC4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgZGVzaWduZWQgdG8gcHJldmVudCBjb21tb24gY29kaW5nIGVycm9ycyBhbmQgbm90Ci0gICAgICogdG8gcHJldmVudCBkZWxpYmVyYXRlIGhhY2tpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHNob3VsZG1hdGNoIHRoZSB0eXBlIHdlIHBhc3NlZCB0byBwdXQoKQotICAgICAqIEBwYXJhbSBoYW5kbGUgdG8gYmUgY29udmVydGVkIHRvIGEgcG9pbnRlcgotICAgICAqIEByZXR1cm4gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaGFuZGxlIG9yIG51bGxwdHIKLSAgICAgKi8KLSAgICBoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgZ2V0KGhhbmRsZV90cmFja2VyX3R5cGVfdCBleHBlY3RlZFR5cGUsIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogRnJlZSB1cCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgICAgKiBTdWJzZXF1ZW50IGF0dGVtcHRzIHRvIHVzZSB0aGUgaGFuZGxlIHdpbGwgZmFpbC4KLSAgICAgKgotICAgICAqIERvIE5PVCByZW1vdmUoKSBhIGhhbmRsZSB3aGlsZSBnZXQoKSBpcyBiZWluZyBjYWxsZWQgZm9yIHRoZSBzYW1lIGhhbmRsZSBmcm9tIGFub3RoZXIgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBzaG91bGRtYXRjaCB0aGUgdHlwZSB3ZSBwYXNzZWQgdG8gcHV0KCkKLSAgICAgKiBAcGFyYW0gaGFuZGxlIHRvIGJlIHJlbW92ZWQgZnJvbSB0cmFja2luZwotICAgICAqIEByZXR1cm4gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaGFuZGxlIG9yIG51bGxwdHIgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IHJlbW92ZShoYW5kbGVfdHJhY2tlcl90eXBlX3QgZXhwZWN0ZWRUeXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKTsKLQotcHJpdmF0ZToKLSAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgICAgbU1heEhhbmRsZUNvdW50OyAgIC8vIHNpemUgb2YgYXJyYXkKLSAgICAvLyBUaGlzIGFkZHJlc3MgaXMgY29uc3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190ICAqIG1IYW5kbGVBZGRyZXNzZXM7ICAvLyBhZGRyZXNzIG9mIG9iamVjdHMgb3IgYSBmcmVlIGxpbmtlZCBsaXN0IG5vZGUKLSAgICAvLyBUaGlzIGFkZHJlc3MgaXMgY29uc3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgICAqIG1IYW5kbGVIZWFkZXJzOyAgICAvLyBjb21iaW5hdGlvbiBvZiB0eXBlIGFuZCBnZW5lcmF0aW9uCi0gICAgLy8gaGVhZCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBub2RlcyBpbiBtSGFuZGxlQWRkcmVzc2VzCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190ICAqIG1OZXh0RnJlZUFkZHJlc3M7Ci0KLSAgICAvLyBUaGlzIE11dGV4IHByb3RlY3RzIHRoZSBsaW5rZWQgbGlzdCBvZiBmcmVlIG5vZGVzLgotICAgIC8vIFRoZSBsaXN0IGlzIG1hbmFnZWQgdXNpbmcgbUhhbmRsZUFkZHJlc3NlcyBhbmQgbU5leHRGcmVlQWRkcmVzcy4KLSAgICAvLyBUaGUgZGF0YSBpbiBtSGFuZGxlSGVhZGVycyBpcyBvbmx5IGNoYW5nZWQgYnkgcHV0KCkgYW5kIHJlbW92ZSgpLgotICAgIG11dGFibGUgYW5kcm9pZDo6TXV0ZXggICAgICBtTG9jazsKLQotICAgIC8qKgotICAgICAqIFB1bGwgc2xvdCBvZmYgb2YgYSBsaXN0IG9mIGVtcHR5IHNsb3RzLgotICAgICAqIEByZXR1cm4gaW5kZXggb3IgYSBuZWdhdGl2ZSBlcnJvcgotICAgICAqLwotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBhbGxvY2F0ZVNsb3RfbCgpOwotCi0gICAgLyoqCi0gICAgICogSW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGZvciB0aGUgc2xvdCwgYXZvaWRpbmcgemVyby4KLSAgICAgKi8KLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgbmV4dEdlbmVyYXRpb25fbChoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIGhhbmRsZSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4LgotICAgICAqIEByZXR1cm4gc2xvdCBpbmRleCBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfc2xvdF90IGhhbmRsZVRvSW5kZXgoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaGFuZGxlX3RyYWNrZXJfdHlwZV90IHR5cGUpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgaGFuZGxlIGZyb20gYSBoZWFkZXIgYW5kIGFuIGluZGV4LgotICAgICAqIEBwYXJhbSBoZWFkZXIgY29tYmluYXRpb24gb2YgYSB0eXBlIGFuZCBhIGdlbmVyYXRpb24KLSAgICAgKiBAcGFyYW0gaW5kZXggc2xvdCBpbmRleCByZXR1cm5lZCBmcm9tIGFsbG9jYXRlU2xvdAotICAgICAqIEByZXR1cm4gaGFuZGxlIG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAgICAgKi8KLSAgICBzdGF0aWMgYWF1ZGlvX2hhbmRsZV90IGJ1aWxkSGFuZGxlKGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGhlYWRlciwgaGFuZGxlX3RyYWNrZXJfc2xvdF90IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIENvbWJpbmUgYSB0eXBlIGFuZCBhIGdlbmVyYXRpb24gZmllbGQgaW50byBhIGhlYWRlci4KLSAgICAgKi8KLSAgICBzdGF0aWMgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgYnVpbGRIZWFkZXIoaGFuZGxlX3RyYWNrZXJfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IGdlbmVyYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgaW5kZXggZnJvbSBhIGhhbmRsZS4KLSAgICAgKiBEb2VzIG5vdCB2YWxpZGF0ZSB0aGUgaGFuZGxlLgotICAgICAqIEByZXR1cm4gaW5kZXggYXNzb2NpYXRlZCB3aXRoIGEgaGFuZGxlCi0gICAgICovCi0gICAgc3RhdGljIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBleHRyYWN0SW5kZXgoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBnZW5lcmF0aW9uIGZyb20gYSBoYW5kbGUuCi0gICAgICogRG9lcyBub3QgdmFsaWRhdGUgdGhlIGhhbmRsZS4KLSAgICAgKiBAcmV0dXJuIGdlbmVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgaGFuZGxlCi0gICAgICovCi0gICAgc3RhdGljIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBleHRyYWN0R2VuZXJhdGlvbihhYXVkaW9faGFuZGxlX3QgaGFuZGxlKTsKLQotfTsKLQotI2VuZGlmIC8vVVRJTElUWV9IQU5ETEVfVFJBQ0tFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAppbmRleCA4MWQ3Zjg5Li41ODMzZWFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKQEAgLTQxLDYgKzQxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogc2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyCisgICAgICovCisgICAgdm9pZCBzZXQoaW50NjRfdCBjb3VudGVyKSB7CisgICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkdmFuY2UgdGhlIGNvdW50ZXIgaWYgZGVsdGEgaXMgcG9zaXRpdmUuCiAgICAgICogQHJldHVybiBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyCiAgICAgICovCkBAIC04Miw2ICs4OSwxOCBAQAogICAgICAgICBtQ291bnRlcjMyID0gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSb3VuZCA2NC1iaXQgY291bnRlciB1cCB0byBhIG11bHRpcGxlIG9mIHRoZSBwZXJpb2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGVyaW9kIG1pZ2h0IGJlLCBmb3IgZXhhbXBsZSwgYSBidWZmZXIgY2FwYWNpdHkKKyAgICAgKi8KKyAgICB2b2lkIHJvdW5kVXA2NChpbnQzMl90IHBlcmlvZCkgeworICAgICAgICBpZiAocGVyaW9kID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBudW1QZXJpb2RzID0gKG1Db3VudGVyNjQgKyBwZXJpb2QgLSAxKSAvIHBlcmlvZDsKKyAgICAgICAgICAgIG1Db3VudGVyNjQgPSBudW1QZXJpb2RzICogcGVyaW9kOworICAgICAgICB9CisgICAgfQorCiBwcml2YXRlOgogICAgIGludDY0X3QgbUNvdW50ZXI2NCA9IDA7CiAgICAgaW50MzJfdCBtQ291bnRlcjMyID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZTRlZWYwNi4uODExNzE4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTUsMTYgKzUsNiBAQAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9oYW5kbGVfdHJhY2tlci5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9oYW5kbGVfdHJhY2tlcgotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwogTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9tYXJzaGFsbGluZy5jcHAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKIExPQ0FMX01PRFVMRSA6PSB0ZXN0X2FhdWRpb19tYXJzaGFsbGluZwpAQCAtMzQsNiArMjQsMTcgQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCisgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMKK0xPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfdGltZXN0YW1wcy5jcHAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCitMT0NBTF9NT0RVTEUgOj0gdGVzdF90aW1lc3RhbXBzCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCiBMT0NBTF9TUkNfRklMRVM6PSB0ZXN0X2xpbmVhcl9yYW1wLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KQEAgLTc5LDMgKzgwLDEzIEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCiBMT0NBTF9NT0RVTEUgOj0gdGVzdF9uX3N0cmVhbXMKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKK0xPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfYXRvbWljX2ZpZm8uY3BwCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCitMT0NBTF9NT0RVTEUgOj0gdGVzdF9hdG9taWNfZmlmbworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZGZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCisjaW5jbHVkZSAiZmlmby9GaWZvQ29udHJvbGxlci5oIgorCit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwordXNpbmcgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3Q7Cit1c2luZyBhbmRyb2lkOjpGaWZvQ29udHJvbGxlcjsKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKKworVEVTVCh0ZXN0X2ZpZm9fY29udHJvbGxlciwgZmlmb19pbmRpY2VzKSB7CisgICAgLy8gVmFsdWVzIGFyZSBhcmJpdHJhcnkgcHJpbWVzIGRlc2lnbmVkIHRvIHRyaWdnZXIgZWRnZSBjYXNlcy4KKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gODM7CisgICAgY29uc3RleHByIGludCB0aHJlc2hvbGQgPSA0NzsKKyAgICBGaWZvQ29udHJvbGxlciAgIGZpZm9Db250cm9sbGVyKGNhcGFjaXR5LCB0aHJlc2hvbGQpOworICAgIEFTU0VSVF9FUShjYXBhY2l0eSwgZmlmb0NvbnRyb2xsZXIuZ2V0Q2FwYWNpdHkoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCwgZmlmb0NvbnRyb2xsZXIuZ2V0VGhyZXNob2xkKCkpOworCisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldFJlYWRDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUNvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCwgZmlmb0NvbnRyb2xsZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSk7CisKKyAgICAvLyBQcmV0ZW5kIHRvIHdyaXRlIHNvbWUgZGF0YS4KKyAgICBjb25zdGV4cHIgaW50IGFkdmFuY2UxID0gMjM7CisgICAgZmlmb0NvbnRyb2xsZXIuYWR2YW5jZVdyaXRlSW5kZXgoYWR2YW5jZTEpOworICAgIGludCBhZHZhbmNlZCA9IGFkdmFuY2UxOworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZEluZGV4KCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCAtIGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpKTsKKworICAgIC8vIFByZXRlbmQgdG8gcmVhZCB0aGUgZGF0YS4KKyAgICBmaWZvQ29udHJvbGxlci5hZHZhbmNlUmVhZEluZGV4KGFkdmFuY2UxKTsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldFJlYWRDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZEluZGV4KCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVJbmRleCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpKTsKKyAgICBBU1NFUlRfRVEodGhyZXNob2xkLCBmaWZvQ29udHJvbGxlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpKTsKKworICAgIC8vIFdyaXRlIHBhc3QgZW5kIG9mIGJ1ZmZlci4KKyAgICBjb25zdGV4cHIgaW50IGFkdmFuY2UyID0gMTMgKyBjYXBhY2l0eSAtIGFkdmFuY2UxOworICAgIGZpZm9Db250cm9sbGVyLmFkdmFuY2VXcml0ZUluZGV4KGFkdmFuY2UyKTsKKyAgICBhZHZhbmNlZCArPSBhZHZhbmNlMjsKKyAgICBBU1NFUlRfRVEoYWR2YW5jZTEsIGZpZm9Db250cm9sbGVyLmdldFJlYWRDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlMSwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZEluZGV4KCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCAtIGNhcGFjaXR5LCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUluZGV4KCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlMiwgZmlmb0NvbnRyb2xsZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpKTsKKyAgICBBU1NFUlRfRVEodGhyZXNob2xkIC0gYWR2YW5jZTIsIGZpZm9Db250cm9sbGVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkpOworfQorCitURVNUKHRlc3RfZmlmb19jb250cm9sbGVyLCBmaWZvX3dyYXBfYXJvdW5kX3plcm8pIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNzsgLy8gYXJiaXRyYXJ5IHByaW1lCisgICAgY29uc3RleHByIGludCB0aHJlc2hvbGQgPSBjYXBhY2l0eTsKKyAgICBGaWZvQ29udHJvbGxlciBmaWZvQ29udHJvbGxlcihjYXBhY2l0eSwgdGhyZXNob2xkKTsKKyAgICBBU1NFUlRfRVEoY2FwYWNpdHksIGZpZm9Db250cm9sbGVyLmdldENhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQsIGZpZm9Db250cm9sbGVyLmdldFRocmVzaG9sZCgpKTsKKworICAgIGZpZm9Db250cm9sbGVyLnNldFJlYWRDb3VudGVyKC0xMCk7IC8vIGEgYml0IGxlc3MgdGhhbiBuZWdhdGl2ZSBjYXBhY2l0eQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoaSAtIDEwLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkQ291bnRlcigpKTsKKyAgICAgICAgRVhQRUNUX0dFKGZpZm9Db250cm9sbGVyLmdldFJlYWRJbmRleCgpLCAwKTsKKyAgICAgICAgRVhQRUNUX0xUKGZpZm9Db250cm9sbGVyLmdldFJlYWRJbmRleCgpLCBjYXBhY2l0eSk7CisgICAgICAgIGZpZm9Db250cm9sbGVyLmFkdmFuY2VSZWFkSW5kZXgoMSk7CisgICAgfQorCisgICAgZmlmb0NvbnRyb2xsZXIuc2V0V3JpdGVDb3VudGVyKC0xMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShpIC0gMTAsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlQ291bnRlcigpKTsKKyAgICAgICAgRVhQRUNUX0dFKGZpZm9Db250cm9sbGVyLmdldFdyaXRlSW5kZXgoKSwgMCk7CisgICAgICAgIEVYUEVDVF9MVChmaWZvQ29udHJvbGxlci5nZXRXcml0ZUluZGV4KCksIGNhcGFjaXR5KTsKKyAgICAgICAgZmlmb0NvbnRyb2xsZXIuYWR2YW5jZVdyaXRlSW5kZXgoMSk7CisgICAgfQorfQorCisKKy8vIFRPRE8gY29uc2lkZXIgdXNpbmcgYSB0ZW1wbGF0ZSBmb3Igb3RoZXIgZGF0YSB0eXBlcy4KKworLy8gQ3JlYXRlIGEgYmlnIGFycmF5IGFuZCB0aGVuIHVzZSBhIHJlZ2lvbiBpbiB0aGUgbWlkZGxlIGZvciB0aGUgIHVuaXQgdGVzdHMuCisvLyBUaGVuIHdlIGNhbiBzY2FuIHRoZSByZXN0IG9mIHRoZSBhcnJheSB0byBzZWUgaWYgaXQgZ290IGNsb2JiZXJlZC4KK3N0YXRpYyBjb25zdGV4cHIgZmlmb19mcmFtZXNfdCBrQmlnQXJyYXlTaXplID0gMTAyNDsKK3N0YXRpYyBjb25zdGV4cHIgZmlmb19mcmFtZXNfdCBrRmlmb0RhdGFPZmZzZXQgPSAxMjg7IC8vIHN0YXJ0aW5nIGluZGV4IG9mIEZJRk8gZGF0YQorc3RhdGljIGNvbnN0ZXhwciBpbnQxNl90ICAgICAgIGtTYWZlRGF0YVZhbHVlID0gMHg3NjU0OyAvLyBvcmlnaW5hbCB2YWx1ZSBvZiBCaWdBcnJheQorCitjbGFzcyBUZXN0Rmlmb0J1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgVGVzdEZpZm9CdWZmZXIoZmlmb19mcmFtZXNfdCBjYXBhY2l0eSwgZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQgPSAwKQorICAgICAgICA6IG1GaWZvQnVmZmVyKHNpemVvZihpbnQxNl90KSwgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgJm1SZWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgJm1Xcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICZtVmVyeUJpZ0FycmF5W2tGaWZvRGF0YU9mZnNldF0pIC8vIGFkZHJlc3Mgb2Ygc3RhcnQgb2YgRklGTyBkYXRhCisgICAgeworCisgICAgICAgIC8vIEFzc3VtZSBhIGZyYW1lIGlzIG9uZSBpbnQxNl90LgorICAgICAgICAvLyBGb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAgICAgICAgaWYgKHRocmVzaG9sZCA8PSAwKSB7CisgICAgICAgICAgICB0aHJlc2hvbGQgPSBjYXBhY2l0eTsKKyAgICAgICAgfQorICAgICAgICBtRmlmb0J1ZmZlci5zZXRUaHJlc2hvbGQodGhyZXNob2xkKTsKKyAgICAgICAgbVRocmVzaG9sZCA9IHRocmVzaG9sZDsKKworICAgICAgICBmb3IgKGZpZm9fZnJhbWVzX3QgaSA9IDA7IGkgPCBrQmlnQXJyYXlTaXplOyBpKyspIHsKKyAgICAgICAgICAgIG1WZXJ5QmlnQXJyYXlbaV0gPSBrU2FmZURhdGFWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2hlY2tNaXNjKCkgeworICAgICAgICBBU1NFUlRfRVEoKGludDMyX3QpKDIgKiBzaXplb2YoaW50MTZfdCkpLCBtRmlmb0J1ZmZlci5jb252ZXJ0RnJhbWVzVG9CeXRlcygyKSk7CisgICAgICAgIEFTU0VSVF9FUShtVGhyZXNob2xkLCBtRmlmb0J1ZmZlci5nZXRUaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlBZGRyZXNzSW5SYW5nZSh2b2lkICpwLCB2b2lkICp2YWxpZCwgc2l6ZV90IG51bUJ5dGVzKSB7CisgICAgICAgIHVpbnRwdHJfdCBwX2ludCA9ICh1aW50cHRyX3QpIHA7CisgICAgICAgIHVpbnRwdHJfdCB2YWxpZF9pbnQgPSAodWludHB0cl90KSB2YWxpZDsKKyAgICAgICAgRVhQRUNUX0dFKHBfaW50LCB2YWxpZF9pbnQpOworICAgICAgICBFWFBFQ1RfTFQocF9pbnQsICh2YWxpZF9pbnQgKyBudW1CeXRlcykpOworICAgIH0KKworICAgIHZvaWQgdmVyaWZ5U3RvcmFnZUludGVncml0eSgpIHsKKyAgICAgICAgZm9yIChmaWZvX2ZyYW1lc190IGkgPSAwOyBpIDwga0ZpZm9EYXRhT2Zmc2V0OyBpKyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtVmVyeUJpZ0FycmF5W2ldLCBrU2FmZURhdGFWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lQWZ0ZXIgPSBrRmlmb0RhdGFPZmZzZXQgKyBtRmlmb0J1ZmZlci5nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCk7CisgICAgICAgIGZvciAoZmlmb19mcmFtZXNfdCBpID0gZmlyc3RGcmFtZUFmdGVyOyBpIDwga0JpZ0FycmF5U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobVZlcnlCaWdBcnJheVtpXSwga1NhZmVEYXRhVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGF2YWlsYWJsZSBmcmFtZXMgaW4gZWFjaCBwYXJ0IGFkZCB1cCBjb3JyZWN0bHkuCisgICAgdm9pZCB2ZXJpZnlXcmFwcGluZ0J1ZmZlcigpIHsKKyAgICAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7CisKKworICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPworICAgICAgICAvLyBGb3IgRW1wdHlSb29tCisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RW1wdHlSb29tQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIHdyYXBBdmFpbGFibGUpOworICAgICAgICBmaWZvX2ZyYW1lc190IGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIGJvdGhBdmFpbGFibGUpOworICAgICAgICAvLyBGb3IgRnVsbERhdGEKKyAgICAgICAgZnJhbWVzQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CisgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CisgICAgICAgIEVYUEVDVF9FUShmcmFtZXNBdmFpbGFibGUsIGJvdGhBdmFpbGFibGUpOworCisgICAgICAgIC8vIEFyZSBmcmFtZSBjb3VudHMgaW4gbGVnYWwgcmFuZ2U/CisgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmb0J1ZmZlci5nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCk7CisgICAgICAgIEVYUEVDVF9HRSh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0sIDApOworICAgICAgICBFWFBFQ1RfTEUod3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdLCBjYXBhY2l0eSk7CisgICAgICAgIEVYUEVDVF9HRSh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV0sIDApOworICAgICAgICBFWFBFQ1RfTEUod3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdLCBjYXBhY2l0eSk7CisKKyAgICAgICAgLy8gQXJlIGFkZHJlc3NlcyB3aXRoaW4gdGhlIEZJRk8gZGF0YSBhcmVhPworICAgICAgICBzaXplX3QgdmFsaWRCeXRlcyA9IGNhcGFjaXR5ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAod3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdKSB7CisgICAgICAgICAgICB2ZXJpZnlBZGRyZXNzSW5SYW5nZSh3cmFwcGluZ0J1ZmZlci5kYXRhWzBdLCBtRmlmb1N0b3JhZ2UsIHZhbGlkQnl0ZXMpOworICAgICAgICAgICAgdWludDhfdCAqbGFzdCA9ICgodWludDhfdCAqKXdyYXBwaW5nQnVmZmVyLmRhdGFbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRmlmb0J1ZmZlci5jb252ZXJ0RnJhbWVzVG9CeXRlcyh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0pIC0gMTsKKyAgICAgICAgICAgIHZlcmlmeUFkZHJlc3NJblJhbmdlKGxhc3QsIG1GaWZvU3RvcmFnZSwgdmFsaWRCeXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXSkgeworICAgICAgICAgICAgdmVyaWZ5QWRkcmVzc0luUmFuZ2Uod3JhcHBpbmdCdWZmZXIuZGF0YVsxXSwgbUZpZm9TdG9yYWdlLCB2YWxpZEJ5dGVzKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmxhc3QgPSAoKHVpbnQ4X3QgKil3cmFwcGluZ0J1ZmZlci5kYXRhWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZpZm9CdWZmZXIuY29udmVydEZyYW1lc1RvQnl0ZXMod3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdKSAtIDE7CisgICAgICAgICAgICB2ZXJpZnlBZGRyZXNzSW5SYW5nZShsYXN0LCBtRmlmb1N0b3JhZ2UsIHZhbGlkQnl0ZXMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCisgICAgdm9pZCB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9Xcml0ZSA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1dyaXRlOyBpKyspIHsKKyAgICAgICAgICAgIG1EYXRhW2ldID0gbU5leHRXcml0ZUluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci53cml0ZShtRGF0YSwgZnJhbWVzVG9Xcml0ZSk7CisgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1dyaXRlLCBhY3R1YWwpOworICAgIH0KKworICAgIC8vIFJlYWQgd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIERvIG5vdCB1bmRlcmZsb3cuCisgICAgdm9pZCB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CisgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1JlYWQsIGFjdHVhbCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9SZWFkOyBpKyspIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShtTmV4dFZlcmlmeUluZGV4KyssIG1EYXRhW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMKKyAgICB2b2lkIHZlcmlmeVJlcXVlc3RlZERhdGEoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgIEFTU0VSVF9MRShudW1GcmFtZXMsIGZyYW1lc0F2YWlsYWJsZSk7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CisgICAgICAgIEFTU0VSVF9FUShhY3R1YWwsIG51bUZyYW1lcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsOyBpKyspIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShtTmV4dFZlcmlmeUluZGV4KyssIG1EYXRhW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyYXAgYXJvdW5kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICB2b2lkIGNoZWNrV3JhcHBpbmdXcml0ZVJlYWQoKSB7CisgICAgICAgIGNvbnN0ZXhwciBpbnQgZnJhbWVzMSA9IDQzOworICAgICAgICBjb25zdGV4cHIgaW50IGZyYW1lczIgPSAxNTsKKworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmcmFtZXMxKTsKKyAgICAgICAgdmVyaWZ5V3JhcHBpbmdCdWZmZXIoKTsKKyAgICAgICAgdmVyaWZ5UmVxdWVzdGVkRGF0YShmcmFtZXMxKTsKKyAgICAgICAgdmVyaWZ5V3JhcHBpbmdCdWZmZXIoKTsKKworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5V3JhcHBpbmdCdWZmZXIoKTsKKyAgICAgICAgdmVyaWZ5UmVxdWVzdGVkRGF0YShmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5V3JhcHBpbmdCdWZmZXIoKTsKKworICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgYW5kIFJlYWQgYSBzcGVjaWZpYyBhbW91bnQgb2YgZGF0YS4KKyAgICB2b2lkIGNoZWNrV3JpdGVSZWFkKCkgeworICAgICAgICBjb25zdCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5ID0gbUZpZm9CdWZmZXIuZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgICAgICAvLyBXcmFwIGFyb3VuZCB3aXRoIHRoZSBzbWFsbGVyIHJlZ2lvbiBpbiB0aGUgc2Vjb25kIGhhbGYuCisgICAgICAgIGNvbnN0IGludCBmcmFtZXMxID0gY2FwYWNpdHkgLSA0OworICAgICAgICBjb25zdCBpbnQgZnJhbWVzMiA9IDc7IC8vIGFyYml0cmFyeSwgc21hbGwKKyAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoZnJhbWVzMSk7CisgICAgICAgIHZlcmlmeVJlcXVlc3RlZERhdGEoZnJhbWVzMSk7CisgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZyYW1lczIpOworICAgICAgICB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZyYW1lczIpOworCisgICAgICAgIHZlcmlmeVN0b3JhZ2VJbnRlZ3JpdHkoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBhbmQgUmVhZCBhIHNwZWNpZmljIGFtb3VudCBvZiBkYXRhLgorICAgIHZvaWQgY2hlY2tXcml0ZVJlYWRTbWFsbExhcmdlKCkgeworICAgICAgICBjb25zdCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5ID0gbUZpZm9CdWZmZXIuZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgICAgICAvLyBXcmFwIGFyb3VuZCB3aXRoIHRoZSBsYXJnZXIgcmVnaW9uIGluIHRoZSBzZWNvbmQgaGFsZi4KKyAgICAgICAgY29uc3QgaW50IGZyYW1lczEgPSBjYXBhY2l0eSAtIDQ7CisgICAgICAgIGNvbnN0IGludCBmcmFtZXMyID0gY2FwYWNpdHkgLSA5OyAvLyBhcmJpdHJhcnksIGxhcmdlCisgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZyYW1lczEpOworICAgICAgICB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZyYW1lczEpOworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5UmVxdWVzdGVkRGF0YShmcmFtZXMyKTsKKworICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CisgICAgfQorCisgICAgLy8gUmFuZG9tbHkgcmVhZCBvciB3cml0ZSB1cCB0byB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YS4KKyAgICB2b2lkIGNoZWNrUmFuZG9tV3JpdGVSZWFkKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRW1wdHkgPQorICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0VtcHR5KTsKKyAgICAgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CisKKyAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRnVsbCA9CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRnVsbCk7CisgICAgICAgICAgICB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZlcmlmeVN0b3JhZ2VJbnRlZ3JpdHkoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBhbmQgUmVhZCBhIHNwZWNpZmljIGFtb3VudCBvZiBkYXRhLgorICAgIHZvaWQgY2hlY2tOZWdhdGl2ZUNvdW50ZXJzKCkgeworICAgICAgICBmaWZvX2NvdW50ZXJfdCBjb3VudGVyID0gLTk4NzY7CisgICAgICAgIG1GaWZvQnVmZmVyLnNldFdyaXRlQ291bnRlcihjb3VudGVyKTsKKyAgICAgICAgbUZpZm9CdWZmZXIuc2V0UmVhZENvdW50ZXIoY291bnRlcik7CisgICAgICAgIGNoZWNrV3JhcHBpbmdXcml0ZVJlYWQoKTsKKyAgICB9CisKKyAgICAvLyBXcmFwIG92ZXIgdGhlIGJvdW5kYXJ5IGF0IDB4N0ZGRkZGRkZGRkZGRkZGRgorICAgIC8vIE5vdGUgdGhhdCB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgb3ZlcmZsb3cgaXMgdGVjaG5pY2FsbHkgdW5kZWZpbmVkLgorICAgIHZvaWQgY2hlY2tIYWxmV3JhcCgpIHsKKyAgICAgICAgZmlmb19jb3VudGVyX3QgY291bnRlciA9IElOVDY0X01BWCAtIDEwOworICAgICAgICBtRmlmb0J1ZmZlci5zZXRXcml0ZUNvdW50ZXIoY291bnRlcik7CisgICAgICAgIG1GaWZvQnVmZmVyLnNldFJlYWRDb3VudGVyKGNvdW50ZXIpOworICAgICAgICBBU1NFUlRfR1QobUZpZm9CdWZmZXIuZ2V0V3JpdGVDb3VudGVyKCksIDApOworICAgICAgICBjaGVja1dyYXBwaW5nV3JpdGVSZWFkKCk7CisgICAgICAgIEFTU0VSVF9MVChtRmlmb0J1ZmZlci5nZXRXcml0ZUNvdW50ZXIoKSwgMCk7IC8vIGRpZCB3ZSB3cmFwIHBhc3QgSU5UNjRfTUFYPworICAgIH0KKworICAgIC8vIFdyYXAgb3ZlciB0aGUgYm91bmRhcnkgYXQgMHhGRkZGRkZGRkZGRkZGRkZGCisgICAgdm9pZCBjaGVja0Z1bGxXcmFwKCkgeworICAgICAgICBmaWZvX2NvdW50ZXJfdCBjb3VudGVyID0gLTEwOworICAgICAgICBtRmlmb0J1ZmZlci5zZXRXcml0ZUNvdW50ZXIoY291bnRlcik7CisgICAgICAgIG1GaWZvQnVmZmVyLnNldFJlYWRDb3VudGVyKGNvdW50ZXIpOworICAgICAgICBBU1NFUlRfTFQobUZpZm9CdWZmZXIuZ2V0V3JpdGVDb3VudGVyKCksIDApOworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcygyMCk7CisgICAgICAgIEFTU0VSVF9HVChtRmlmb0J1ZmZlci5nZXRXcml0ZUNvdW50ZXIoKSwgMCk7IC8vIGRpZCB3ZSB3cmFwIHBhc3QgemVybz8KKyAgICAgICAgdmVyaWZ5U3RvcmFnZUludGVncml0eSgpOworICAgIH0KKworICAgIEZpZm9CdWZmZXIgICAgIG1GaWZvQnVmZmVyOworICAgIGZpZm9fZnJhbWVzX3QgIG1OZXh0V3JpdGVJbmRleCA9IDA7CisgICAgZmlmb19mcmFtZXNfdCAgbU5leHRWZXJpZnlJbmRleCA9IDA7CisgICAgZmlmb19mcmFtZXNfdCAgbVRocmVzaG9sZDsKKworICAgIGZpZm9fY291bnRlcl90IG1SZWFkSW5kZXggPSAwOworICAgIGZpZm9fY291bnRlcl90IG1Xcml0ZUluZGV4ID0gMDsKKyAgICBpbnQxNl90ICAgICAgICBtVmVyeUJpZ0FycmF5W2tCaWdBcnJheVNpemVdOyAvLyBVc2UgdGhlIG1pZGRsZSBvZiB0aGlzIGFycmF5IGZvciB0aGUgRklGTy4KKyAgICBpbnQxNl90ICAgICAgICptRmlmb1N0b3JhZ2UgPSAmbVZlcnlCaWdBcnJheVtrRmlmb0RhdGFPZmZzZXRdOyAvLyBTdGFydCBoZXJlIGZvciBzdG9yYWdlLgorICAgIGludDE2X3QgICAgICAgIG1EYXRhW2tCaWdBcnJheVNpemVde307Cit9OworCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fd3JpdGVfcmVhZCkgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA1MTsgLy8gYXJiaXRyYXJ5CisgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5KTsKKyAgICB0ZXN0ZXIuY2hlY2tNaXNjKCk7CisgICAgdGVzdGVyLmNoZWNrV3JpdGVSZWFkKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb193cmFwcGluZ193cml0ZV9yZWFkKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDU5OyAvLyBhcmJpdHJhcnksIGEgbGl0dGxlIGJpZ2dlciB0aGlzIHRpbWUKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja1dyYXBwaW5nV3JpdGVSZWFkKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19yZWFkX3dyaXRlX3NtYWxsX2xhcmdlKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDUxOyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja1dyaXRlUmVhZFNtYWxsTGFyZ2UoKTsKK30KKworVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3JhbmRvbV9yZWFkX3dyaXRlKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDUxOyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja1JhbmRvbVdyaXRlUmVhZCgpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fcmFuZG9tX3RocmVzaG9sZCkgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA2NzsgLy8gYXJiaXRyYXJ5CisgICAgY29uc3RleHByIGludCB0aHJlc2hvbGQgPSAzNzsgLy8gYXJiaXRyYXJ5CisgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5LCB0aHJlc2hvbGQpOworICAgIHRlc3Rlci5jaGVja1JhbmRvbVdyaXRlUmVhZCgpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fbmVnYXRpdmVfY291bnRlcnMpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNDk7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrTmVnYXRpdmVDb3VudGVycygpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9faGFsZl93cmFwKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDU3OyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja0hhbGZXcmFwKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19mdWxsX3dyYXApIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTc7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrRnVsbFdyYXAoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2hhbmRsZV90cmFja2VyLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2hhbmRsZV90cmFja2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYjQ3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9oYW5kbGVfdHJhY2tlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFVuaXQgdGVzdHMgZm9yIEFBdWRpbyBIYW5kbGUgVHJhY2tlcgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCIKLQotLy8gVGVzdCBhZGRpbmcgb25lIGFkZHJlc3MuCi1URVNUKHRlc3RfaGFuZGxlX3RyYWNrZXIsIGFhdWRpb19oYW5kbGVfdHJhY2tlcikgewotICAgIGNvbnN0IGludCBNQVhfSEFORExFUyA9IDQ7Ci0gICAgSGFuZGxlVHJhY2tlciB0cmFja2VyKE1BWF9IQU5ETEVTKTsKLSAgICBoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSA9IDM7IC8vIGFyYml0cmFyeSBnZW5lcmljIHR5cGUKLSAgICBpbnQgZGF0YTsgLy8gc29tZXRoaW5nIHRoYXQgaGFzIGFuIGFkZHJlc3Mgd2UgY2FuIHVzZQotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBmb3VuZDsKLQotICAgIC8vIHJlcGVhdCB0aGUgdGVzdCBzZXZlcmFsIHRpbWVzIHRvIHNlZSBpZiBpdCBicmVha3MKLSAgICBjb25zdCBpbnQgU0VWRVJBTCA9IDU7IC8vIGFyYml0cmFyeQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0VWRVJBTDsgaSsrKSB7Ci0gICAgICAgIC8vIHNob3VsZCBmYWlsIHRvIGZpbmQgYSBib2d1cyBoYW5kbGUKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCAwKTsgIC8vIGJhZCBoYW5kbGUKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIGZvdW5kKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSB2YWxpZCBoYW5kbGUgYW5kIHVzZSBpdCB0byBsb29rdXAgdGhlIG9iamVjdCBhZ2FpbgotICAgICAgICBhYXVkaW9faGFuZGxlX3QgZGF0YUhhbmRsZSA9IHRyYWNrZXIucHV0KHR5cGUsICZkYXRhKTsKLSAgICAgICAgQVNTRVJUX1RSVUUoZGF0YUhhbmRsZSA+IDApOwotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGEsIGZvdW5kKTsKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCAwKTsgLy8gYmFkIGhhbmRsZQotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIHdyb25nIHR5cGUKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlKzEsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIHJlbW92ZSBmcm9tIHN0b3JhZ2UKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLnJlbW92ZSh0eXBlLCBkYXRhSGFuZGxlKTsKLSAgICAgICAgRVhQRUNUX0VRKCZkYXRhLCBmb3VuZCk7Ci0gICAgICAgIC8vIHNob3VsZCBmYWlsIHRoZSBzZWNvbmQgdGltZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotICAgIH0KLX0KLQotLy8gVGVzdCBmaWxsaW5nIHRoZSB0cmFja2VyLgotVEVTVCh0ZXN0X2hhbmRsZV90cmFja2VyLCBhYXVkaW9fZnVsbF91cCkgewotICAgIGNvbnN0IGludCBNQVhfSEFORExFUyA9IDU7Ci0gICAgSGFuZGxlVHJhY2tlciB0cmFja2VyKE1BWF9IQU5ETEVTKTsKLSAgICBoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSA9IDQ7IC8vIGFyYml0cmFyeSBnZW5lcmljIHR5cGUKLSAgICBpbnQgZGF0YVtNQVhfSEFORExFU107Ci0gICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZXNbTUFYX0hBTkRMRVNdOwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBmb3VuZDsKLQotICAgIC8vIHJlcGVhdCB0aGUgdGVzdCBzZXZlcmFsIHRpbWVzIHRvIHNlZSBpZiBpdCBicmVha3MKLSAgICBjb25zdCBpbnQgU0VWRVJBTCA9IDU7IC8vIGFyYml0cmFyeQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0VWRVJBTDsgaSsrKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0hBTkRMRVM7IGkrKykgewotICAgICAgICAgICAgLy8gYWRkIGEgaGFuZGxlCi0gICAgICAgICAgICBoYW5kbGVzW2ldID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGFbaV0pOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlc1tpXSA+IDApOwotICAgICAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGVzW2ldKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgmZGF0YVtpXSwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHRoYXQgaXQgaXMgZnVsbCwgdHJ5IHRvIGFkZCBvbmUgbW9yZS4KLSAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IHRyYWNrZXIucHV0KHR5cGUsICZkYXRhWzBdKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaGFuZGxlIDwgMCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSEFORExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIGVhY2ggaGFuZGxlCi0gICAgICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbaV0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKCZkYXRhW2ldLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgb25lIGZyb20gc3RvcmFnZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGhhbmRsZXNbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbMl0sIGZvdW5kKTsKLSAgICAgICAgLy8gbm93IHRyeSB0byBsb29rIHVwIHRoZSBzYW1lIGhhbmRsZSBhbmQgZmFpbAotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbMl0pOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIGFkZCB0aGF0IHNhbWUgb25lIGJhY2sKLSAgICAgICAgaGFuZGxlID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGFbMl0pOwotICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgPiAwKTsKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbMl0sIGZvdW5kKTsKLSAgICAgICAgLy8gbm93IHVzZSBhIHN0YWxlIGhhbmRsZSBhZ2FpbiB3aXRoIGEgdmFsaWQgaW5kZXggYW5kIGZhaWwKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGVzWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIGZvdW5kKTsKLQotICAgICAgICAvLyByZW1vdmUgdGhlbSBhbGwKLSAgICAgICAgaGFuZGxlc1syXSA9IGhhbmRsZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSEFORExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIGVhY2ggaGFuZGxlCi0gICAgICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGhhbmRsZXNbaV0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKCZkYXRhW2ldLCBmb3VuZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzYzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcApAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFBsYXkgc2lsZW5jZSBhbmQgcmVjb3ZlciBmcm9tIGRlYWQgc2VydmVycyBvciBkaXNjb25uZWN0ZWQgZGV2aWNlcy4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KKyNpbmNsdWRlICJ1dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKKyNpbmNsdWRlICIuLi9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKKworLy8gQXJiaXRyYXJ5IHBlcmlvZCBmb3IgZ2xpdGNoZXMsIG9uY2UgcGVyIHNlY29uZCBhdCA0ODAwMCBIei4KKyNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVMgICAgNDgwMDAKKy8vIEhvdyBsb25nIHRvIHNsZWVwIGluIGEgY2FsbGJhY2sgdG8gY2F1c2UgYW4gaW50ZW50aW9uYWwgZ2xpdGNoLiBGb3IgdGVzdGluZy4KKyNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyAgICAgKDEwICogMTAwMCkKKworI2RlZmluZSBNQVhfVElNRVNUQU1QUyAgICAgICAgICAxMDAwCisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisKKyNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgMQorI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgICAgICA0CisKK3R5cGVkZWYgc3RydWN0IFRpbWVzdGFtcEluZm8geworICAgIGludDY0X3QgICAgICAgICBmcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90ICAgICAgICAgYXBwUG9zaXRpb247IC8vIGZyYW1lcworICAgIGludDY0X3QgICAgICAgICBhcHBOYW5vc2Vjb25kczsKKyAgICBpbnQ2NF90ICAgICAgICAgdGltZXN0YW1wUG9zaXRpb247ICAvLyBmcmFtZXMKKyAgICBpbnQ2NF90ICAgICAgICAgdGltZXN0YW1wTmFub3M7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKK30gVGltZXN0YW1wSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3MgeworICAgIFRpbWVzdGFtcEluZm8gIHRpbWVzdGFtcHNbTUFYX1RJTUVTVEFNUFNdOworICAgIGludDY0X3QgICAgICAgIGZyYW1lc1RvdGFsID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICBuZXh0RnJhbWVUb0dsaXRjaCA9IEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTOworICAgIGludDMyX3QgICAgICAgIHRpbWVzdGFtcENvdW50ID0gMDsgLy8gaW4gdGltZXN0YW1wcworICAgIGJvb2wgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7Cit9IFRpbWVzdGFtcENhbGxiYWNrRGF0YV90OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEgX191bnVzZWQsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCispIHsKKworICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICBpZiAodXNlckRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYyBuZWVkcyB1c2VyRGF0YVxuIik7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfQorICAgIFRpbWVzdGFtcENhbGxiYWNrRGF0YV90ICp0aW1lc3RhbXBEYXRhID0gKFRpbWVzdGFtcENhbGxiYWNrRGF0YV90ICopIHVzZXJEYXRhOworCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24oc3RyZWFtKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOworICAgIH0KKworICAgIGlmICh0aW1lc3RhbXBEYXRhLT5mb3JjZVVuZGVycnVucykgeworICAgICAgICBpZiAodGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgPiB0aW1lc3RhbXBEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgeworICAgICAgICAgICAgdXNsZWVwKEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MpOworICAgICAgICAgICAgcHJpbnRmKCJTaW11bGF0ZSBnbGl0Y2ggYXQgJWxsZFxuIiwgKGxvbmcgbG9uZykgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwpOworICAgICAgICAgICAgdGltZXN0YW1wRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2ggKz0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXN0YW1wRGF0YS0+dGltZXN0YW1wQ291bnQgPCBNQVhfVElNRVNUQU1QUykgeworICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmdGltZXN0YW1wRGF0YS0+dGltZXN0YW1wc1t0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBDb3VudF07CisgICAgICAgIHRpbWVzdGFtcC0+cmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCA9IHRpbWVzdGFtcERhdGEtPmZyYW1lc1RvdGFsOworICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgICAgICA/IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSk7CisgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICB0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBDb3VudCsrOworICAgIH0KKworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKK30KKworc3RhdGljIFRpbWVzdGFtcENhbGxiYWNrRGF0YV90IHNUaW1lc3RhbXBEYXRhOworCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RUaW1lU3RhbXBzKGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmb3JtYW5jZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGZsb2F0ICpidWZmZXIgPSBudWxscHRyOworCisgICAgaW50MzJfdCBhY3R1YWxDaGFubmVsQ291bnQgPSAwOworICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IDA7CisgICAgaW50MzJfdCBvcmlnaW5hbEJ1ZmZlclNpemUgPSAwOworICAgIGludDMyX3QgcmVxdWVzdGVkQnVmZmVyU2l6ZSA9IDA7CisgICAgaW50MzJfdCBmaW5hbEJ1ZmZlclNpemUgPSAwOworICAgIGFhdWRpb19mb3JtYXRfdCBhY3R1YWxEYXRhRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICBtZW1zZXQoJnNUaW1lc3RhbXBEYXRhLCAwLCBzaXplb2Yoc1RpbWVzdGFtcERhdGEpKTsKKworICAgIHByaW50ZigiLS0tLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tLS0tXG4iLAorICAgICAgICAgICBtbWFwUG9saWN5LAorICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQoc2hhcmluZ01vZGUpLAorICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KHBlcmZvcm1hbmNlTW9kZSksCisgICAgICAgICAgIGdldERpcmVjdGlvblRleHQoZGlyZWN0aW9uKSk7CisKKyAgICBBQXVkaW9fc2V0TU1hcFBvbGljeShtbWFwUG9saWN5KTsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoYWF1ZGlvQnVpbGRlciwgQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGFhdWRpb0J1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmb3JtYW5jZU1vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGFhdWRpb0J1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYywgJnNUaW1lc3RhbXBEYXRhKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgYWN0dWFsU2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGFhdWRpb1N0cmVhbSk7CisgICAgYWN0dWFsQ2hhbm5lbENvdW50ID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbERhdGFGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KGFhdWRpb1N0cmVhbSk7CisKKyAgICBhY3R1YWxTaGFyaW5nTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZShhYXVkaW9TdHJlYW0pOworICAgIGlmIChhY3R1YWxTaGFyaW5nTW9kZSAhPSBzaGFyaW5nTW9kZSkgeworICAgICAgICBwcmludGYoImRpZCBub3QgZ2V0IGV4cGVjdGVkIHNoYXJpbmdNb2RlLCBnb3QgJTNkLCBza2lwcGluZyB0ZXN0XG4iLAorICAgICAgICAgICAgICAgYWN0dWFsU2hhcmluZ01vZGUpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKyAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb1N0cmVhbSk7CisgICAgaWYgKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSAhPSBwZXJmb3JtYW5jZU1vZGUpIHsKKyAgICAgICAgcHJpbnRmKCJkaWQgbm90IGdldCBleHBlY3RlZCBwZXJmb3JtYW5jZU1vZGUsIGdvdCAlM2QsIHNraXBwaW5nIHRlc3RcbiIsCisgICAgICAgICAgICAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIHByaW50ZigiICAgIGNoYW5zID0gJTNkLCByYXRlID0gJTZkIGZvcm1hdCA9ICVkXG4iLAorICAgICAgICAgICBhY3R1YWxDaGFubmVsQ291bnQsIGFjdHVhbFNhbXBsZVJhdGUsIGFjdHVhbERhdGFGb3JtYXQpOworICAgIHByaW50ZigiICAgIElzIE1NQVAgdXNlZD8gJXNcbiIsIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgYXJlIHJlYWQgaW4gb25lIGNodW5rIGJ5IGEgRE1BIGNvbnRyb2xsZXIKKyAgICAvLyBvciBhIERTUCBvciBhIG1peGVyLgorICAgIGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGFhdWRpb1N0cmVhbSk7CisgICAgcHJpbnRmKCIgICAgZnJhbWVzUGVyQnVyc3QgPSAlM2RcbiIsIGZyYW1lc1BlckJ1cnN0KTsKKworICAgIG9yaWdpbmFsQnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtKTsKKyAgICByZXF1ZXN0ZWRCdWZmZXJTaXplID0gNCAqIGZyYW1lc1BlckJ1cnN0OworICAgIGZpbmFsQnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtLCByZXF1ZXN0ZWRCdWZmZXJTaXplKTsKKworICAgIHByaW50ZigiICAgIEJ1ZmZlclNpemU6IG9yaWdpbmFsID0gJTRkLCByZXF1ZXN0ZWQgPSAlNGQsIGZpbmFsID0gJTRkXG4iLAorICAgICAgICAgICBvcmlnaW5hbEJ1ZmZlclNpemUsIHJlcXVlc3RlZEJ1ZmZlclNpemUsIGZpbmFsQnVmZmVyU2l6ZSk7CisKKyAgICB7CisgICAgICAgIGludDY0X3QgcG9zaXRpb247CisgICAgICAgIGludDY0X3QgbmFub3NlY29uZHM7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLCBDTE9DS19NT05PVE9OSUMsICZwb3NpdGlvbiwgJm5hbm9zZWNvbmRzKTsKKyAgICAgICAgcHJpbnRmKCJiZWZvcmUgc3RhcnQsIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoKSByZXR1cm5zICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgfQorCisgICAgZm9yIChpbnQgcnVucyA9IDA7IHJ1bnMgPCBOVU1fTE9PUFM7IHJ1bnMrKykgeworICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLSBsb29wICMlZFxuIiwgcnVucyk7CisKKyAgICAgICAgaW50NjRfdCB0ZW1wID0gc1RpbWVzdGFtcERhdGEuZnJhbWVzVG90YWw7CisgICAgICAgIG1lbXNldCgmc1RpbWVzdGFtcERhdGEsIDAsIHNpemVvZihzVGltZXN0YW1wRGF0YSkpOworICAgICAgICBzVGltZXN0YW1wRGF0YS5mcmFtZXNUb3RhbCA9IHRlbXA7CisKKyAgICAgICAgc1RpbWVzdGFtcERhdGEuZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKworICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCBOVU1fU0VDT05EUzsgc2Vjb25kKyspIHsKKyAgICAgICAgICAgIC8vIEdpdmUgQUF1ZGlvIGNhbGxiYWNrIHRpbWUgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgc2xlZXAoMSk7CisKKyAgICAgICAgICAgIC8vIFBlcmlvZGljYWxseSBwcmludCB0aGUgcHJvZ3Jlc3Mgc28gd2Uga25vdyBpdCBoYXNuJ3QgZGllZC4KKyAgICAgICAgICAgIHByaW50ZigiZnJhbWVzV3JpdHRlbiA9ICVkLCBYUnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGFhdWRpb1N0cmVhbSksCisgICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChhYXVkaW9TdHJlYW0pCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigidGltZXN0YW1wQ291bnQgPSAlZFxuIiwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQpOworICAgICAgICBpbnQgcHJpbnRlZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgeworICAgICAgICAgICAgVGltZXN0YW1wSW5mbyAqdGltZXN0YW1wID0gJnNUaW1lc3RhbXBEYXRhLnRpbWVzdGFtcHNbaV07CisgICAgICAgICAgICBib29sIHBvc0NoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcyAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgICAgIGlmICgocHJpbnRlZCA8IDIwKSAmJiAoKGkgPCAxMCkgfHwgcG9zQ2hhbmdlZCB8fCB0aW1lQ2hhbmdlZCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsIGksCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHJlc3VsdCA9ICVzXG4iLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dCh0aW1lc3RhbXAtPnJlc3VsdCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVnYXRpdmUgPSB0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uIDwgMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZXRybyA9IChpID4gMCAmJiAodGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSA9IG5lZ2F0aXZlID8gIiA8PU5FR0FUSVZFISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHJldHJvID8gIiAgPD0gUkVUUk9HUkFERSEiIDogIiIpOworCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5ID0gY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcE5hbm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQXZvaWQgcmFjZSBjb25kaXRpb25zIGluIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgLy8gVGhlcmUgaXMgbm9ybWFsbHkgYSBkZWxheSBiZXR3ZWVuIGEgcmVhbCB1c2VyIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIGEgc3RyZWFtLgorICAgICAgICBzbGVlcCgxKTsKKyAgICB9CisKK2ZpbmlzaDoKKyAgICBpZiAoYWF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSk7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworICAgIHByaW50ZigicmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkICopIGFyZ3Y7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIlRlc3QgVGltZXN0YW1wcyBWMC4xLjNcbiIpOworCisgICAgLy8gTGVnYWN5CisgICAgYWF1ZGlvX3BvbGljeV90IHBvbGljeSA9IEFBVURJT19QT0xJQ1lfTkVWRVI7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKTsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworCisgICAgLy8gTU1BUAorICAgIHBvbGljeSA9IEFBVURJT19QT0xJQ1lfQUxXQVlTOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gQUFVRElPX09LKSA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBhNWY5YWI2Li5iMWNiMGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC0xMzUsNyArMTM1LDExIEBACiAgICAgICAgICAgICAmbVN0YXR1cywgJm1JZCwgJmVuYWJsZWQpOwogCiAgICAgaWYgKGlFZmZlY3QgPT0gMCB8fCAobVN0YXR1cyAhPSBOT19FUlJPUiAmJiBtU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSkgewotICAgICAgICBBTE9HRSgic2V0KCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIGVmZmVjdCwgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOworICAgICAgICBjaGFyIHR5cGVCdWZmZXJbNjRdLCB1dWlkQnVmZmVyWzY0XTsKKyAgICAgICAgZ3VpZFRvU3RyaW5nKHR5cGUsIHR5cGVCdWZmZXIsIHNpemVvZih0eXBlQnVmZmVyKSk7CisgICAgICAgIGd1aWRUb1N0cmluZyh1dWlkLCB1dWlkQnVmZmVyLCBzaXplb2YodXVpZEJ1ZmZlcikpOworICAgICAgICBBTE9HRSgic2V0KCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIGVmZmVjdCAlcyAvICVzLCBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICB0eXBlQnVmZmVyLCB1dWlkQnVmZmVyLCBtU3RhdHVzKTsKICAgICAgICAgaWYgKGlFZmZlY3QgPT0gMCkgewogICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCA2MTFjZGU3Li5iYTRhY2M2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgfQogICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgLy8gVE9ETzogYWRkIGF1ZGlvIGhhcmR3YXJlIGlucHV0IGxhdGVuY3kgaGVyZQotICAgIG1MYXRlbmN5ID0gKDEwMDAgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKyAgICBtTGF0ZW5jeSA9ICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKICAgICBtTWFya2VyUG9zaXRpb24gPSAwOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAgICAgbU5ld1Bvc2l0aW9uID0gMDsKQEAgLTQ5OSwxOSArNDk5LDI2IEBACiAgICAgcmV0dXJuIG1TZWxlY3RlZERldmljZUlkOwogfQogCisvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9SZWNvcmQ6OnVwZGF0ZVJvdXRlZERldmljZUlkX2woKQoreworICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgaW5hY3RpdmUsIGRvIG5vdCB1cGRhdGUgYWN0dWFsIGRldmljZSBhcyB0aGUgaW5wdXQgc3RyZWFtIG1heWJlIHJvdXRlZAorICAgIC8vIGZyb20gYSBkZXZpY2Ugbm90IHJlbGV2YW50IHRvIHRoaXMgY2xpZW50IGJlY2F1c2Ugb2Ygb3RoZXIgYWN0aXZlIHVzZSBjYXNlcy4KKyAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtSW5wdXQpOworICAgICAgICBpZiAoZGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIH0KKyAgICAgfQorfQorCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgLy8gaWYgdGhlIGlucHV0IHN0cmVhbSBkb2VzIG5vdCBoYXZlIGFuIGFjdGl2ZSBhdWRpbyBwYXRjaCwgdXNlIGVpdGhlciB0aGUgZGV2aWNlIGluaXRpYWxseQotICAgIC8vIHNlbGVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG9yIHRoZSBsYXN0IHJvdXRlZCBkZXZpY2UKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQXVkaW9TeXN0ZW06OmdldERldmljZUlkRm9ySW8obUlucHV0KTsKLSAgICBpZiAoZGV2aWNlSWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICBkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKLSAgICB9Ci0gICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7Ci0gICAgcmV0dXJuIGRldmljZUlkOworICAgIHVwZGF0ZVJvdXRlZERldmljZUlkX2woKTsKKyAgICByZXR1cm4gbVJvdXRlZERldmljZUlkOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MzcsOSArNTQ0LDYgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7Ci0gICAgfQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OwogCiAgICAgLy8gbUZsYWdzIChub3QgbU9yaWdGbGFncykgaXMgbW9kaWZpZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZmFzdCByZXF1ZXN0IGlzIGFjY2VwdGVkLgpAQCAtNzQ0LDYgKzc0OCwxNSBAQAogICAgIH0KICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KSBub3RpZmljYXRpb25GcmFtZXM7CiAKKworICAgIC8vbUlucHV0ICE9IGlucHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IGlucHV0KSB7CisgICAgICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgaW5wdXQpOworICAgIH0KKwogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1JbnB1dCA9IGlucHV0OwogICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKQEAgLTc2MywxMCArNzc2LDYgQEAKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOwogICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7Ci0gICAgfQotCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgLy8gRW5kIG9mIHJldHJ5IGxvb3AuCkBAIC0xMjM4LDcgKzEyNDcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayA9PSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMTI0Niw5ICsxMjU1LDkgQEAKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewogICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTEyNjIsMTcgKzEyNzEsMzggQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gY2FsbGJhY2spIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewogICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgfQotICAgIG1EZXZpY2VDYWxsYmFjayA9IDA7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvUmVjb3JkOjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjazsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvSW8gIT0gbUlucHV0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sgPSBtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpOworICAgICAgICAvLyBvbmx5IHVwZGF0ZSBkZXZpY2UgaWYgdGhlIHJlY29yZCBpcyBhY3RpdmUgYXMgcm91dGUgY2hhbmdlcyBkdWUgdG8gb3RoZXIgdXNlIGNhc2VzIGFyZQorICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0aGlzIGNsaWVudAorICAgICAgICBpZiAobUFjdGl2ZSkgeworICAgICAgICAgICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUobUlucHV0LCBtUm91dGVkRGV2aWNlSWQpOworICAgIH0KK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggMmY3MTBiZC4uY2RjNzVhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtNDkzLDE0ICs0OTMsMTYgQEAKICAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIFZlY3RvciA8IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOworICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgotICAgICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDogeworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOiB7CiAgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CkBAIC01MTEsMTMgKzUxMywxOSBAQAogCiAgICAgICAgICAgICBpZiAoaW9EZXNjLT5nZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgb3BlbmVkICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKLSAgICAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCA/ICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX09VVFBVVF9SRUdJU1RFUkVEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IiA6ICJpbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuZWQiIDogInJlZ2lzdGVyZWQiLAogICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tU2FtcGxpbmdSYXRlLCBpb0Rlc2MtPm1Gb3JtYXQsIGlvRGVzYy0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1GcmFtZUNvdW50LCBpb0Rlc2MtPmdldERldmljZUlkKCkpOwogICAgICAgICAgICAgfSBicmVhazsKQEAgLTU2Myw5ICs1NzEsMjMgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgfQogICAgIH0KKyAgICBib29sIGNhbGxiYWNrUmVtb3ZlZCA9IGZhbHNlOwogICAgIC8vIGNhbGxiYWNrcy5zaXplKCkgIT0gMCA9PiAgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNhbGxiYWNrc1tpXS0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlSWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgKSB7CisgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFja3MucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBjYWxsYmFja1JlbW92ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIC8vIGNsZWFuIHVwIGNhbGxiYWNrIGxpc3Qgd2hpbGUgd2UgYXJlIGhlcmUgaWYgc29tZSBjbGllbnRzIGhhdmUgZGlzYXBwZWFyZWQgd2l0aG91dAorICAgIC8vIHVucmVnaXN0ZXJpbmcgdGhlaXIgY2FsbGJhY2sKKyAgICBpZiAoY2FsbGJhY2tSZW1vdmVkKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGNhbGxiYWNrcyk7CiAgICAgfQogfQogCkBAIC02MTgsMTcgKzY0MCwxNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFZlY3RvciA8IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOworICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwogICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOwogICAgIGlmIChpb0luZGV4ID49IDApIHsKICAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XSA9PSBjYWxsYmFjaykgeworICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgIH0KQEAgLTYzOSwxOCArNjYxLDE4IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOwogCiAgICAgc2l6ZV90IGNiSW5kZXg7CiAgICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdID09IGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0udW5zYWZlX2dldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTI4LDcgKzExNTAsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQorICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCiB7CiAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKICAgICBpZiAoYWZjID09IDApIHsKQEAgLTExNDUsNyArMTE2Nyw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewpAQCAtMTI5Nyw3ICsxMzE5LDcgQEAKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CkBAIC0xMzA3LDcgKzEzMjksNyBAQAogICAgIH0KIAogICAgIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGNiKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCBiMGIwMWRiLi4zNTI5ZDJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KQEAgLTYyLDkgKzYzLDEyIEBACiAgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOwogfQogCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgY29udmVydFRpbWVzcGVjVG9Ocyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KQotewotICAgIHJldHVybiB0di50dl9zZWMgKiAobG9uZyBsb25nKU5BTk9TX1BFUl9TRUNPTkQgKyB0di50dl9uc2VjOworLy8gVE9ETyBtb3ZlIHRvIGF1ZGlvX3V0aWxzLgorc3RhdGljIGlubGluZSBzdHJ1Y3QgdGltZXNwZWMgY29udmVydE5zVG9UaW1lc3BlYyhpbnQ2NF90IG5zKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHR2OworICAgIHR2LnR2X3NlYyA9IHN0YXRpY19jYXN0PHRpbWVfdD4obnMgLyBOQU5PU19QRVJfU0VDT05EKTsKKyAgICB0di50dl9uc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4obnMgJSBOQU5PU19QRVJfU0VDT05EKTsKKyAgICByZXR1cm4gdHY7CiB9CiAKIC8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgpAQCAtMjcyLDcgKzI3Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CkBAIC01NDMsNyArNTQ3LDggQEAKICAgICBtVXBkYXRlUGVyaW9kID0gMDsKICAgICBtUG9zaXRpb24gPSAwOwogICAgIG1SZWxlYXNlZCA9IDA7Ci0gICAgbVN0YXJ0VXMgPSAwOworICAgIG1TdGFydE5zID0gMDsKKyAgICBtU3RhcnRGcm9tWmVyb1VzID0gMDsKICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CkBAIC01OTEsNiArNTk2LDcgQEAKICAgICAgICAgICAgIG1TdGFydEV0cy5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQorICAgIG1TdGFydE5zID0gc3lzdGVtVGltZSgpOyAvLyBzYXZlIHRoaXMgZm9yIHRpbWVzdGFtcCBhZGp1c3RtZW50IGFmdGVyIHN0YXJ0aW5nLgogICAgIGlmIChwcmV2aW91c1N0YXRlID09IFNUQVRFX1NUT1BQRUQgfHwgcHJldmlvdXNTdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSB7CiAgICAgICAgIC8vIHJlc2V0IGN1cnJlbnQgcG9zaXRpb24gYXMgc2VlbiBieSBjbGllbnQgdG8gMAogICAgICAgICBtUG9zaXRpb24gPSAwOwpAQCAtNjA5LDcgKzYxNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdKSwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRFdHMubUZsdXNoZWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW4pOwotICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQgPSAtbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXTsKKyAgICAgICAgICAgIC8vIG1TdGFydEV0cyBpcyBhbHJlYWR5IGFkanVzdGVkIGJ5IG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0LCBzbyB3ZSBkZWx0YSBhZGp1c3QuCisgICAgICAgICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCAtPSBtU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdOwogICAgICAgICB9CiAgICAgICAgIG1GcmFtZXNXcml0dGVuID0gMDsKICAgICAgICAgbVByb3h5LT5jbGVhclRpbWVzdGFtcCgpOyAvLyBuZWVkIG5ldyBzZXJ2ZXIgcHVzaCBmb3IgdmFsaWQgdGltZXN0YW1wCkBAIC02MTksNyArNjI2LDcgQEAKICAgICAgICAgLy8gc2luY2UgdGhlIGZsdXNoIGlzIGFzeW5jaHJvbm91cyBhbmQgc3RvcCBtYXkgbm90IGZ1bGx5IGRyYWluLgogICAgICAgICAvLyBXZSBzYXZlIHRoZSB0aW1lIHdoZW4gdGhlIHRyYWNrIGlzIHN0YXJ0ZWQgdG8gbGF0ZXIgdmVyaWZ5IHdoZXRoZXIKICAgICAgICAgLy8gdGhlIGNvdW50ZXJzIGFyZSByZWFsaXN0aWMgKGkuZS4gc3RhcnQgZnJvbSB6ZXJvIGFmdGVyIHRoaXMgdGltZSkuCi0gICAgICAgIG1TdGFydFVzID0gZ2V0Tm93VXMoKTsKKyAgICAgICAgbVN0YXJ0RnJvbVplcm9VcyA9IG1TdGFydE5zIC8gMTAwMDsKIAogICAgICAgICAvLyBmb3JjZSByZWZyZXNoIG9mIHJlbWFpbmluZyBmcmFtZXMgYnkgcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgbGFzdAogICAgICAgICAvLyB3cml0ZSBiZWZvcmUgc3RvcCBjb3VsZCBiZSBwYXJ0aWFsLgpAQCAtMTIyMiwxOSArMTIyOSwyNiBAQAogICAgIHJldHVybiBtU2VsZWN0ZWREZXZpY2VJZDsKIH0KIAorLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCit2b2lkIEF1ZGlvVHJhY2s6OnVwZGF0ZVJvdXRlZERldmljZUlkX2woKQoreworICAgIC8vIGlmIHRoZSB0cmFjayBpcyBpbmFjdGl2ZSwgZG8gbm90IHVwZGF0ZSBhY3R1YWwgZGV2aWNlIGFzIHRoZSBvdXRwdXQgc3RyZWFtIG1heWJlIHJvdXRlZAorICAgIC8vIHRvIGEgZGV2aWNlIG5vdCByZWxldmFudCB0byB0aGlzIGNsaWVudCBiZWNhdXNlIG9mIG90aGVyIGFjdGl2ZSB1c2UgY2FzZXMuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQXVkaW9TeXN0ZW06OmdldERldmljZUlkRm9ySW8obU91dHB1dCk7CisgICAgICAgIGlmIChkZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgfQorICAgIH0KK30KKwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotICAgIC8vIGlmIHRoZSBvdXRwdXQgc3RyZWFtIGRvZXMgbm90IGhhdmUgYW4gYWN0aXZlIGF1ZGlvIHBhdGNoLCB1c2UgZWl0aGVyIHRoZSBkZXZpY2UgaW5pdGlhbGx5Ci0gICAgLy8gc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb3IgdGhlIGxhc3Qgcm91dGVkIGRldmljZQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtT3V0cHV0KTsKLSAgICBpZiAoZGV2aWNlSWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICBkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKLSAgICB9Ci0gICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7Ci0gICAgcmV0dXJuIGRldmljZUlkOworICAgIHVwZGF0ZVJvdXRlZERldmljZUlkX2woKTsKKyAgICByZXR1cm4gbVJvdXRlZERldmljZUlkOwogfQogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQpAQCAtMTI3Miw3ICsxMjg2LDcgQEAKICAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZJWE1FIGRvbid0IGJlbGlldmUgdGhpcyBsaWUKLSAgICAgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDAgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwogICAgIH0KIH0KIApAQCAtMTI5OCwxMiArMTMxMiwxMCBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOwotICAgIH0KICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQ7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbVN0cmVhbVR5cGU7CiAgICAgYXVkaW9fYXR0cmlidXRlc190ICphdHRyID0gKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/ICZtQXR0cmlidXRlcyA6IE5VTEw7CisgICAgYm9vbCBjYWxsYmFja0FkZGVkID0gZmFsc2U7CiAKICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCiAgICAgLy8gQWZ0ZXIgZmFzdCByZXF1ZXN0IGlzIGRlbmllZCwgd2Ugd2lsbCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQuCkBAIC0xNTA4LDEyICsxNTIwLDE0IEBACiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CkBAIC0xNTc1LDYgKzE1ODksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vbU91dHB1dCAhPSBvdXRwdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBvdXRwdXQpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOworICAgICAgICB9CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dCk7CisgICAgICAgIGNhbGxiYWNrQWRkZWQgPSB0cnVlOworICAgIH0KKwogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwpAQCAtMTU5MCw3ICsxNjEzLDggQEAKICAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTYzNSwxNSArMTY1OSwxNSBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKLSAgICB9Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiByZWxlYXNlOgogICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7CisgICAgaWYgKGNhbGxiYWNrQWRkZWQpIHsKKyAgICAgICAgLy8gbm90ZTogbU91dHB1dCBpcyBhbHdheXMgdmFsaWQgaXMgY2FsbGJhY2tBZGRlZCBpcyB0cnVlCisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOworICAgIH0KICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgfQpAQCAtMjA5MCw3ICsyMTE0LDE0IEBACiAgICAgLy8gQ29udmVydCBmcmFtZSB1bml0cyB0byB0aW1lIHVuaXRzCiAgICAgbnNlY3NfdCBucyA9IE5TX1dIRU5FVkVSOwogICAgIGlmIChtaW5GcmFtZXMgIT0gKHVpbnQzMl90KSB+MCkgewotICAgICAgICBucyA9IGZyYW1lc1RvTmFub3NlY29uZHMobWluRnJhbWVzLCBzYW1wbGVSYXRlLCBzcGVlZCkgKyBrV2FpdFBlcmlvZE5zOworICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgY29uc3VtcHRpb24gb2YgY2xpZW50IGRhdGEgbWF5IGJlIGlycmVndWxhciB3aGVuIGNvbWluZyBvdXQgb2YgZGV2aWNlCisgICAgICAgIC8vIHN0YW5kYnkgc2luY2UgdGhlIGtlcm5lbCBidWZmZXJzIHJlcXVpcmUgZmlsbGluZy4gVGhpcyBpcyB0aHJvdHRsZWQgdG8gbm8gbW9yZSB0aGFuIDJ4CisgICAgICAgIC8vIHRoZSBleHBlY3RlZCByYXRlIGluIHRoZSBNaXhlclRocmVhZC4gSGVuY2UsIHdlIHJlZHVjZSB0aGUgZXN0aW1hdGVkIHRpbWUgdG8gd2FpdCBieSBvbmUKKyAgICAgICAgLy8gaGFsZiAoYnV0IG5vIG1vcmUgdGhhbiBoYWxmIGEgc2Vjb25kKSB0byBpbXByb3ZlIGNhbGxiYWNrIGFjY3VyYWN5IGR1cmluZyB0aGVzZSB0ZW1wb3JhcnkKKyAgICAgICAgLy8gZGF0YSBzdXJnZXMuCisgICAgICAgIGNvbnN0IG5zZWNzX3QgZXN0aW1hdGVkTnMgPSBmcmFtZXNUb05hbm9zZWNvbmRzKG1pbkZyYW1lcywgc2FtcGxlUmF0ZSwgc3BlZWQpOworICAgICAgICBjb25zdGV4cHIgbnNlY3NfdCBtYXhUaHJvdHRsZUNvbXBlbnNhdGlvbk5zID0gNTAwMDAwMDAwTEw7CisgICAgICAgIG5zID0gZXN0aW1hdGVkTnMgLSBtaW4oZXN0aW1hdGVkTnMgLyAyLCBtYXhUaHJvdHRsZUNvbXBlbnNhdGlvbk5zKSArIGtXYWl0UGVyaW9kTnM7CiAgICAgICAgIG5zIC09ICh0aW1lQWZ0ZXJDYWxsYmFja3MgLSB0aW1lQmVmb3JlQ2FsbGJhY2tzKTsgIC8vIGFjY291bnQgZm9yIGNhbGxiYWNrIHRpbWUKICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHdhcm4gaWYgdGhlIGNhbGxiYWNrIHRpbWUgaXMgdG9vIGxvbmc/CiAgICAgICAgIGlmIChucyA8IDApIG5zID0gMDsKQEAgLTI1NjMsNyArMjU5NCw3IEBACiAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSB0aW1lc3RhbXAgdGltZSBldmVuIHdoZW4gcGF1c2VkLgogICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEIC8qIG5vdCBuZWVkZWQ6IFNUQVRFX1BBVVNFRF9TVE9QUElORyAqLykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhdCA9IGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhdCA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFnID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl9MQVNUS0VSTkVMT0tdIDwgMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMX0xBU1RLRVJORUxPS10gPCAwKQpAQCAtMjU3NSw4ICsyNjA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGF0IDwgbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgcGF1c2UgbGFnOiVsbGQgYWRqdXN0aW5nIGZyb20gJWxsZCB0byAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylsYWcsIChsb25nIGxvbmcpYXQsIChsb25nIGxvbmcpbGltaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lLnR2X3NlYyA9IGxpbWl0IC8gTkFOT1NfUEVSX1NFQ09ORDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZS50dl9uc2VjID0gbGltaXQgJSBOQU5PU19QRVJfU0VDT05EOyAvLyBjb21waWxlciBvcHQuCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBjb252ZXJ0TnNUb1RpbWVzcGVjKGxpbWl0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IGxvY2F0aW9uOwpAQCAtMjYxOSwxOCArMjY0OSwxOCBAQAogICAgICAgICAvLyB0aGUgcHJldmlvdXMgc29uZyB1bmRlciBnYXBsZXNzIHBsYXliYWNrLgogICAgICAgICAvLyBIb3dldmVyLCB3ZSBzb21ldGltZXMgc2VlIHplcm8gdGltZXN0YW1wcywgdGhlbiBhIGdsaXRjaCBvZgogICAgICAgICAvLyB0aGUgcHJldmlvdXMgc29uZydzIHBvc2l0aW9uLCBhbmQgdGhlbiBjb3JyZWN0IHRpbWVzdGFtcHMgYWZ0ZXJ3YXJkcy4KLSAgICAgICAgaWYgKG1TdGFydFVzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICBpZiAobVN0YXJ0RnJvbVplcm9VcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOwogCiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOb3cgPSBnZXROb3dVcygpOwogCi0gICAgICAgICAgICBpZiAodGltZU5vdyA8IG1TdGFydFVzICsgazFTZWNVcykgeyAvLyB3aXRoaW4gZmlyc3Qgc2Vjb25kIG9mIHN0YXJ0aW5nCisgICAgICAgICAgICBpZiAodGltZU5vdyA8IG1TdGFydEZyb21aZXJvVXMgKyBrMVNlY1VzKSB7IC8vIHdpdGhpbiBmaXJzdCBzZWNvbmQgb2Ygc3RhcnRpbmcKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVzdGFtcFRpbWVVcyA9IGNvbnZlcnRUaW1lc3BlY1RvVXModGltZXN0YW1wLm1UaW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wVGltZVVzIDwgbVN0YXJ0VXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wVGltZVVzIDwgbVN0YXJ0RnJvbVplcm9VcykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7ICAvLyBzdGFsZSB0aW1lc3RhbXAgdGltZSwgb2NjdXJzIGJlZm9yZSBzdGFydC4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVRpbWVVcyA9IHRpbWVzdGFtcFRpbWVVcyAtIG1TdGFydFVzOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFUaW1lVXMgPSB0aW1lc3RhbXBUaW1lVXMgLSBtU3RhcnRGcm9tWmVyb1VzOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFQb3NpdGlvbkJ5VXMgPSAoZG91YmxlKXRpbWVzdGFtcC5tUG9zaXRpb24gKiAxMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAvICgoZG91YmxlKW1TYW1wbGVSYXRlICogbVBsYXliYWNrUmF0ZS5tU3BlZWQpOwogCkBAIC0yNjUzLDEwICsyNjgzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb25CeVVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VXMgPSAwOyAvLyBkb24ndCBjaGVjayBhZ2Fpbiwgd2UgZ290IHZhbGlkIG5vbnplcm8gcG9zaXRpb24uCisgICAgICAgICAgICAgICAgICAgIG1TdGFydEZyb21aZXJvVXMgPSAwOyAvLyBkb24ndCBjaGVjayBhZ2Fpbiwgd2UgZ290IHZhbGlkIG5vbnplcm8gcG9zaXRpb24uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCBzdGFydCB0aW1lIGV4cGlyZWQuCisgICAgICAgICAgICAgICAgbVN0YXJ0RnJvbVplcm9VcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCBzdGFydCB0aW1lIGV4cGlyZWQuCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTI2OTQsMTMgKzI3MjQsMzMgQEAKICAgICAvLyBQcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uIGluIHRpbWVzdGFtcC4KICAgICAvLyBUaGlzIGlzIHNvbWV0aW1lcyBjYXVzZWQgYnkgZXJyYXRpYyByZXBvcnRzIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFMU0EgZHJpdmVycy4KICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHByZXZpb3VzVGltZXN0YW1wVmFsaWQgaXMgc2V0IHRvIGZhbHNlIHdoZW4gc3RhcnRpbmcgYWZ0ZXIgYSBzdG9wIG9yIGZsdXNoLgogICAgICAgICBpZiAocHJldmlvdXNUaW1lc3RhbXBWYWxpZCkgewotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBwcmV2aW91c1RpbWVOYW5vcyA9IGNvbnZlcnRUaW1lc3BlY1RvTnMobVByZXZpb3VzVGltZXN0YW1wLm1UaW1lKTsKLSAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPQorICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKKworICAgICAgICAgICAgLy8gRml4IHN0YWxlIHRpbWUgd2hlbiBjaGVja2luZyB0aW1lc3RhbXAgcmlnaHQgYWZ0ZXIgc3RhcnQoKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGb3Igb2ZmbG9hZCBjb21wYXRpYmlsaXR5LCB1c2UgYSBkZWZhdWx0IGxhZyB2YWx1ZSBoZXJlLgorICAgICAgICAgICAgLy8gQW55IHRpbWUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIHBhdXNlIHRpbWVzdGFtcCBpcyBoYW5kbGVkCisgICAgICAgICAgICAvLyBieSB0aGUgcmV0cm9ncmFkZSBjaGVjayBhZnRlcndhcmRzLgorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpbGltaXROcywgKGxvbmcgbG9uZyltU3RhcnROcyk7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gbGltaXROczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmV0cm9ncmFkZSBjaGVjawogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTG9va2luZyBhdCBzaWduZWQgZGVsdGEgd2lsbCB3b3JrIGV2ZW4gd2hlbiB0aGUgdGltZXN0YW1wcwpAQCAtMjcyNiw3ICsyNzc2LDcgQEAKICNpZiAwCiAgICAgICAgICAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byB2ZXJpZnkgYXVkaW8gdGltZXN0YW1wIHJhdGUuCiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUaW1lc3BlY1RvTnModGltZXN0YW1wLm1UaW1lKSAtIHByZXZpb3VzVGltZU5hbm9zOworICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwpAQCAtMjgxOCw3ICsyODY4LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgPT0gY2FsbGJhY2spIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay5nZXQoKSkgewogICAgICAgICBBTE9HVygiJXMgYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTI4MjYsOSArMjg3Niw5IEBACiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTI4NDIsMTcgKzI4OTIsMzkgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gY2FsbGJhY2spIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewogICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgfQotICAgIG1EZXZpY2VDYWxsYmFjayA9IDA7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisKK3ZvaWQgQXVkaW9UcmFjazo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKK3sKKyAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChhdWRpb0lvICE9IG1PdXRwdXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9IG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCk7CisgICAgICAgIC8vIG9ubHkgdXBkYXRlIGRldmljZSBpZiB0aGUgdHJhY2sgaXMgYWN0aXZlIGFzIHJvdXRlIGNoYW5nZXMgZHVlIHRvIG90aGVyIHVzZSBjYXNlcyBhcmUKKyAgICAgICAgLy8gaXJyZWxldmFudCBmb3IgdGhpcyBjbGllbnQKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKG1PdXRwdXQsIG1Sb3V0ZWREZXZpY2VJZCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYywgRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uIGxvY2F0aW9uKQogewogICAgIGlmIChtc2VjID09IG51bGxwdHIgfHwKQEAgLTI5MTAsNyArMjk4Miw3IEBACiAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgogICAgICAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgc3RhcnRlZCBpbiB0aGUgcGFzdCB0byByZXR1cm4gdHJ1ZS4KLSAgICAgICAgICAgIHJldHVybiBtU3RhcnRVcyA+IDA7CisgICAgICAgICAgICByZXR1cm4gbVN0YXJ0RnJvbVplcm9VcyA+IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gQSBub3JtYWwgYXVkaW8gdHJhY2sgbWF5IHN0aWxsIGJlIGRyYWluaW5nLCBzbwogICAgICAgICAvLyBjaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkLiAgVGhpcyBjb3ZlcnMgZmFzdHRyYWNrIHBvc2l0aW9uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IDA4YzM3ZjguLjdiZjRmOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0zNiw3ICszNiw3IEBACiAvLyBhIHZhbHVlIGJldHdlZW4gIm90aGVyIiArIDEgYW5kICJvdGhlciIgKyBJTlQzMl9NQVgsIHRoZSBjaG9pY2Ugb2YKIC8vIHdoaWNoIG5lZWRzIHRvIGJlIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgc2VxdWVuY2UgdmFsdWUgZm9yICJzZWxmIi4KIC8vIEluIGdlbmVyYWwsIHRoaXMgbWVhbnMgKG5ld19zZWxmKSByZXR1cm5lZCBpcyBtYXgoc2VsZiwgb3RoZXIpICsgMS4KLQorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiBzdGF0aWMgdWludDMyX3QgaW5jcmVtZW50U2VxdWVuY2UodWludDMyX3Qgc2VsZiwgdWludDMyX3Qgb3RoZXIpIHsKICAgICBpbnQzMl90IGRpZmYgPSAoaW50MzJfdCkgc2VsZiAtIChpbnQzMl90KSBvdGhlcjsKICAgICBpZiAoZGlmZiA+PSAwICYmIGRpZmYgPCBJTlQzMl9NQVgpIHsKQEAgLTM5Myw2ICszOTMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6Zmx1c2goKQogewogICAgIC8vIFRoaXMgd29ya3MgZm9yIG1GcmFtZUNvdW50UDIgPD0gMl4zMApAQCAtODQwLDYgKzg0MSwyNSBAQAogICAgIHJldHVybiBmaWxsZWQ7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorc2l6ZV90IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICBpZiAobUlzU2h1dGRvd24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOworICAgIGNvbnN0IGludDMyX3QgZmx1c2ggPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRmx1c2gpOworICAgIGlmIChmbHVzaCAhPSBtRmx1c2gpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiBib29sICBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnNldFN0cmVhbUVuZERvbmUoKSB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgYm9vbCBvbGQgPQpAQCAtODUxLDYgKzg3MSw3IEBACiAgICAgcmV0dXJuIG9sZDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50KQogewogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwpAQCAtOTA4LDYgKzkyOSwxMSBAQAogICAgIHJldHVybiBtRnJhbWVzUmVhZHlTYWZlOwogfQogCitzaXplX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIHJldHVybiBtRnJhbWVzUmVhZHlTYWZlOworfQorCiBzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnVwZGF0ZVN0YXRlV2l0aExvb3AoCiAgICAgICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAqbG9jYWxTdGF0ZSwgY29uc3QgU3RhdGljQXVkaW9UcmFja1N0YXRlICZ1cGRhdGUpIGNvbnN0CiB7CkBAIC0xMDAxLDYgKzEwMjcsNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgbVN0YXRlLm1Qb3NpdGlvbjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiBzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKQEAgLTEwNDcsNiArMTA3NCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpyZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKQogewogICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPm1GcmFtZUNvdW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCA5OGEwNTIxLi5hZDdmMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtNDgsNiArNDgsMTggQEAKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNvbmZpZy0+Zm9ybWF0KTsKIH0KIAoraW5saW5lIHZvaWQgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKK30KKworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CisgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+CiB7CkBAIC04MCwxNCArOTIsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1JWF9TVEFURV9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKQEAgLTEyMywxNCArMTM0LDE0IEBACiAgICAgY2FzZSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgZXZlbnQgPSAoaW50KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgY2xpZW50SW5mbzsKICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CisgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyYjlmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQoram10cml2aUBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKaW5kZXggZmVkODZjOS4uODU5ZjFhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaApAQCAtMjAsOSArMjAsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSBhdWRpb19pb19jb25maWdfZXZlbnQgeworICAgIEFVRElPX09VVFBVVF9SRUdJU1RFUkVELAogICAgIEFVRElPX09VVFBVVF9PUEVORUQsCiAgICAgQVVESU9fT1VUUFVUX0NMT1NFRCwKICAgICBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQsCisgICAgQVVESU9fSU5QVVRfUkVHSVNURVJFRCwKICAgICBBVURJT19JTlBVVF9PUEVORUQsCiAgICAgQVVESU9fSU5QVVRfQ0xPU0VELAogICAgIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VELApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IGU2YTVlZmIuLmRkNzIxNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBBdWRpb1JlY29yZCA6IHB1YmxpYyBSZWZCYXNlCitjbGFzcyBBdWRpb1JlY29yZCA6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjawogewogcHVibGljOgogCkBAIC00MjQsNyArNDI0LDEyIEBACiAKICAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBpbnB1dCB0byB3aGljaCB0aGlzIEF1ZGlvUmVjb3JkCiAgICAgICAqIGlzIGF0dGFjaGVkLgotICAgICAgKiBBIHZhbHVlIG9mIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIHRoZSBBdWRpb1JlY29yZCBpcyBub3QgYXR0YWNoZWQgdG8gYW55IGlucHV0LgorICAgICAgKiBUaGUgZGV2aWNlIElEIGlzIHJlbGV2YW50IG9ubHkgaWYgdGhlIEF1ZGlvUmVjb3JkIGlzIGFjdGl2ZS4KKyAgICAgICogV2hlbiB0aGUgQXVkaW9SZWNvcmQgaXMgaW5hY3RpdmUsIHRoZSBkZXZpY2UgSUQgcmV0dXJuZWQgY2FuIGJlIGVpdGhlcjoKKyAgICAgICogLSBBVURJT19QT1JUX0hBTkRMRV9OT05FIGlmIHRoZSBBdWRpb1JlY29yZCBpcyBub3QgYXR0YWNoZWQgdG8gYW55IG91dHB1dC4KKyAgICAgICogLSBUaGUgZGV2aWNlIElEIHVzZWQgYmVmb3JlIHBhdXNlZCBvciBzdG9wcGVkLgorICAgICAgKiAtIFRoZSBkZXZpY2UgSUQgc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2Ygc2V0T3V0cHV0RGV2aWNlKCkgaWYgdGhlIEF1ZGlvUmVjb3JkCisgICAgICAqIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldC4KICAgICAgICoKICAgICAgICogUGFyYW1ldGVyczoKICAgICAgICogIG5vbmUuCkBAIC00NTQsNiArNDU5LDEwIEBACiAgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAorICAgICAgICAgICAgLy8gQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IHZpcnR1YWxzCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKIHByaXZhdGU6CiAgICAgLyogSWYgbm9uQ29udGlnIGlzIG5vbi1OVUxMLCBpdCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZgogICAgICAqIGFkZGl0aW9uYWwgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzIHRoYXQgYXJlIHByZWRpY3RlZCB0byBiZSBhdmFpbGFibGUgaW1tZWRpYXRlbHksCkBAIC01NjEsNiArNTcwLDggQEAKICAgICAgICAgICAgIC8vIEZJWE1FIGVudW0gaXMgZmFzdGVyIHRoYW4gc3RyY21wKCkgZm9yIHBhcmFtZXRlciAnZnJvbScKICAgICAgICAgICAgIHN0YXR1c190IHJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKTsKIAorICAgICAgICAgICAgdm9pZCAgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworCiAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+ICAgbUF1ZGlvUmVjb3JkVGhyZWFkOwogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwogCkBAIC02NjUsNyArNjc2LDcgQEAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7ICAgLy8gRGV2aWNlIGFjdHVhbGx5IHNlbGVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBub3QgbWF0Y2ggdGhlIGFwcCBzZWxlY3Rpb24gZGVwZW5kaW5nIG9uIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgYW5kIGNvbm5lY3RlZCBkZXZpY2VzCi0gICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKKyAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJRCBhbGxvY2F0ZWQgYnkgYXVkaW8gcG9saWN5CiAKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMmUzOWQyMy4uNWE4MWQ4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMzMsNyArMzMsNyBAQAogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKIHR5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwotdHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgaW50IHNvdXJjZSwKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC0zNzAsOSArMzcwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOwogICAgIH07CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwotICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CiAKICAgICBzdGF0aWMgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwpAQCAtNDAzLDkgKzQwMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpOwogCiAKLSAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKLSAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKQEAgLTQxMyw3ICs0MTMsNyBAQAogICAgIHByaXZhdGU6CiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiA+ICAgbUlvRGVzY3JpcHRvcnM7Ci0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiA+CisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3M7CiAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBnZXRJbnB1dEJ1ZmZlclNpemUoKSBxdWVyaWVzCiAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZTaXplOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCkBAIC00NDAsOCArNDQwLDkgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCBiMTY4ZmM5Li40N2Q4N2U5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMzUsNyArMzUsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvVHJhY2sgOiBwdWJsaWMgUmVmQmFzZQorY2xhc3MgQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjawogewogcHVibGljOgogCkBAIC02MDUsNyArNjA1LDExIEBACiAKICAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCiAgICAgICAqIGF0dGFjaGVkLgotICAgICAgKiBBIHZhbHVlIG9mIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIHRoZSBhdWRpbyB0cmFjayBpcyBub3QgYXR0YWNoZWQgdG8gYW55IG91dHB1dC4KKyAgICAgICogV2hlbiB0aGUgQXVkaW9UcmFjayBpcyBpbmFjdGl2ZSwgdGhlIGRldmljZSBJRCByZXR1cm5lZCBjYW4gYmUgZWl0aGVyOgorICAgICAgKiAtIEFVRElPX1BPUlRfSEFORExFX05PTkUgaWYgdGhlIEF1ZGlvVHJhY2sgaXMgbm90IGF0dGFjaGVkIHRvIGFueSBvdXRwdXQuCisgICAgICAqIC0gVGhlIGRldmljZSBJRCB1c2VkIGJlZm9yZSBwYXVzZWQgb3Igc3RvcHBlZC4KKyAgICAgICogLSBUaGUgZGV2aWNlIElEIHNlbGVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG9mIHNldE91dHB1dERldmljZSgpIGlmIHRoZSBBdWRpb1RyYWNrCisgICAgICAqIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldC4KICAgICAgICoKICAgICAgICogUGFyYW1ldGVyczoKICAgICAgICogIG5vbmUuCkBAIC04NDUsNiArODQ5LDEyIEBACiAgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAorICAgICAgICAgICAgLy8gQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IHZpcnR1YWxzCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKworCiAgICAgLyogT2J0YWluIHRoZSBwZW5kaW5nIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBmb3IgcGxheWJhY2sgb2YgcHVyZSBQQ00KICAgICAgKiAobWl4YWJsZSB3aXRob3V0IGVtYmVkZGVkIHRpbWluZykgZGF0YSByZW1haW5pbmcgaW4gQXVkaW9UcmFjay4KICAgICAgKgpAQCAtOTc0LDYgKzk4NCw4IEBACiAKICAgICAgICAgICAgIHZvaWQgICAgIHJlc3RhcnRJZkRpc2FibGVkKCk7CiAKKyAgICAgICAgICAgIHZvaWQgICAgIHVwZGF0ZVJvdXRlZERldmljZUlkX2woKTsKKwogICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CkBAIC0xMDg1LDggKzEwOTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBzdG9wKCkgYnV0IGNvbnRpbnVlcyBtb25vdG9uaWNhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbmV3IElBdWRpb1RyYWNrIHRvIHJlc3RvcmUgbVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VsZCBiZSBlYXNpbHkgd2lkZW5lZCB0byB1aW50NjRfdAotICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbVN0YXJ0RnJvbVplcm9VczsgICAgICAgLy8gdGhlIHN0YXJ0IHRpbWUgYWZ0ZXIgZmx1c2ggb3Igc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHBvc2l0aW9uIHNob3VsZCBiZSAwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXNlZCBmb3Igb2ZmbG9hZGVkIGFuZCBkaXJlY3QgdHJhY2tzLgorICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydE5zOyAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIHdoZW4gc3RhcnQoKSBpcyBjYWxsZWQuCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVN0YXJ0RXRzOyAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgdGltZXN0YW1wIGF0IHN0YXJ0IGZvciBub3JtYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrcy4KICAgICBBdWRpb1RpbWVzdGFtcCAgICAgICAgICBtU3RhcnRUczsgICAgICAgICAgICAgICAvLyBUaW1lc3RhbXAgYXQgc3RhcnQgZm9yIG9mZmxvYWRlZCBvciBkaXJlY3QKQEAgLTExNjMsNyArMTE3Nyw3IEBACiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogCi0gICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKKyAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAvLyB1bmlxdWUgSUQgYWxsb2NhdGVkIGJ5IGF1ZGlvIHBvbGljeQogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAppbmRleCBkOTRhZDAwLi5lMGQyNDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMjYsNiArMjYsMTYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHsKKyAgICB1aWRfdCB1aWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzgsOCArNDgsOCBAQAogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBtaXhpbmcgc3RhdGUgb2YgYSBzcGVjaWZpYyBtaXggaW4gYSBkeW5hbWljIGF1ZGlvIHBvbGljeQogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawppbmRleCBlNTkyMTY5Li44Mjc5MDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKQEAgLTMsNiArMyw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY3V0aWxzICAgXAogICAgIGxpYmxvZyAgICAgIFwKICAgICBsaWJ1dGlscyAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCmluZGV4IDcxZmJkOTguLjQ5ZWY5OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCkBAIC05OCw3ICs5OCw4IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpIHsKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewogfQogCiBEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKQEAgLTEyMCwyNCArMTIxLDIxIEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBwcmltYXJ5RGV2ID0gSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKG1EZXZpY2UpOwotICAgIGlmIChwcmltYXJ5RGV2ID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgcHJpbWFyeURldi0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gcHJpbWFyeURldi0+Z2V0TWFzdGVyVm9sdW1lKAorICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKQEAgLTE0OSw5ICsxNDcsOCBAQAogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgcHJpbWFyeURldi0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7CiB9CiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCmluZGV4IDlkYTAyYTQuLjg2NTFiNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTE4LDExICsxOCwxMyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xMTAsNiArMTEyLDcgQEAKICAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwogICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgogCiAgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgogICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCmluZGV4IGI0OWI5NzUuLjYxZmI2YmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtNDAsNyArNDAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBFZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpIHsKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewogfQogCiBFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKQEAgLTQ5LDYgKzQ5LDkgQEAKICAgICAgICAgbUVmZmVjdC5jbGVhcigpOwogICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9CiB9CiAKIC8vIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTZhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKQEAgLTAsMCArMSwyIEBACitrcm9jYXJkQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKaW5kZXggNDI3ODVkNS4uMGNhZmEzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTQ3LDcgKzQ3LDIwIEBACiBTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKICAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCiAgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKKyAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKKyAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKKworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KIH0KIAogU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CkBAIC02MSw3ICs3NCwxMSBAQAogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKQEAgLTEzNSw2ICsxNTIsNyBAQAogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7CiB9CiAKQEAgLTE4OSw2ICsyMDcsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKK30KKwogYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewogICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzA3LDExICszMzMsMjIgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhieXRlcykpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RKSB7CisgICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCisgICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KKyAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAogICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAogICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47CkBAIC0zMjAsNiArMzU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwogICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKApAQCAtNTgwLDcgKzYxOSw3IEBACiAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwogICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CiAgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7Ci0gICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgewpAQCAtNTkxLDYgKzYzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKICAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKICAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCmluZGV4IGE3ZGYyNzYuLmQ0YWI5NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwpAQCAtMTAxLDEyICsxMDIsMTggQEAKICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgogICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKIAorICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKwogICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwogCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKwogICBwcml2YXRlOgogICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKICAgICBJU3RyZWFtICptU3RyZWFtOwogICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7CisgICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwogfTsKIAogY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAppbmRleCAwNTgwMGEwLi5kYzE3ZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0yNyw3ICsyNywxNSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQogfQogCiBTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewpAQCAtOTUsNyArMTAzLDkgQEAKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CkBAIC0xMzMsNiArMTQzLDcgQEAKICAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CiAgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewogICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKndyaXR0ZW4gPSAwOwpAQCAtMjY2LDYgKzI3Nyw3IEBACiAgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKICAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKICAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpyZWFkID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCmluZGV4IDhjOTZjMWYuLmM3MTM2ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAogCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Myw2ICs4NCw5IEBACiAKICAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKIAorICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKICAgcHJpdmF0ZToKICAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhiMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9TdHJlYW1IYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9oaWRsL0hhbERlYXRoSGFuZGxlci5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKaW5kZXggY2NhYTJiNC4uMGRkM2YxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icApAQCAtMSArMSBAQAotc3ViZGlycyA9IFsiZmFjdG9yeSJdCitzdWJkaXJzID0gWyJmYWN0b3J5IiwgImNvbmZpZyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2RlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk4YTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDE3IEBACisvLyBFZmZlY3QgY29uZmlndXJhdGlvbgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWyJzcmMvRWZmZWN0c0NvbmZpZy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidGlueXhtbDIiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmggYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE3MzBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvaW5jbHVkZS9tZWRpYS9FZmZlY3RzQ29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKKworLyoqIEBmaWxlIFBhcnNlcyBhdWRpbyBlZmZlY3RzIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBDIGFuZCBDKysgc3RydWN0dXJlLgorICogQHNlZSBhdWRpb19lZmZlY3RzX2NvbmZfVjJfMC54c2QgZm9yIGRvY3VtZW50YXRpb24gb24gZWFjaCBzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KK2NvbnN0ZXhwciBjaGFyIERFRkFVTFRfUEFUSFtdID0gIi92ZW5kb3IvZXRjL2F1ZGlvX2VmZmVjdHMueG1sIjsKKworLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIW10gPQorI2lmZGVmIF9fTFA2NF9fCisgICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKKyNlbHNlCisgICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKKyNlbmRpZgorCitzdHJ1Y3QgTGlicmFyeSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworfTsKK3VzaW5nIExpYnJhcmllcyA9IHN0ZDo6dmVjdG9yPExpYnJhcnk+OworCitzdHJ1Y3QgRWZmZWN0SW1wbCB7CisgICAgTGlicmFyeSogbGlicmFyeTsgLy88IE9ubHkgdmFsaWQgYXMgbG9uZyBhcyB0aGUgYXNzb2NpYXRlZCBsaWJyYXJ5IHZlY3RvciBpcyB1bm1vZGlmaWVkCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworfTsKKworc3RydWN0IEVmZmVjdCA6IHB1YmxpYyBFZmZlY3RJbXBsIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgaXNQcm94eTsKKyAgICBFZmZlY3RJbXBsIGxpYlN3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5CisgICAgRWZmZWN0SW1wbCBsaWJIdzsgLy88IE9ubHkgdmFsaWQgaWYgaXNQcm94eQorfTsKKwordXNpbmcgRWZmZWN0cyA9IHN0ZDo6dmVjdG9yPEVmZmVjdD47CisKK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorc3RydWN0IFN0cmVhbSB7CisgICAgVHlwZSB0eXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8RWZmZWN0Pj4gZWZmZWN0czsKK307Cit1c2luZyBPdXRwdXRTdHJlYW0gPSBTdHJlYW08YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBJbnB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zb3VyY2VfdD47CisKKy8qKiBQYXJzZWQgY29uZmlndXJhdGlvbi4KKyAqIEludGVuZGVkIHRvIGJlIGEgdHJhbnNpZW50IHN0cnVjdHVyZSBvbmx5IHVzZWQgZm9yIGRlc2VyaWFsaXphdGlvbi4KKyAqIE5vdGU6IEV2ZXJ5dGhpbmcgaXMgY29waWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHhtbCBkb20uCisgKiAgICAgICBJZiBjb3BpZXMgbmVlZGVkIHRvIGJlIGF2b2lkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlLAorICogICAgICAgY29uc2lkZXIga2VlcGluZyBhIHByaXZhdGUgaGFuZGxlIG9uIHRoZSB4bWwgZG9tIGFuZCByZXBsYWNlIGFsbCBzdHJpbmdzIGJ5IGRvbSBwb2ludGVycy4KKyAqICAgICAgIE9yIGV2ZW4gYmV0dGVyLCB1c2UgU0FYIHBhcnNpbmcgdG8gYXZvaWQgdGhlIGFsbG9jYXRpb25zIGFsbCB0b2dldGhlci4KKyAqLworc3RydWN0IENvbmZpZyB7CisgICAgZmxvYXQgdmVyc2lvbjsKKyAgICBMaWJyYXJpZXMgbGlicmFyaWVzOworICAgIEVmZmVjdHMgZWZmZWN0czsKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW0+IHBvc3Rwcm9jZXNzOworICAgIHN0ZDo6dmVjdG9yPElucHV0U3RyZWFtPiBwcmVwcm9jZXNzOworfTsKKworLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLworc3RydWN0IFBhcnNpbmdSZXN1bHQgeworICAgIC8qKiBQYXJzZWQgY29uZmlnLCBudWxscHRyIGlmIHRoZSB4bWwgbGliIGNvdWxkIG5vdCBsb2FkIHRoZSBmaWxlICovCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gcGFyc2VkQ29uZmlnOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50OyAvLzwgTnVtYmVyIG9mIHNraXBwZWQgaW52YWxpZCBsaWJyYXJ5LCBlZmZlY3Qgb3IgcHJvY2Vzc2luZyBjaGFpbgorfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgZWZmZWN0IGNvbmZpZ3VyYXRpb24uCisgKiBQYXJzaW5nIGRvIG5vdCBzdG9wIG9mIGZpcnN0IGludmFsaWQgZWxlbWVudCwgYnV0IGNvbnRpbnVlcyB0byB0aGUgbmV4dC4KKyAqIEBzZWUgUGFyc2luZ1Jlc3VsdDo6bmJTa2lwcGVkRWxlbWVudAorICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRUZGRUNUU0NPTkZJR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0NjJmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0NvbmZpZyIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8dGlueXhtbDIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB0aW55eG1sMjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgeworCisvKiogQWxsIGZ1bmN0aW9ucyBleGNlcHQgYHBhcnNlKGNvbnN0IGNoYXIqKWAgYXJlIHN0YXRpYy4gKi8KK25hbWVzcGFjZSB7CisKKy8qKiBAcmV0dXJuIGFsbCBgbm9kZWBzIGNoaWxkcmVuIHRoYXQgYXJlIGVsZW1lbnRzIGFuZCBtYXRjaCB0aGUgdGFnIGlmIHByb3ZpZGVkLiAqLworc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gZ2V0Q2hpbGRyZW4oY29uc3QgWE1MTm9kZSYgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNoaWxkVGFnID0gbnVsbHB0cikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgWE1MRWxlbWVudD4+IGNoaWxkcmVuOworICAgIGZvciAoYXV0byogY2hpbGQgPSBub2RlLkZpcnN0Q2hpbGRFbGVtZW50KGNoaWxkVGFnKTsgY2hpbGQgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPk5leHRTaWJsaW5nRWxlbWVudChjaGlsZFRhZykpIHsKKyAgICAgICAgY2hpbGRyZW4uZW1wbGFjZV9iYWNrKCpjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBjaGlsZHJlbjsKK30KKworLyoqIEByZXR1cm4geG1sIGR1bXAgb2YgdGhlIHByb3ZpZGVkIGVsZW1lbnQuCisgKiBCeSBub3QgcHJvdmlkaW5nIGEgcHJpbnRlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgZHVtcCgpLgorICovCitjb25zdCBjaGFyKiBkdW1wKGNvbnN0IFhNTEVsZW1lbnQmIGVsZW1lbnQsIFhNTFByaW50ZXImJiBwcmludGVyID0ge30pIHsKKyAgICBlbGVtZW50LkFjY2VwdCgmcHJpbnRlcik7CisgICAgcmV0dXJuIHByaW50ZXIuQ1N0cigpOworfQorCisKK2Jvb2wgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKK3sKKyAgICB1aW50MzJfdCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKKyAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKKyAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKKyAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107CisgICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKKyAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOworICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07CisgICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKKyAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOworICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIE1hcCB0aGUgZW51bSBhbmQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIHR5cGUuCisgKiAgSW50ZW5kZWQgdG8gYmUgc3BlY2lhbGl6ZWQgZm9yIGVhY2ggZW51bSB0byBkZXNlcmlhbGl6ZS4KKyAqICBUaGUgZ2VuZXJhbCB0ZW1wbGF0ZSBpcyBkaXNhYmxlZC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIEVudW0+Citjb25zdGV4cHIgc3RkOjplbmFibGVfaWY8ZmFsc2UsIEVudW0+IFNUUkVBTV9OQU1FX01BUDsKKworLyoqIEFsbCBvdXRwdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3N0cmVhbV90eXBlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc3RyZWFtX3R5cGVfdD5bXSA9IHsKKyAgICAgICAge0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1NZU1RFTSwgInN5c3RlbSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1JJTkcsICJyaW5nIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fTVVTSUMsICJtdXNpYyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0FMQVJNLCAiYWxhcm0ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sICJub3RpZmljYXRpb24ifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiYmx1ZXRvb3RoX3NjbyJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICJlbmZvcmNlZF9hdWRpYmxlIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRFRNRiwgImR0bWYifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9UVFMsICJ0dHMifSwKK307CisKKy8qKiBBbGwgaW5wdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KKyAqIFRoaXMgbmVlZCB0byBiZSBrZXB0IGluIHNpbmsgd2l0aCB0aGUgeHNkIHN0cmVhbU91dHB1dFR5cGUuCisgKi8KK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgc3RkOjpwYWlyPGF1ZGlvX3NvdXJjZV90LCBjb25zdCBjaGFyKj4gU1RSRUFNX05BTUVfTUFQPGF1ZGlvX3NvdXJjZV90PltdID0geworICAgICAgICB7QVVESU9fU09VUkNFX01JQywgIm1pYyJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywgInZvaWNlX3VwbGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LLCAidm9pY2VfZG93bmxpbmsifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCAidm9pY2VfY2FsbCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX0NBTUNPUkRFUiwgImNhbWNvcmRlciJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAidm9pY2VfcmVjb2duaXRpb24ifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCAidm9pY2VfY29tbXVuaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELCAidW5wcm9jZXNzZWQifSwKK307CisKKy8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4KK2Jvb2wgc3RyaW5nVG9TdHJlYW1UeXBlKGNvbnN0IGNoYXIgKnN0cmVhbU5hbWUsIFR5cGUqIHR5cGUpCit7CisgICAgZm9yIChhdXRvJiBzdHJlYW1OYW1lUGFpciA6IFNUUkVBTV9OQU1FX01BUDxUeXBlPikgeworICAgICAgICBpZiAoc3RyY21wKHN0cmVhbU5hbWVQYWlyLnNlY29uZCwgc3RyZWFtTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgKnR5cGUgPSBzdHJlYW1OYW1lUGFpci5maXJzdDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqIFBhcnNlIGEgbGlicmFyeSB4bWwgbm90ZSBhbmQgcHVzaCB0aGUgcmVzdWx0IGluIGxpYnJhcmllcyBvciByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VMaWJyYXJ5KGNvbnN0IFhNTEVsZW1lbnQmIHhtbExpYnJhcnksIExpYnJhcmllcyogbGlicmFyaWVzKSB7CisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJuYW1lIik7CisgICAgY29uc3QgY2hhciogcGF0aCA9IHhtbExpYnJhcnkuQXR0cmlidXRlKCJwYXRoIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCBwYXRoID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImxpYnJhcnkgbXVzdCBoYXZlIGEgbmFtZSBhbmQgYSBwYXRoOiAlcyIsIGR1bXAoeG1sTGlicmFyeSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxpYnJhcmllcy0+cHVzaF9iYWNrKHtuYW1lLCBwYXRofSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBGaW5kIGFuIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIGJ5IGl0cyBuYW1lLgorICogQHJldHVybiBudWxscHRyIGlmIG5vdCBmb3VuZCwgdGhlIGVsbGVtZW50cyBhZGRyZXNzIGlmIGZvdW5kLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QqIGZpbmRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc3RkOjp2ZWN0b3I8VD4mIGNvbGxlY3Rpb24pIHsKKyAgICBhdXRvIGl0ID0gZmluZF9pZihiZWdpbihjb2xsZWN0aW9uKSwgZW5kKGNvbGxlY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXSAoYXV0byYgaXRlbSkgeyByZXR1cm4gaXRlbS5uYW1lID09IG5hbWU7IH0pOworICAgIHJldHVybiBpdCAhPSBlbmQoY29sbGVjdGlvbikgPyAmKml0IDogbnVsbHB0cjsKK30KKworLyoqIFBhcnNlIGFuIGVmZmVjdCBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgZWZmZWN0IGluIGVmZmVjdHMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK2Jvb2wgcGFyc2VFZmZlY3QoY29uc3QgWE1MRWxlbWVudCYgeG1sRWZmZWN0LCBMaWJyYXJpZXMmIGxpYnJhcmllcywgRWZmZWN0cyogZWZmZWN0cykgeworICAgIEVmZmVjdCBlZmZlY3R7fTsKKworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSB4bWxFZmZlY3QuQXR0cmlidXRlKCJuYW1lIik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbXVzdCBoYXZlIGEgbmFtZTogJXMiLCB4bWxFZmZlY3QuVmFsdWUoKSwgZHVtcCh4bWxFZmZlY3QpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlZmZlY3QubmFtZSA9IG5hbWU7CisKKyAgICAvLyBGdW5jdGlvbiB0byBwYXJzZSBlZmZlY3QubGlicmFyeSBhbmQgZWZmZWN0LnV1aWQgZnJvbSB4bWwKKyAgICBhdXRvIHBhcnNlSW1wbCA9IFsmbGlicmFyaWVzXShjb25zdCBYTUxFbGVtZW50JiB4bWxJbXBsLCBFZmZlY3RJbXBsJiBlZmZlY3QpIHsKKyAgICAgICAgLy8gUmV0cmlldmUgbGlicmFyeSBuYW1lIGFuZCB1dWlkIGZyb20geG1sCisgICAgICAgIGNvbnN0IGNoYXIqIGxpYnJhcnlOYW1lID0geG1sSW1wbC5BdHRyaWJ1dGUoImxpYnJhcnkiKTsKKyAgICAgICAgY29uc3QgY2hhciogdXVpZCA9IHhtbEltcGwuQXR0cmlidXRlKCJ1dWlkIik7CisgICAgICAgIGlmIChsaWJyYXJ5TmFtZSA9PSBudWxscHRyIHx8IHV1aWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImVmZmVjdCBtdXN0IGhhdmUgYSBsaWJyYXJ5IG5hbWUgYW5kIGEgdXVpZDogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgbGlicmFyeSBuYW1lIHRvIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXNseSBsb2FkZWQgbGlicmFyeQorICAgICAgICBhdXRvKiBsaWJyYXJ5ID0gZmluZEJ5TmFtZShsaWJyYXJ5TmFtZSwgbGlicmFyaWVzKTsKKyAgICAgICAgaWYgKGxpYnJhcnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3QubGlicmFyeSA9IGxpYnJhcnk7CisKKyAgICAgICAgaWYgKCFzdHJpbmdUb1V1aWQodXVpZCwgJmVmZmVjdC51dWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdXVpZCBpbjogJXMiLCBkdW1wKHhtbEltcGwpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKCFwYXJzZUltcGwoeG1sRWZmZWN0LCBlZmZlY3QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcHJveHkgZWZmZWN0cworICAgIGVmZmVjdC5pc1Byb3h5ID0gZmFsc2U7CisgICAgaWYgKHN0ZDo6c3RyY21wKHhtbEVmZmVjdC5OYW1lKCksICJlZmZlY3RQcm94eSIpID09IDApIHsKKyAgICAgICAgZWZmZWN0LmlzUHJveHkgPSB0cnVlOworCisgICAgICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGxpYmh3IGFuZCBsaWJzdworICAgICAgICBhdXRvIHBhcnNlUHJveHkgPSBbJnhtbEVmZmVjdCwgJnBhcnNlSW1wbF0oY29uc3QgY2hhciogdGFnLCBFZmZlY3RJbXBsJiBwcm94eUxpYikgeworICAgICAgICAgICAgYXV0byogeG1sUHJveHlMaWIgPSB4bWxFZmZlY3QuRmlyc3RDaGlsZEVsZW1lbnQodGFnKTsKKyAgICAgICAgICAgIGlmICh4bWxQcm94eUxpYiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImVmZmVjdFByb3h5IG11c3QgY29udGFpbiBhIDwlcz46ICVzIiwgdGFnLCBkdW1wKCp4bWxQcm94eUxpYikpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZUltcGwoKnhtbFByb3h5TGliLCBwcm94eUxpYik7CisgICAgICAgIH07CisgICAgICAgIGlmICghcGFyc2VQcm94eSgibGliaHciLCBlZmZlY3QubGliSHcpIHx8ICFwYXJzZVByb3h5KCJsaWJzdyIsIGVmZmVjdC5saWJTdykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVmZmVjdHMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoZWZmZWN0KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBQYXJzZSBhbiBzdHJlYW0gZnJvbSBhbiB4bWwgZWxlbWVudCBkZXNjcmliaW5nIGl0LgorICogQHJldHVybiB0cnVlIGFuZCBwdXNoZXMgdGhlIHN0cmVhbSBpbiBzdHJlYW1zIG9uIHN1Y2Nlc3MsCisgKiAgICAgICAgIGZhbHNlIG9uIGZhaWx1cmUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgU3RyZWFtPgorYm9vbCBwYXJzZVN0cmVhbShjb25zdCBYTUxFbGVtZW50JiB4bWxTdHJlYW0sIEVmZmVjdHMmIGVmZmVjdHMsIHN0ZDo6dmVjdG9yPFN0cmVhbT4qIHN0cmVhbXMpIHsKKyAgICBjb25zdCBjaGFyKiBzdHJlYW1UeXBlID0geG1sU3RyZWFtLkF0dHJpYnV0ZSgidHlwZSIpOworICAgIGlmIChzdHJlYW1UeXBlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBtdXN0IGhhdmUgYSB0eXBlOiAlcyIsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyZWFtIHN0cmVhbTsKKyAgICBpZiAoIXN0cmluZ1RvU3RyZWFtVHlwZShzdHJlYW1UeXBlLCAmc3RyZWFtLnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVzOiAlcyIsIHN0cmVhbVR5cGUsIGR1bXAoeG1sU3RyZWFtKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIHhtbEFwcGx5IDogZ2V0Q2hpbGRyZW4oeG1sU3RyZWFtLCAiYXBwbHkiKSkgeworICAgICAgICBjb25zdCBjaGFyKiBlZmZlY3ROYW1lID0geG1sQXBwbHkuZ2V0KCkuQXR0cmlidXRlKCJlZmZlY3QiKTsKKyAgICAgICAgaWYgKGVmZmVjdE5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInN0cmVhbS9hcHBseSBtdXN0IGhhdmUgcmVmZXJlbmNlIGFuIGVmZmVjdDogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXV0byogZWZmZWN0ID0gZmluZEJ5TmFtZShlZmZlY3ROYW1lLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgZWZmZWN0IHJlZmVyZW5jZWQgaW46ICVzIiwgZHVtcCh4bWxBcHBseSkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbS5lZmZlY3RzLmVtcGxhY2VfYmFjaygqZWZmZWN0KTsKKyAgICB9CisgICAgc3RyZWFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShzdHJlYW0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlCisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIFhNTERvY3VtZW50IGRvYzsKKyAgICBkb2MuTG9hZEZpbGUocGF0aCk7CisgICAgaWYgKGRvYy5FcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkdldEVycm9yU3RyMSgpLCBkb2MuR2V0RXJyb3JTdHIyKCkpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKworICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBhdXRvIHJlZ2lzdGVyRmFpbHVyZSA9IFsmbmJTa2lwcGVkRWxlbWVudHNdKGJvb2wgcmVzdWx0KSB7CisgICAgICAgIG5iU2tpcHBlZEVsZW1lbnRzICs9IHJlc3VsdCA/IDAgOiAxOworICAgIH07CisgICAgZm9yIChhdXRvJiB4bWxDb25maWcgOiBnZXRDaGlsZHJlbihkb2MsICJhdWRpb19lZmZlY3RzX2NvbmYiKSkgeworCisgICAgICAgIC8vIFBhcnNlIGxpYnJhcnkKKyAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJpZXMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJsaWJyYXJpZXMiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxMaWJyYXJ5IDogZ2V0Q2hpbGRyZW4oeG1sTGlicmFyaWVzLCAibGlicmFyeSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlTGlicmFyeSh4bWxMaWJyYXJ5LCAmY29uZmlnLT5saWJyYXJpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIGVmZmVjdHMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxFZmZlY3RzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAiZWZmZWN0cyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdCA6IGdldENoaWxkcmVuKHhtbEVmZmVjdHMpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlRWZmZWN0KHhtbEVmZmVjdCwgY29uZmlnLT5saWJyYXJpZXMsICZjb25maWctPmVmZmVjdHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHByZSBwcm9jZXNzaW5nIGNoYWlucworICAgICAgICBmb3IgKGF1dG8mIHhtbFByZXByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwcmVwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUHJlcHJvY2VzcywgInN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlU3RyZWFtKHhtbFN0cmVhbSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5wcmVwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSBwb3N0IHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUG9zdHByb2Nlc3MgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJwb3N0cHJvY2VzcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbFN0cmVhbSA6IGdldENoaWxkcmVuKHhtbFBvc3Rwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnBvc3Rwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworfQorCit9IC8vIG5hbWVzcGFjZSBlZmZlY3RzQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCmluZGV4IDczZjZlZjUuLmE1ZmJmMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCkBAIC0yMCw2ICsyMCw3IEBACiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKKyMtREJVSUxEX0ZMT0FUCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggN2M2ODVlYy4uYjRhMWQ3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0zMyw2ICszMywxMCBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIE1JTlVTXzNfREJfSU5fRkxPQVQgMC43MDcxMDY3OGYgLy8gLTNkQiA9IDAuNzA3MTA2NzhmCisjZW5kaWYKKwogLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKICAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLApAQCAtODIsOCArODYsMTkgQEAKIAogLy8gbnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhpcyBsaWJyYXJ5CiBjb25zdCBpbnQga05iRWZmZWN0cyA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7Ci0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIGNsYW1wX2Zsb2F0KExWTV9GTE9BVCBhKSB7CisgICAgaWYgKGEgPiAxLjBmKSB7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBlbHNlIGlmIChhIDwgLTEuMGYpIHsKKyAgICAgICAgcmV0dXJuIC0xLjBmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFRlc3QgY29kZQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yODYsNyArMzAxLDcgQEAKICAgICByZXR1cm4gLUVJTlZBTDsKIH0KIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KIAogc3RhdGljIGludCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCkBAIC0zODUsNyArNDAwLDEwOCBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KKy8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCitzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CisKKyAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOworICAgIExWTV9GTE9BVCAqcFNyYywgKnBEc3Q7CisgICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopc2VsZjsKKworICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OworCisgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGFuIHVuaW5pdGlhbGl6ZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGEgbm9uLWNvbmZpZ3VyZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBwU3JjID0gKExWTV9GTE9BVCAqKSBpbkJ1ZmZlci0+czE2OworICAgIHBEc3QgPSAoTFZNX0ZMT0FUICopIG91dEJ1ZmZlci0+czE2OworICAgIHNpemVfdCBudW1GcmFtZXMgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisKKyAgICBjb25zdCBib29sIGFjY3VtdWxhdGUgPQorICAgICAgICAgICAgKHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBjb25zdCB1aW50MzJfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKworICAgIHN3aXRjaChwRG93bm1peGVyLT50eXBlKSB7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX1NUUklQOgorICAgICAgICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgcFNyY1swXSk7CisgICAgICAgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIHBTcmNbMV0pOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICBwRHN0WzBdID0gcFNyY1swXTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBwU3JjWzFdOworICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OworICAgICAgICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6CisjaWZkZWYgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSCisgICAgICAgICAgLy8gYnlwYXNzIHRoZSBvcHRpbWl6ZWQgZG93bm1peCByb3V0aW5lcyBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCisgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgc3dpdGNoKChkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190KWRvd25taXhJbnB1dENoYW5uZWxNYXNrKSB7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0s6CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb201UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogc3RhdGljIGludCBEb3dubWl4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CkBAIC04MjIsNiArOTM4LDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKQEAgLTg0OSw3ICs5NjYsMzUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJSCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIEZMICsgUkwKKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdCgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZik7CisgICAgICAgICAgICAvLyBGUiArIFJSCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MSgpCkBAIC04NjgsNiArMTAxMyw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKICAgICBpbnQzMl90IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAogICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCkBAIC05MTIsNyArMTA1OCw1MiBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA2OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb203UG9pbnQxKCkKQEAgLTkzMSw2ICsxMTIyLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTk3Nyw4ICsxMTY5LDU0IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2Vsc2UKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDYgaXMgU0wKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNyBpcyBTUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA4OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEb3dubWl4X2ZvbGRHZW5lcmljKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwNSw2ICsxMjQzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICB1aW50MzJfdCBtYXNrLCBpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogCkBAIC0xMDk2LDMgKzEzMzUsOTYgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CisjZWxzZQorYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisKKyAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBoYXNTaWRlcyA9IChtYXNrICYga1NpZGVzKSAhPSAwOworICAgIGNvbnN0IGJvb2wgaGFzQmFja3MgPSAobWFzayAmIGtCYWNrcykgIT0gMDsKKworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOworICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CisgICAgY29uc3QgYm9vbCBoYXNMRkUgPQorICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CisgICAgY29uc3QgYm9vbCBoYXNCQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7CisgICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgLy8gICBGTCBGUiBGQyBMRkUgQkwgQlIgQkMgU0wgU1IKKyAgICAvLyB3aGVuIGEgY2hhbm5lbCBpcyBub3QgcHJlc2VudCwgaXRzIGluZGV4IGlzIHNldCB0byB0aGUgc2FtZSBhcyB0aGUgaW5kZXggb2YgdGhlIHByZWNlZGluZworICAgIC8vIGNoYW5uZWwKKyAgICBjb25zdCBpbnQgaW5kZXhGQyAgPSBoYXNGQyAgICA/IDIgICAgICAgICAgICA6IDE7ICAgICAgICAvLyBmcm9udCBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhMRkUgPSBoYXNMRkUgICA/IGluZGV4RkMgKyAxICA6IGluZGV4RkM7ICAvLyBsb3cgZnJlcXVlbmN5CisgICAgY29uc3QgaW50IGluZGV4QkwgID0gaGFzQmFja3MgPyBpbmRleExGRSArIDEgOiBpbmRleExGRTsgLy8gYmFjayBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4QlIgID0gaGFzQmFja3MgPyBpbmRleEJMICsgMSAgOiBpbmRleEJMOyAgLy8gYmFjayByaWdodAorICAgIGNvbnN0IGludCBpbmRleEJDICA9IGhhc0JDICAgID8gaW5kZXhCUiArIDEgIDogaW5kZXhCUjsgIC8vIGJhY2sgY2VudGVyCisgICAgY29uc3QgaW50IGluZGV4U0wgID0gaGFzU2lkZXMgPyBpbmRleEJDICsgMSAgOiBpbmRleEJDOyAgLy8gc2lkZSBsZWZ0CisgICAgY29uc3QgaW50IGluZGV4U1IgID0gaGFzU2lkZXMgPyBpbmRleFNMICsgMSAgOiBpbmRleFNMOyAgLy8gc2lkZSByaWdodAorCisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyc0xmZUNvbnRyaWI7CisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlIGNvbnRyaWJ1dGlvbiBvZiBGQywgQkMgYW5kIExGRQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgPSAwOworICAgICAgICAgICAgaWYgKGhhc0ZDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4RkNdOyB9CisgICAgICAgICAgICBpZiAoaGFzTEZFKSB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhMRkVdOyB9CisgICAgICAgICAgICBpZiAoaGFzQkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107IH0KKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7CisgICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCisgICAgICAgICAgICBsdCA9IHBTcmNbMF07CisgICAgICAgICAgICBydCA9IHBTcmNbMV07CisgICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCisgICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKKyAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdOworICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKaW5kZXggMjM5OWFiZC4uYzFiZTBmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCkBAIC0yNyw3ICsyNyw5IEBACiAqLwogCiAjZGVmaW5lIERPV05NSVhfT1VUUFVUX0NIQU5ORUxTIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZNX0ZMT0FUIGZsb2F0CisjZW5kaWYKIHR5cGVkZWYgZW51bSB7CiAgICAgRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVELAogICAgIERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQsCkBAIC05NSwxMSArOTcsMTggQEAKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7CiBpbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKIGludCBEb3dubWl4X2dldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Cit2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbHNlCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKyNlbmRpZgogCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVERPV05NSVhfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAppbmRleCAxNjY4MGJkLi5kZGJmZGQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icApAQCAtMTAsMTggKzEwLDQ3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmVmZmVjdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBzcmNzOiBbIkVmZmVjdHNGYWN0b3J5LmMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICAiRWZmZWN0c0ZhY3RvcnkuYyIsCisgICAgICAgICAiRWZmZWN0c0NvbmZpZ0xvYWRlci5jIiwKKyAgICAgICAgICJFZmZlY3RzRmFjdG9yeVN0YXRlLmMiLAorICAgICAgICAgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIiwKKyAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZWZmZWN0c2NvbmZpZyIsCiAgICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIl0sCisgICAgY2ZsYWdzOiBbIi1mdmlzaWJpbGl0eT1oaWRkZW4iXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczpbImluY2x1ZGUvbWVkaWEiXSwKIAotICAgIGhlYWRlcl9saWJzOiBbImxpYmVmZmVjdHNfaGVhZGVycyJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliZWZmZWN0c19oZWFkZXJzIiwKKyAgICBdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCiB9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImR1bXBFZmZlY3RDb25maWdGaWxlIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJ0ZXN0L0R1bXBDb25maWcuY3BwIl0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICAgICAgImxpYmVmZmVjdHMiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOlsiLiIsICJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VmMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwpAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIExvY2FsIGZ1bmN0aW9ucyBwcm90b3R5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7CisvLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAorc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOworc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOworCitzdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpCit7CisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICByZXR1cm4gbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisgICAgbG9hZExpYnJhcmllcyhyb290KTsKKyAgICBsb2FkRWZmZWN0cyhyb290KTsKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX0xQNjRfXworLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAorc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9CisgICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQorICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKKworLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAorLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCisvLyBpbiBsaWJfcGF0aF9vdXQKK2ludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKKyAgICBjaGFyICpzdHI7CisgICAgY29uc3QgY2hhciAqbGliX25hbWU7CisgICAgc2l6ZV90IGxlbjsKKworICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOworCisgICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKKyAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKKyAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7CisgICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOworCisgICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgeworICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworCisgICAgICAgIHNucHJpbnRmKHBhdGgsCisgICAgICAgICAgICAgICAgIFBBVEhfTUFYLAorICAgICAgICAgICAgICAgICAiJXMvJXMiLAorICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAorICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7CisgICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgeworICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7CisgICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAorICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKKworCitpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY25vZGUgKm5vZGU7CisgICAgdm9pZCAqaGRsID0gTlVMTDsKKyAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOworICAgIGxpc3RfZWxlbV90ICplOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKKyAgICBpZiAoaGRsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7CisgICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQorICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKKyAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOworICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKKyAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7CisgICAgbC0+aGFuZGxlID0gaGRsOworICAgIGwtPmRlc2MgPSBkZXNjOworICAgIGwtPmVmZmVjdHMgPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7CisKKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IGw7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKKyAgICBnTGlicmFyeUxpc3QgPSBlOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChoZGwgIT0gTlVMTCkgeworICAgICAgICBkbGNsb3NlKGhkbCk7CisgICAgfQorICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKKyAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKKyAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7CisKKyAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZmUtPm9iamVjdCA9IGZsOworICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OworICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOworICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQorLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQorLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitpbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQoreworICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKKyAgICBpZiAobCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7CisgICAgICAgIGNoYXIgc1s0MF07CisgICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOworICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisjaWYgKExPR19OREVCVUc9PTApCisgICAgY2hhciBzWzUxMl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7CisgICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKKyAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5CisgICAgc3ViX2VmZmVjdC0+bGliID0gbDsKKyAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7CisgICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKKyAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOworICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGU7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBsaWJfZW50cnlfdCAqdG1wOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7CisgICAgICAgIHNraXAgPSB0cnVlOworICAgIH0KKworICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gZDsKKyAgICBpZiAoc2tpcCkgeworICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOworICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgbC0+ZWZmZWN0cyA9IGU7CisgICAgfQorCisgICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCisgICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCisgICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAorICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIGludCBjb3VudCA9IDI7CisgICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOworICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7CisgICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOworICAgICAgICBzdWJlLT5vYmplY3QgPSBkOworICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKKyAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOworICAgIH0KKyAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7CisgICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgeworICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7CisgICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKKyAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKKyAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOworICAgICAgICAgICBmcmVlKHN1YmUpOworICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICAgICB9CisgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OworICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOworICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCisgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKKyAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYworICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgeworICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOworICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOworICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOworICAgICAgIH0gZWxzZQorICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7CisgICAgICAgY291bnQtLTsKKyAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYworICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgeworICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2xpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKKyAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OworICAgIH0KKworICAgIGUgPSBnTGlicmFyeUxpc3Q7CisgICAgd2hpbGUgKGUpIHsKKyAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODI2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqIFBhcnNlcyB0aGUgcGxhdGZvcm0gZWZmZWN0IGNvbmZpZ3VyYXRpb24KKyAqIGFuZCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gdGhlIGdsb2JhbCBFZmZlY3RGYWN0b3J5U3RhdGUuICovCitBTkRST0lEX0FQSQoraW50IEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIEFORFJPSURfRUZGRUNUU0NPTkZJR0xPQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IDM3YzBiYjcuLmNkMGU3NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0xNyw2NSArMTcsNDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnkiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisjaW5jbHVkZSAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKIAogc3RhdGljIGxpc3RfZWxlbV90ICpnRWZmZWN0TGlzdDsgLy8gbGlzdCBvZiBlZmZlY3RfZW50cnlfdDogYWxsIGN1cnJlbnRseSBjcmVhdGVkIGVmZmVjdHMKLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdHMgc2tpcHBlZCBiZWNhdXNlIG9mIGR1cGxpY2F0ZSB1dWlkCi0vLyBsaXN0IG9mIGVmZmVjdF9kZXNjcmlwdG9yIGFuZCBsaXN0IG9mIHN1YiBlZmZlY3RzIDogYWxsIGN1cnJlbnRseSBsb2FkZWQKLS8vIEl0IGRvZXMgbm90IGNvbnRhaW4gZWZmZWN0cyB3aXRob3V0IHN1YiBlZmZlY3RzLgotc3RhdGljIGxpc3Rfc3ViX2VsZW1fdCAqZ1N1YkVmZmVjdExpc3Q7Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAogc3RhdGljIHVpbnQzMl90IGdOdW1FZmZlY3RzOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBudW1iZXIgb2YgZWZmZWN0cwogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyTGliOyAgICAvLyBjdXJyZW50IGxpYnJhcnkgaW4gZW51bWVyYXRpb24gcHJvY2Vzcwogc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyRWZmZWN0OyAvLyBjdXJyZW50IGVmZmVjdCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgdWludDMyX3QgZ0N1ckVmZmVjdElkeDsgICAgICAgLy8gY3VycmVudCBlZmZlY3QgaW5kZXggaW4gZW51bWVyYXRpb24gcHJvY2Vzcwotc3RhdGljIGxpYl9lbnRyeV90ICpnQ2FjaGVkTGlicmFyeTsgIC8vIGxhc3QgbGlicmFyeSBhY2Nlc3NlZCBieSBnZXRMaWJyYXJ5KCkKKy8qKiBOdW1iZXIgb2YgZWxlbWVudHMgc2tpcHBlZCBkdXJpbmcgdGhlIGVmZmVjdHMgY29uZmlndXJhdGlvbiBsb2FkaW5nLgorICogIC0xIGlmIHRoZSBjb25maWcgbG9hZGVyIGZhaWxlZAorICogIC0yIGlmIGNvbmZpZyBsb2FkIHdhcyBza2lwcGVkCisgKi8KK3N0YXRpYyBzc2l6ZV90IGdDb25maWdOYkVsZW1Ta2lwcGVkID0gLTI7CiAKIHN0YXRpYyBpbnQgZ0luaXREb25lOyAvLyB0cnVlIGlzIGdsb2JhbCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBwcmVmb3JtZWQKIHN0YXRpYyBpbnQgZ0NhblF1ZXJ5RWZmZWN0OyAvLyBpbmRpY2F0ZXMgdGhhdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5RWZmZWN0KCkgaXMgdmFsaWQsIGkuZS4gdGhhdCB0aGUgbGlzdCBvZiBlZmZlY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBub3QgbW9kaWZpZWQgc2luY2UgbGFzdCBjYWxsIHRvIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCi0KLXN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlGYWlsZWRMaXN0OyAgLy9saXN0IG9mIGxpYl9mYWlsZWRfZW50cnlfdDogbGlicmFyaWVzIGZhaWxlZCB0byBsb2FkCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIGludCBpbml0KCk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwotc3RhdGljIGludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpOwotc3RhdGljIGludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3QoY25vZGUgKm5vZGUpOwotLy8gVG8gZ2V0IGFuZCBhZGQgdGhlIGVmZmVjdCBwb2ludGVkIGJ5IHRoZSBwYXNzZWQgbm9kZSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKLXN0YXRpYyBpbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KTsKLXN0YXRpYyBsaWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpwYXRoKTsKIHN0YXRpYyB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKTsKIHN0YXRpYyB1aW50MzJfdCB1cGRhdGVOdW1FZmZlY3RzKCk7Ci1zdGF0aWMgaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKLSAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKIC8vIFRvIHNlYXJjaCBhIHN1YmVmZmVjdCBpbiB0aGUgZ1N1YkVmZmVjdExpc3QKIHN0YXRpYyBpbnQgZmluZFN1YkVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCiAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7Ci1zdGF0aWMgdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpOwotc3RhdGljIGludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKTsKLXN0YXRpYyBpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIGZ1bmN0aW9ucwpAQCAtNDYxLDEwICs0NDIsMTIgQEAKICAgICBpZiAoaWdub3JlRnhDb25mRmlsZXMpIHsKICAgICAgICAgQUxPR0koIkF1ZGlvIGVmZmVjdHMgaW4gY29uZmlndXJhdGlvbiBmaWxlcyB3aWxsIGJlIGlnbm9yZWQiKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgICAgICBnQ29uZmlnTmJFbGVtU2tpcHBlZCA9IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcoTlVMTCk7CisgICAgICAgIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgICAgICBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ0NvbmZpZ05iRWxlbVNraXBwZWQgPiAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRWZmZWN0IGNvbmZpZyBpcyBwYXJ0aWFsbHkgaW52YWxpZCwgc2tpcHBlZCAlemQgZWxlbWVudHMiLCBnQ29uZmlnTmJFbGVtU2tpcHBlZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3NCwzNjcgKzQ1Nyw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotICAgIGxvYWRMaWJyYXJpZXMocm9vdCk7Ci0gICAgbG9hZEVmZmVjdHMocm9vdCk7Ci0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUklFU19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBsb2FkTGlicmFyeShub2RlLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jaWZkZWYgX19MUDY0X18KLS8vIGF1ZGlvX2VmZmVjdHMuY29uZiBhbHdheXMgc3BlY2lmaWVzIDMyIGJpdCBsaWIgcGF0aDogY29udmVydCB0byA2NCBiaXQgcGF0aCBpZiBuZWVkZWQKLXN0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQotICAgICAgICB7Ii9vZG0vbGliNjQvc291bmRmeCIsICIvdmVuZG9yL2xpYjY0L3NvdW5kZngiLCAiL3N5c3RlbS9saWI2NC9zb3VuZGZ4In07Ci0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWIvc291bmRmeCIsICIvdmVuZG9yL2xpYi9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliL3NvdW5kZngifTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50IGtMaWJyYXJ5UGF0aFJvb3RTaXplID0KLSAgICAgICAgKHNpemVvZihrTGlicmFyeVBhdGhSb290KSAvIHNpemVvZihrTGlicmFyeVBhdGhSb290WzBdKSk7Ci0KLS8vIENoZWNrcyBpZiB0aGUgbGlicmFyeSBwYXRoIHBhc3NlZCBhcyBsaWJfcGF0aF9pbiBjYW4gYmUgb3BlbmVkIGFuZCBpZiBub3QKLS8vIHRyaWVzIGluIHN0YW5kYXJkIGVmZmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzIHdpdGgganVzdCB0aGUgbGlicmFyeSBuYW1lIGFuZCByZXR1cm5zIGNvcnJlY3QgcGF0aAotLy8gaW4gbGliX3BhdGhfb3V0Ci1pbnQgY2hlY2tMaWJyYXJ5UGF0aChjb25zdCBjaGFyICpsaWJfcGF0aF9pbiwgY2hhciAqbGliX3BhdGhfb3V0KSB7Ci0gICAgY2hhciAqc3RyOwotICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lOwotICAgIHNpemVfdCBsZW47Ci0KLSAgICBpZiAobGliX3BhdGhfaW4gPT0gTlVMTCB8fCBsaWJfcGF0aF9vdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzdHJsY3B5KGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKTsKLQotICAgIC8vIFRyeSBleGFjdCBwYXRoIGZpcnN0Ci0gICAgc3RyID0gc3Ryc3RyKGxpYl9wYXRoX291dCwgIi9saWIvc291bmRmeC8iKTsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgLy8gRXh0cmFjdCBsaWJyYXJ5IG5hbWUgZnJvbSBpbnB1dCBwYXRoCi0gICAgbGVuID0gc3RyIC0gbGliX3BhdGhfb3V0OwotICAgIGxpYl9uYW1lID0gbGliX3BhdGhfaW4gKyBsZW4gKyBzdHJsZW4oIi9saWIvc291bmRmeC8iKTsKLQotICAgIC8vIFRoZW4gdHJ5IHdpdGggbGlicmFyeSBuYW1lIGFuZCBzdGFuZGFyZCBwYXRoIG5hbWVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtMaWJyYXJ5UGF0aFJvb3RTaXplOyBpKyspIHsKLSAgICAgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLQotICAgICAgICBzbnByaW50ZihwYXRoLAotICAgICAgICAgICAgICAgICBQQVRIX01BWCwKLSAgICAgICAgICAgICAgICAgIiVzLyVzIiwKLSAgICAgICAgICAgICAgICAga0xpYnJhcnlQYXRoUm9vdFtpXSwKLSAgICAgICAgICAgICAgICAgbGliX25hbWUpOwotICAgICAgICBpZiAoRl9PSyA9PSBhY2Nlc3MocGF0aCwgMCkpIHsKLSAgICAgICAgICAgIHN0cmNweShsaWJfcGF0aF9vdXQsIHBhdGgpOwotICAgICAgICAgICAgQUxPR1dfSUYoc3RybmNtcChsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCkgIT0gMCwKLSAgICAgICAgICAgICAgICAiY2hlY2tMaWJyYXJ5UGF0aCgpIGNvcnJlY3RlZCBsaWJyYXJ5IHBhdGggJXMgdG8gJXMiLCBsaWJfcGF0aF9pbiwgbGliX3BhdGhfb3V0KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi0KLQotaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIGNub2RlICpub2RlOwotICAgIHZvaWQgKmhkbCA9IE5VTEw7Ci0gICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBVEhfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChjaGVja0xpYnJhcnlQYXRoKChjb25zdCBjaGFyICopbm9kZS0+dmFsdWUsIHBhdGgpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgbGlicmFyeSAlcyIsIHBhdGgpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGhkbCA9IGRsb3BlbihwYXRoLCBSVExEX05PVyk7Ci0gICAgaWYgKGhkbCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGZhaWxlZCB0byBvcGVuICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZGVzYyA9IChhdWRpb19lZmZlY3RfbGlicmFyeV90ICopZGxzeW0oaGRsLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgIGlmIChkZXNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgc3ltYm9sICVzIiwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHICE9IGRlc2MtPnRhZykgewotICAgICAgICBBTE9HVygiZ2V0TGlicmFyeSgpIGJhZCB0YWcgJTA4eCBpbiBsaWIgaW5mbyBzdHJ1Y3QiLCBkZXNjLT50YWcpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzYy0+dmVyc2lvbikgIT0KLSAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTikpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgYmFkIGxpYiB2ZXJzaW9uICUwOHgiLCBkZXNjLT52ZXJzaW9uKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgZW50cnkgZm9yIGxpYnJhcnkgaW4gZ0xpYnJhcnlMaXN0Ci0gICAgbCA9IG1hbGxvYyhzaXplb2YobGliX2VudHJ5X3QpKTsKLSAgICBsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7Ci0gICAgbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOwotICAgIGwtPmhhbmRsZSA9IGhkbDsKLSAgICBsLT5kZXNjID0gZGVzYzsKLSAgICBsLT5lZmZlY3RzID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOwotCi0gICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5vYmplY3QgPSBsOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOwotICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7Ci0gICAgZ0xpYnJhcnlMaXN0ID0gZTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBwYXRoKTsKLQotICAgIHJldHVybiAwOwotCi1lcnJvcjoKLSAgICBpZiAoaGRsICE9IE5VTEwpIHsKLSAgICAgICAgZGxjbG9zZShoZGwpOwotICAgIH0KLSAgICAvL2FkZCBlbnRyeSBmb3IgbGlicmFyeSBlcnJvcnMgaW4gZ0xpYnJhcnlGYWlsZWRMaXN0Ci0gICAgbGliX2ZhaWxlZF9lbnRyeV90ICpmbCA9IG1hbGxvYyhzaXplb2YobGliX2ZhaWxlZF9lbnRyeV90KSk7Ci0gICAgZmwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBmbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOwotCi0gICAgbGlzdF9lbGVtX3QgKmZlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGZlLT5vYmplY3QgPSBmbDsKLSAgICBmZS0+bmV4dCA9IGdMaWJyYXJ5RmFpbGVkTGlzdDsKLSAgICBnTGlicmFyeUZhaWxlZExpc3QgPSBmZTsKLSAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBlcnJvciBpbiBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgZmwsIHBhdGgpOwotCi0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8vIFRoaXMgd2lsbCBmaW5kIHRoZSBsaWJyYXJ5IGFuZCBVVUlEIHRhZ3Mgb2YgdGhlIHN1YiBlZmZlY3QgcG9pbnRlZCBieSB0aGUKLS8vIG5vZGUsIGdldHMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIGFuZCBsaWJfZW50cnlfdCBhbmQgYWRkcyB0aGUgc3ViZWZmZWN0IC0KLS8vIHN1Yl9lbnRyeV90IHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HVigiYWRkU3ViRWZmZWN0Iik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGliX2VudHJ5X3QgKmw7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7Ci0gICAgaWYgKGwgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgewotICAgICAgICBBTE9HVygiYWRkU3ViRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgewotICAgICAgICBjaGFyIHNbNDBdOwotICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKLSAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotI2lmIChMT0dfTkRFQlVHPT0wKQotICAgIGNoYXIgc1s1MTJdOwotICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwotI2VuZGlmCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1Yl9lZmZlY3QgPSBtYWxsb2Moc2l6ZW9mKHN1Yl9lZmZlY3RfZW50cnlfdCkpOwotICAgIHN1Yl9lZmZlY3QtPm9iamVjdCA9IGQ7Ci0gICAgLy8gbGliX2VudHJ5X3QgaXMgc3RvcmVkIHNpbmNlIHRoZSBzdWIgZWZmZWN0cyBhcmUgbm90IGxpbmtlZCB0byB0aGUgbGlicmFyeQotICAgIHN1Yl9lZmZlY3QtPmxpYiA9IGw7Ci0gICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKLSAgICBlLT5vYmplY3QgPSBzdWJfZWZmZWN0OwotICAgIGUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW07Ci0gICAgZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtID0gZTsKLSAgICBBTE9HVigiYWRkU3ViRWZmZWN0IGVuZCIpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBsb2FkRWZmZWN0KG5vZGUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0KGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlOwotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOwotICAgIGxpc3RfZWxlbV90ICplOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUllfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbGliX2VudHJ5X3QgKnRtcDsKLSAgICBib29sIHNraXAgPSBmYWxzZTsKLSAgICBpZiAoZmluZEVmZmVjdChOVUxMLCAmdXVpZCwgJnRtcCwgTlVMTCkgPT0gMCkgewotICAgICAgICBBTE9HVygic2tpcHBpbmcgZHVwbGljYXRlIHV1aWQgJXMgJXMiLCBub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID8gImFuZCBpdHMgc3ViLWVmZmVjdHMiIDogIiIpOwotICAgICAgICBza2lwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLGQsIHMpOwotI2VuZGlmCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkLT5hcGlWZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwOHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGQ7Ci0gICAgaWYgKHNraXApIHsKLSAgICAgICAgZS0+bmV4dCA9IGdTa2lwcGVkRWZmZWN0czsKLSAgICAgICAgZ1NraXBwZWRFZmZlY3RzID0gZTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZS0+bmV4dCA9IGwtPmVmZmVjdHM7Ci0gICAgICAgIGwtPmVmZmVjdHMgPSBlOwotICAgIH0KLQotICAgIC8vIEFmdGVyIHRoZSBVVUlEIG5vZGUgaW4gdGhlIGNvbmZpZ190cmVlLCBpZiBub2RlLT5uZXh0IGlzIHZhbGlkLAotICAgIC8vIHRoYXQgd291bGQgYmUgc3ViIGVmZmVjdCBub2RlLgotICAgIC8vIEZpbmQgdGhlIHN1YiBlZmZlY3RzIGFuZCBhZGQgdGhlbSB0byB0aGUgZ1N1YkVmZmVjdExpc3QKLSAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICBpbnQgY291bnQgPSAyOwotICAgIGJvb2wgaHdTdWJlZnggPSBmYWxzZSwgc3dTdWJlZnggPSBmYWxzZTsKLSAgICBsaXN0X3N1Yl9lbGVtX3QgKnN1YmUgPSBOVUxMOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkFkZGluZyB0aGUgZWZmZWN0IHRvIGdFZmZlY3RTdWJMaXN0IGFzIHRoZXJlIGFyZSBzdWIgZWZmZWN0cyIpOwotICAgICAgICBzdWJlID0gbWFsbG9jKHNpemVvZihsaXN0X3N1Yl9lbGVtX3QpKTsKLSAgICAgICAgc3ViZS0+b2JqZWN0ID0gZDsKLSAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICBzdWJlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3Q7Ci0gICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZTsKLSAgICB9Ci0gICAgd2hpbGUgKG5vZGUgIT0gTlVMTCAmJiBjb3VudCkgewotICAgICAgIGlmIChhZGRTdWJFZmZlY3Qobm9kZSkpIHsKLSAgICAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgYWRkIHN1YkVmZmVjdCAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBnU3ViRWZmZWN0TGlzdCB0byBwb2ludCB0byBvbGRlciBsaXN0OwotICAgICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmUtPm5leHQ7Ci0gICAgICAgICAgIGZyZWUoc3ViZS0+c3ViX2VsZW0pOy8vIEZyZWUgYW4gYWxyZWFkeSBhZGRlZCBzdWIgZWZmZWN0Ci0gICAgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKLSAgICAgICAgICAgZnJlZShzdWJlKTsKLSAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgICAgfQotICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViRW50cnkgPSAoc3ViX2VmZmVjdF9lbnRyeV90KilnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0tPm9iamVjdDsKLSAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpzdWJFZmZlY3REZXNjID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QqKShzdWJFbnRyeS0+b2JqZWN0KTsKLSAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCi0gICAgICAgLy8gZ2V0X2Rlc2NyaXB0b3IgY2FsbCx3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvZGluZwotICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQgd2l0aCBQcm94eSBVVUlECi0gICAgICAgLy8gY2hlY2sgZm9yIFN3IGRlc2MKLSAgICAgICAgaWYgKCEoKHN1YkVmZmVjdERlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0spID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTCkpIHsKLSAgICAgICAgICAgICBzd1N1YmVmeCA9IHRydWU7Ci0gICAgICAgICAgICAgKmQgPSAqc3ViRWZmZWN0RGVzYzsKLSAgICAgICAgICAgICBkLT51dWlkID0gdXVpZDsKLSAgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdCgpIENoYW5nZWQgdGhlIFByb3h5IGRlc2MiKTsKLSAgICAgICB9IGVsc2UKLSAgICAgICAgICAgaHdTdWJlZnggPSB0cnVlOwotICAgICAgIGNvdW50LS07Ci0gICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIC8vIDEgSFcgYW5kIDEgU1cgc3ViIGVmZmVjdCBmb3VuZC4gU2V0IHRoZSBvZmZsb2FkIGZsYWcgaW4gdGhlIFByb3h5IGRlc2MKLSAgICBpZiAoaHdTdWJlZnggJiYgc3dTdWJlZngpIHsKLSAgICAgICAgZC0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAvLyBTZWFyY2hlcyB0aGUgc3ViIGVmZmVjdCBtYXRjaGluZyB0byB0aGUgc3BlY2lmaWVkIHV1aWQKIC8vIGluIHRoZSBnU3ViRWZmZWN0TGlzdC4gSXQgZ2V0cyB0aGUgbGliX2VudHJ5X3QgZm9yCiAvLyB0aGUgbWF0Y2hlZCBzdWJfZWZmZWN0IC4gVXNlZCBpbiBFZmZlY3RDcmVhdGUgb2Ygc3ViIGVmZmVjdHMKQEAgLTg4MSwyOSArNTAzLDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1saWJfZW50cnlfdCAqZ2V0TGlicmFyeShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGxpc3RfZWxlbV90ICplOwotCi0gICAgaWYgKGdDYWNoZWRMaWJyYXJ5ICYmCi0gICAgICAgICAgICAhc3RybmNtcChnQ2FjaGVkTGlicmFyeS0+bmFtZSwgbmFtZSwgUEFUSF9NQVgpKSB7Ci0gICAgICAgIHJldHVybiBnQ2FjaGVkTGlicmFyeTsKLSAgICB9Ci0KLSAgICBlID0gZ0xpYnJhcnlMaXN0OwotICAgIHdoaWxlIChlKSB7Ci0gICAgICAgIGxpYl9lbnRyeV90ICpsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBpZiAoIXN0cmNtcChsLT5uYW1lLCBuYW1lKSkgewotICAgICAgICAgICAgZ0NhY2hlZExpYnJhcnkgPSBsOwotICAgICAgICAgICAgcmV0dXJuIGw7Ci0gICAgICAgIH0KLSAgICAgICAgZSA9IGUtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogdm9pZCByZXNldEVmZmVjdEVudW1lcmF0aW9uKCkKIHsKICAgICBnQ3VyTGliID0gZ0xpYnJhcnlMaXN0OwpAQCAtOTM1LDExNCArNTM0LDYgQEAKICAgICByZXR1cm4gY250OwogfQogCi1pbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICB3aGlsZSAoZSAmJiAhZm91bmQpIHsKLSAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKLSAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7Ci0gICAgICAgIHdoaWxlIChlZngpIHsKLSAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1dWlkICE9IE5VTEwgJiYgbWVtY21wKCZkLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZSA9IGUtPm5leHQ7Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldCA9IC1FTk9FTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPm5hbWUpOwotICAgICAgICAqbGliID0gbDsKLSAgICAgICAgaWYgKGRlc2MpIHsKLSAgICAgICAgICAgICpkZXNjID0gZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KSB7Ci0gICAgY2hhciBzWzI1Nl07Ci0gICAgY2hhciBzc1syNTZdOwotICAgIGNoYXIgaWR0W2luZGVudCArIDFdOwotCi0gICAgbWVtc2V0KGlkdCwgJyAnLCBpbmRlbnQpOwotICAgIGlkdFtpbmRlbnRdID0gMDsKLQotICAgIHN0clswXSA9IDA7Ci0KLSAgICBzbnByaW50ZihzLCBzaXplb2YocyksICIlcyVzIC8gJXNcbiIsIGlkdCwgZGVzYy0+bmFtZSwgZGVzYy0+aW1wbGVtZW50b3IpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT51dWlkLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFVVSUQ6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dHlwZSwgcywgc2l6ZW9mKHMpKTsKLSAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBUWVBFOiAlc1xuIiwgaWR0LCBzKTsKLSAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7Ci0KLSAgICBzcHJpbnRmKHMsICIlcyAgYXBpVmVyc2lvbjogJTA4WFxuJXMgIGZsYWdzOiAlMDhYXG4iLCBpZHQsCi0gICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBpZHQsIGRlc2MtPmZsYWdzKTsKLSAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKLX0KLQotaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCi17Ci0gICAgaW50IHRtcFsxMF07Ci0KLSAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07Ci0gICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07Ci0gICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07Ci0gICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOwotICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07Ci0gICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKLSAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOwotICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107Ci0gICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKLSAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQotewotCi0gICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICB1dWlkLT50aW1lTG93LAotICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQogaW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCkgewogICAgIGNoYXIgc1s1MTJdOwogCkBAIC0xMDkyLDYgKzU4MywyMCBAQAogICAgICAgICAgICAgZSA9IGUtPm5leHQ7CiAgICAgICAgIH0KICAgICB9CisgICAgc3dpdGNoIChnQ29uZmlnTmJFbGVtU2tpcHBlZCkgeworICAgIGNhc2UgLTI6CisgICAgICAgIGRwcmludGYoZmQsICJFZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkaW5nIHNraXBwZWQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAtMToKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBmYWlsZWQgdG8gbG9hZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIHBhcnRpYWxseSBsb2FkZWQsIHNraXBwZWQgJXpkIGVsZW1lbnRzLlxuIiwKKyAgICAgICAgICAgICAgICBnQ29uZmlnTmJFbGVtU2tpcHBlZCk7CisgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKaW5kZXggNzJlMDkzMS4uMjlkYmM5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAjaWYgX19jcGx1c3BsdXMKQEAgLTk2LDYgKzk2LDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIHN1YiBlZmZlY3QgZGVzY3JpcHRvcnMuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0R2V0U3ViRWZmZWN0cyhjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqKnBTdWJlLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2NDAwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5U3RhdGUiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK2xpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7CitsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKK3B0aHJlYWRfbXV0ZXhfdCBnTGliTG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK2xpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKKworCitpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpCit7CisgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CisgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOworICAgIGludCBmb3VuZCA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAoZSAmJiAhZm91bmQpIHsKKyAgICAgICAgbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7CisgICAgICAgIHdoaWxlIChlZngpIHsKKyAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OworICAgICAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1dWlkICE9IE5VTEwgJiYgbWVtY21wKCZkLT51dWlkLCB1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7CisgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPm5hbWUpOworICAgICAgICAqbGliID0gbDsKKyAgICAgICAgaWYgKGRlc2MpIHsKKyAgICAgICAgICAgICpkZXNjID0gZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdXVpZC0+dGltZUxvdywKKyAgICAgICAgICAgIHV1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgdXVpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICB1dWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKKyAgICBjaGFyIHNbMjU2XTsKKyAgICBjaGFyIHNzWzI1Nl07CisgICAgY2hhciBpZHRbaW5kZW50ICsgMV07CisKKyAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7CisgICAgaWR0W2luZGVudF0gPSAwOworCisgICAgc3RyWzBdID0gMDsKKworICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOworICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOworICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKKworICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKKyAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOworICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmOTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeVN0YXRlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllTVEFURV9IXworCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQGZpbGUgQ29udGFpbnMgdGhlIHN0YXRlIHNoYXJlZCB3aXRoIGNvbmZpZ3VyYXRpb24gbG9hZGVyIG9mIHRoZSBFZmZlY3QgZmFjdG9yeS4KKyAqICAgICAgICBUaGlzIGdsb2JhbCBzdGF0ZSBzaG91bGQgcHJvYmFibHkgYmUgcmVmYWN0b3IgaW4gYSBzdHJ1Y3R1cmUKKyAqICAgICAgICBwcm92aWRlZCBieSB0aGUgY29uZmlnIGxvYWRlciBvbiBFZmZlY3RzRmFjdG9yeSBpbml0LgorICogICAgICAgIFRoaXMgaGVhZGVyIGFsc28gY29udGFpbnMgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgb24gdGhlIHN0YXRlLgorICovCisKK2V4dGVybiBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKKy8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQgb3IgaW52YWxpZCB2ZXJzaW9uCitleHRlcm4gbGlzdF9lbGVtX3QgKmdTa2lwcGVkRWZmZWN0czsKKy8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAorLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCitleHRlcm4gbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKK2V4dGVybiBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2s7IC8vIGNvbnRyb2xzIGFjY2VzcyB0byBnTGlicmFyeUxpc3QKKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKKworCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7CisKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKTsKKy8qKiBVc2VkIHRvIGxvZyBVVUlEcyAqLworaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOworCisvKiogVXNlZCBmb3IgZGVidWdpbmcuICovCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7CisKKyNpZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllTVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGI3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5Q29uZmlnTG9hZGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIGVmZmVjdHNDb25maWc7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKKy8qKiBTaW1pbGFybHkgdG8gZGxvcGVuLCBsb29rcyBmb3IgdGhlIHByb3ZpZGVkIHBhdGggaW4gTERfRUZGRUNUX0xJQlJBUllfUEFUSC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBmb3VuZCBhbmQgc2V0IHJlc29sdmVkUGF0aCB0byBpdHMgYWJzb2x1dGUgcGF0aC4KKyAqICAgICAgICAgZmFsc2UgaWYgbm90IGZvdW5kCisgKi8KK2Jvb2wgcmVzb2x2ZUxpYnJhcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiByZXNvbHZlZFBhdGgpIHsKKyAgICBmb3IgKGF1dG8qIGxpYnJhcnlEaXJlY3RvcnkgOiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhbmRpZGF0ZVBhdGggPSBzdGQ6OnN0cmluZyhsaWJyYXJ5RGlyZWN0b3J5KSArICcvJyArIHBhdGg7CisgICAgICAgIGlmIChhY2Nlc3MoY2FuZGlkYXRlUGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICAqcmVzb2x2ZWRQYXRoID0gc3RkOjptb3ZlKGNhbmRpZGF0ZVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogTG9hZHMgYSBsaWJyYXJ5IGdpdmVuIGl0cyByZWxhdGl2ZSBwYXRoIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBsaWJFbnRyeS4KKyAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzIHdpdGggbGliRW50cnkncyBwYXRoLCBoYW5kbGUgYW5kIGRlc2MgZmlsbGVkCisgKiAgICAgICAgIGZhbHNlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGggZmlsbGVkIHdpdGggdGhlIHBhdGggb2YgdGhlIGZhaWxlZCBsaWIKKyAqIFRoZSBjYWxsZXIgTVVTVCBmcmVlIHRoZSByZXNvdXJjZXMgcGF0aCAoZnJlZSkgYW5kIGhhbmRsZSAoZGxjbG9zZSkgaWYgZmlsbGVkLgorICovCitib29sIGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIqIHJlbGF0aXZlUGF0aCwgbGliX2VudHJ5X3QqIGxpYkVudHJ5KSBub2V4Y2VwdCB7CisKKyAgICBzdGQ6OnN0cmluZyBhYnNvbHV0ZVBhdGg7CisgICAgaWYgKCFyZXNvbHZlTGlicmFyeShyZWxhdGl2ZVBhdGgsICZhYnNvbHV0ZVBhdGgpKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBsaWJyYXJ5IGluIGVmZmVjdCBkaXJlY3RvcmllczogJXMiLCByZWxhdGl2ZVBhdGgpOworICAgICAgICBsaWJFbnRyeS0+cGF0aCA9IHN0cmR1cChyZWxhdGl2ZVBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHBhdGggPSBhYnNvbHV0ZVBhdGguY19zdHIoKTsKKyAgICBsaWJFbnRyeS0+cGF0aCA9IHN0cmR1cChwYXRoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGliIGlzIGNsb3NlZCBvbiBlYXJseSByZXR1cm4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoZGxjbG9zZSkqPiBsaWJIYW5kbGUoZGxvcGVuKHBhdGgsIFJUTERfTk9XKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBkbG9wZW4gbGlicmFyeSAlczogJXMiLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byogZGVzY3JpcHRpb24gPSBzdGF0aWNfY2FzdDxhdWRpb19lZmZlY3RfbGlicmFyeV90Kj4oCisgICAgICAgICAgZGxzeW0obGliSGFuZGxlLmdldCgpLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpKTsKKyAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBlZmZlY3QgbGlicmFyeSwgZmFpbGVkIG5vdCBmaW5kIHN5bWJvbCAnJXMnIGluICVzOiAlcyIsCisgICAgICAgICAgICAgIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUiwgcGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChkZXNjcmlwdGlvbi0+dGFnICE9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRykgeworICAgICAgICBBTE9HRSgiQmFkIHRhZyAlIzA4eCBpbiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUsIGV4cGVjdGVkICUjMDh4IGZvciBsaWJyYXJ5ICVzIiwKKyAgICAgICAgICAgICAgZGVzY3JpcHRpb24tPnRhZywgQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjcmlwdGlvbi0+dmVyc2lvbik7CisgICAgdWludDMyX3QgZXhwZWN0ZWRNYWpvclZlcnNpb24gPSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pOworICAgIGlmIChtYWpvclZlcnNpb24gIT0gZXhwZWN0ZWRNYWpvclZlcnNpb24pIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1ham9yIHZlcnNpb24gJSMwOHgsIGV4cGVjdGVkICUjMDh4IGZvciBsaWJyYXJ5ICVzIiwKKyAgICAgICAgICAgICAgbWFqb3JWZXJzaW9uLCBleHBlY3RlZE1ham9yVmVyc2lvbiwgcGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsaWJFbnRyeS0+aGFuZGxlID0gbGliSGFuZGxlLnJlbGVhc2UoKTsKKyAgICBsaWJFbnRyeS0+ZGVzYyA9IGRlc2NyaXB0aW9uOworICAgIHJldHVybiB0cnVlOworfQorCisvKiogQmVjYXVzZSB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGRlc3Ryb3llZCBieSBjIGNvZGUsIHVzaW5nIG5ldyB0byBhbGxvY2F0ZSBzaGFyZWQgc3RydWN0dXJlCisgKiBpcyBub3QgcG9zc2libGUuIFByb3ZpZGUgYSBlcXVpdmFsZW50IG9mIHVuaXF1ZV9wdHIgZm9yIG1hbGxvYy9mcmVlZCBzdHJ1Y3R1cmUgdG8gbWFrZSBzdXJlCisgKiB0aGV5IGFyZSBub3QgbGVha2VkIGluIHRoZSBjKysgY29kZS4KKyBAeyAqLworc3RydWN0IEZyZWVEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkodm9pZCogcCkgeworICAgICAgICBmcmVlKHApOworICAgIH0KK307CisvKiogdW5pcXVlX3B0ciBmb3Igb2JqZWN0IGNyZWF0ZWQgd2l0aCBtYWxsb2MuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIFVuaXF1ZUNQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRnJlZURlbGV0ZXI+OworCisvKiogYyB2ZXJzaW9uIG9mIHN0ZDo6bWFrZV91bmlxdWUuIFVzZXMgbWFsbG9jIGFuZCBmcmVlLiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitVbmlxdWVDUHRyPFQ+IG1ha2VVbmlxdWVDKCkgeworICAgIFQqIHB0ciA9IG5ldyAobWFsbG9jKHNpemVvZihUKSkpIFR7fTsgLy8gVXNlIHBsYWNlbWVudCBuZXcgdG8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlCisgICAgcmV0dXJuIFVuaXF1ZUNQdHI8VD57cHRyfTsKK30KKworLyoqIEB9ICovCisKKy8qKiBQdXNoIGFuIG5vdCBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFQqIG9iamVjdCwgTGlzdEVsZW0qKiBsaXN0LCBwdGhyZWFkX211dGV4X3QqIG11dGV4ID0gbnVsbHB0cikgbm9leGNlcHQgeworICAgIGF1dG8gbGlzdEVsZW0gPSBtYWtlVW5pcXVlQzxMaXN0RWxlbT4oKTsKKyAgICBsaXN0RWxlbS0+b2JqZWN0ID0gb2JqZWN0OworICAgIGlmIChtdXRleCAhPSBudWxscHRyKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisgICAgfQorICAgIGxpc3RFbGVtLT5uZXh0ID0gKmxpc3Q7CisgICAgKmxpc3QgPSBsaXN0RWxlbS5yZWxlYXNlKCk7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOworICAgIH0KK30KKworLyoqIFB1c2ggYW4gb3duZWQgZWxlbWVudCBpbiBhIGxpc3RfZWxlbSBsaW5rIGxpc3Qgd2l0aCBhbiBvcHRpb25hbCBsb2NrLiAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIExpc3RFbGVtPgordm9pZCBsaXN0UHVzaChVbmlxdWVDUHRyPFQ+JiYgb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgbGlzdFB1c2gob2JqZWN0LnJlbGVhc2UoKSwgbGlzdCwgbXV0ZXgpOworfQorCitzaXplX3QgbG9hZExpYnJhcmllcyhjb25zdCBlZmZlY3RzQ29uZmlnOjpMaWJyYXJpZXMmIGxpYnMsCisgICAgICAgICAgICAgICAgICAgICBsaXN0X2VsZW1fdCoqIGxpYkxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbGliTGlzdExvY2ssCisgICAgICAgICAgICAgICAgICAgICBsaXN0X2VsZW1fdCoqIGxpYkZhaWxlZExpc3QpCit7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQgPSAwOworICAgIGZvciAoYXV0byYgbGlicmFyeSA6IGxpYnMpIHsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgYSBsaWIgZW50cnkKKyAgICAgICAgYXV0byBsaWJFbnRyeSA9IG1ha2VVbmlxdWVDPGxpYl9lbnRyeV90PigpOworICAgICAgICBsaWJFbnRyeS0+bmFtZSA9IHN0cmR1cChsaWJyYXJ5Lm5hbWUuY19zdHIoKSk7CisgICAgICAgIGxpYkVudHJ5LT5lZmZlY3RzID0gbnVsbHB0cjsKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZsaWJFbnRyeS0+bG9jaywgbnVsbHB0cik7CisKKyAgICAgICAgaWYgKCFsb2FkTGlicmFyeShsaWJyYXJ5LnBhdGguY19zdHIoKSwgbGliRW50cnkuZ2V0KCkpKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBsaWJyYXJ5IGxvYWQgZmFpbHVyZQorICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGxpYkVudHJ5KSwgbGliRmFpbGVkTGlzdCk7CisgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJMaXN0LCBsaWJMaXN0TG9jayk7CisgICAgfQorICAgIHJldHVybiBuYlNraXBwZWRFbGVtZW50OworfQorCisvKiogRmluZCBhIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbGlzdC4gKi8KK2xpYl9lbnRyeV90KiBmaW5kTGlicmFyeShjb25zdCBjaGFyKiBuYW1lLCBsaXN0X2VsZW1fdCogbGlzdCkgeworCisgICAgd2hpbGUgKGxpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvKiBvYmplY3QgPSBzdGF0aWNfY2FzdDxsaWJfZW50cnlfdCo+KGxpc3QtPm9iamVjdCk7CisgICAgICAgIGlmIChzdHJjbXAob2JqZWN0LT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RydWN0IFV1aWRTdHIgeworICAgIC8qKiBMZW5ndGggb2YgYW4gdXVpZCByZXByZXNlbnRlZCBhcyBzdHJpbmcuIEBUT0RPOiB1c2UgYSBjb25zdGFudCBpbnN0ZWFkIG9mIDQwLiAqLworICAgIGNoYXIgYnVmZls0MF07Cit9OworCisvKiogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByb3ZpZGVkIHV1aWQuCisgKiBCeSBub3QgcHJvdmlkaW5nIGFuIG91dHB1dCBidWZmZXIsIGl0IGlzIGltcGxpY2l0bHkgY3JlYXRlZCBpbiB0aGUgY2FsbGVyIGNvbnRleHQuCisgKiBJbiBzdWNoIGNhc2UgdGhlIHJldHVybiBwb2ludGVyIGhhcyB0aGUgc2FtZSBsaWZldGltZSBhcyB0aGUgZXhwcmVzc2lvbiBjb250YWluaW5nIHV1aWRUb1N0cmluZygpCisgKi8KK2NoYXIqIHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkLCBVdWlkU3RyJiYgc3RyID0ge30pIHsKKyAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHN0ci5idWZmLCBzaXplb2Yoc3RyLmJ1ZmYpKTsKKyAgICByZXR1cm4gc3RyLmJ1ZmY7Cit9CisKK3N0cnVjdCBMb2FkRWZmZWN0UmVzdWx0IHsKKyAgICAvKiogdHJ1ZSBpZiB0aGUgZWZmZWN0IGlzIHVzYWJsZSAoYWthLCBleGlzdGluZyBsaWIsIGRlc2MsIHJpZ2h0IHZlcnNpb24sIHVuaXF1ZSB1dWlkKSAqLworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIC8qKiBTZXQgaWYgdGhlIGVmZmVjdCBsaWIgd2FzIGZvdW5kKi8KKyAgICBsaWJfZW50cnlfdCogbGliID0gbnVsbHB0cjsKKyAgICAvLyogU2V0IGlmIHRoZSBkZXNjcmlwdGlvbiB3YXMgc3VjY2Vzc2Z1bHkgcmV0cmlldmVkIGZyb20gdGhlIGxpYiAqLworICAgIFVuaXF1ZUNQdHI8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0RGVzYzsKK307CisKK0xvYWRFZmZlY3RSZXN1bHQgbG9hZEVmZmVjdChjb25zdCBFZmZlY3RJbXBsJiBlZmZlY3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiBsaWJMaXN0KSB7CisgICAgTG9hZEVmZmVjdFJlc3VsdCByZXN1bHQ7CisKKyAgICAvLyBGaW5kIHRoZSBlZmZlY3QgbGlicmFyeQorICAgIHJlc3VsdC5saWIgPSBmaW5kTGlicmFyeShlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBsaWJMaXN0KTsKKyAgICBpZiAocmVzdWx0LmxpYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIHRvIGxvYWQgZWZmZWN0ICVzIiwKKyAgICAgICAgICAgICAgZWZmZWN0LmxpYnJhcnktPm5hbWUuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuZWZmZWN0RGVzYyA9IG1ha2VVbmlxdWVDPGVmZmVjdF9kZXNjcmlwdG9yX3Q+KCk7CisKKyAgICAvLyBHZXQgdGhlIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgaWYgKHJlc3VsdC5saWItPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZlZmZlY3QudXVpZCwgcmVzdWx0LmVmZmVjdERlc2MuZ2V0KCkpICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLAorICAgICAgICAgICAgICB1dWlkVG9TdHJpbmcoZWZmZWN0LnV1aWQpLCByZXN1bHQubGliLT5uYW1lKTsKKyAgICAgICAgcmVzdWx0LmVmZmVjdERlc2MucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBEdW1wIGVmZmVjdCBmb3IgZGVidWcKKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihyZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7CisgICAgQUxPR1YoImxvYWRFZmZlY3QoKSByZWFkIGRlc2NyaXB0b3IgJXA6JXMiLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgcyk7CisjZW5kaWYKKworICAgIC8vIENoZWNrIGVmZmVjdCBpcyBzdXBwb3J0ZWQKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTik7CisgICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihyZXN1bHQuZWZmZWN0RGVzYy0+YXBpVmVyc2lvbikgIT0gZXhwZWN0ZWRNYWpvclZlcnNpb24pIHsKKyAgICAgICAgQUxPR0UoIkJhZCBBUEkgdmVyc2lvbiAlIzA4eCBmb3IgZWZmZWN0ICVzIGluIGxpYiAlcywgZXhwZWN0ZWQgbWFqb3IgJSMwOHgiLAorICAgICAgICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy0+YXBpVmVyc2lvbiwgbmFtZS5jX3N0cigpLCByZXN1bHQubGliLT5uYW1lLCBleHBlY3RlZE1ham9yVmVyc2lvbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgbGliX2VudHJ5X3QgKl87CisgICAgaWYgKGZpbmRFZmZlY3QobnVsbHB0ciwgJmVmZmVjdC51dWlkLCAmXywgbnVsbHB0cikgPT0gMCkgeworICAgICAgICBBTE9HRSgiRWZmZWN0ICVzIHV1aWQgJXMgYWxyZWFkeSBleGlzdCIsIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmVzdWx0LnN1Y2Nlc3MgPSB0cnVlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBsb2FkRWZmZWN0cyhjb25zdCBFZmZlY3RzJiBlZmZlY3RzLCBsaXN0X2VsZW1fdCogbGliTGlzdCwgbGlzdF9lbGVtX3QqKiBza2lwcGVkRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICBsaXN0X3N1Yl9lbGVtX3QqKiBzdWJFZmZlY3RMaXN0KSB7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQgPSAwOworCisgICAgZm9yIChhdXRvJiBlZmZlY3QgOiBlZmZlY3RzKSB7CisKKyAgICAgICAgYXV0byBlZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QsIGVmZmVjdC5uYW1lLCBsaWJMaXN0KTsKKyAgICAgICAgaWYgKCFlZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIGlmIChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MpLCBza2lwcGVkRWZmZWN0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlZmZlY3QuaXNQcm94eSkgeworICAgICAgICAgICAgYXV0byBzd0VmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdC5saWJTdywgZWZmZWN0Lm5hbWUgKyAiIGxpYnN3IiwgbGliTGlzdCk7CisgICAgICAgICAgICBhdXRvIGh3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYkh3LCBlZmZlY3QubmFtZSArICIgbGliaHciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGlmICghc3dFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MgfHwgIWh3RWZmZWN0TG9hZFJlc3VsdC5zdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWFpbiBlZmZlY3QgaW4gdGhlIHNraXBwZWQgbGlzdCBldmVuIGlmIG9ubHkgYSBzdWJlZmZlY3QgaXMgaW52YWxpZAorICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBtYWluIGVmZmVjdCBpcyBub3QgdXNhYmxlIHdpdGhvdXQgaXRzIHN1YmVmZmVjdHMuCisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgICAgICArK25iU2tpcHBlZEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0UHVzaChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHN1YkVmZmVjdExpc3QpOworCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLCB3ZSByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIHN3IGVmZmVjdCBkZXNjcmlwdG9yLCBidXQga2VlcCB0aGUgUHJveHkgVVVJRAorICAgICAgICAgICAgKmVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyA9ICpzd0VmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYzsKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+dXVpZCA9IGVmZmVjdC51dWlkOworCisgICAgICAgICAgICBlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworCisgICAgICAgICAgICBhdXRvIHJlZ2lzdGVyU3ViRWZmZWN0ID0gW3N1YkVmZmVjdExpc3RdKGF1dG8mJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gbWFrZVVuaXF1ZUM8c3ViX2VmZmVjdF9lbnRyeV90PigpOworICAgICAgICAgICAgICAgIGVudHJ5LT5vYmplY3QgPSByZXN1bHQuZWZmZWN0RGVzYy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgLy8gbGliX2VudHJ5X3QgaXMgc3RvcmVkIHNpbmNlIHRoZSBzdWIgZWZmZWN0cyBhcmUgbm90IGxpbmtlZCB0byB0aGUgbGlicmFyeQorICAgICAgICAgICAgICAgIGVudHJ5LT5saWIgPSByZXN1bHQubGliOworICAgICAgICAgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShlbnRyeSksICYoKnN1YkVmZmVjdExpc3QpLT5zdWJfZWxlbSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcmVnaXN0ZXJTdWJFZmZlY3Qoc3RkOjptb3ZlKHN3RWZmZWN0TG9hZFJlc3VsdCkpOworICAgICAgICAgICAgcmVnaXN0ZXJTdWJFZmZlY3Qoc3RkOjptb3ZlKGh3RWZmZWN0TG9hZFJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksICZlZmZlY3RMb2FkUmVzdWx0LmxpYi0+ZWZmZWN0cyk7CisgICAgfQorICAgIHJldHVybiBuYlNraXBwZWRFbGVtZW50OworfQorCit9IC8vIG5hbWVzcGFjZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIEludGVyZmFjZSBmdW5jdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitleHRlcm4gIkMiIHNzaXplX3QgRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhjb25zdCBjaGFyKiBwYXRoKQoreworICAgIHVzaW5nIGVmZmVjdHNDb25maWc6OnBhcnNlOworICAgIGF1dG8gcmVzdWx0ID0gcGF0aCA/IHBhcnNlKHBhdGgpIDogcGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICs9IGxvYWRMaWJyYXJpZXMocmVzdWx0LnBhcnNlZENvbmZpZy0+bGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdMaWJyYXJ5TGlzdCwgJmdMaWJMb2NrLCAmZ0xpYnJhcnlGYWlsZWRMaXN0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVmZmVjdHMocmVzdWx0LnBhcnNlZENvbmZpZy0+ZWZmZWN0cywgZ0xpYnJhcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnU2tpcHBlZEVmZmVjdHMsICZnU3ViRWZmZWN0TGlzdCk7CisKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAiJXp1IGVycm9ycyBkdXJpbmcgbG9hZGluZyBvZiBjb25maWd1cmF0aW9uOiAlcyIsCisgICAgICAgICAgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQsIHBhdGggPzogZWZmZWN0c0NvbmZpZzo6REVGQVVMVF9QQVRIKTsKKworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZTlhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFBhcnNlcyB0aGUgcGxhdGZvcm0gZWZmZWN0IHhtbCBjb25maWd1cmF0aW9uIGFuZCBzdG9yZXMgaXRzIGNvbnRlbnQgaW4gRWZmZWN0RmFjdG9yeVN0YXRlLgorICogQHBhcmFtW2luXSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb3IgTlVMTMKgdG8gbG9hZCB0aGUgZGVmYXVsdCBvbmUKKyAqIEByZXR1cm4gLTHCoG9uIHVucmVjb3ZlcmFibGUgZXJyb3IgKGVnOiBubyBjb25maWd1cmF0aW9uIGZpbGUpCisgKiAgICAgICAgIDAgb24gc3VjY2VzcworICogICAgICAgICB0aGUgbnVtYmVyIG9mIGludmFsaWQgZWxlbWVudHMgKGxpYiAmIGVmZmVjdCkgc2tpcHBlZCBpZiB0aGUgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkCisgKiBAbm90ZSB0aGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZvciB0ZXN0IHB1cnBvc2Ugb25seS4gRG8gbm90IGNhbGwgZnJvbSBvdXRzaWRlIHRoaXMgbGlicmFyeS4KKyAqLworQU5EUk9JRF9BUEkKK3NzaXplX3QgRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhjb25zdCBjaGFyKiBwYXRoKTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIEFORFJPSURfRUZGRUNUU1hNTENPTkZJR0xPQURFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAppbmRleCA2NGEzMjEyLi5hNWExMmViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWUFQSV9IXwogI2RlZmluZSBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCiAKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNTIsNiArNTMsNyBAQAogLy8gICAgICAgICpwTnVtRWZmZWN0czogICAgIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgZWZmZWN0cyBpbiBmYWN0b3J5CiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03OSw2ICs4MSw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTEwLDYgKzExMyw3IEBACiAvLyAgICAgICAgKnBIYW5kbGU6ICAgICAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgaGFuZGxlLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKIApAQCAtMTMwLDYgKzEzNCw3IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE1Myw2ICsxNTgsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTY5LDggKzE3NSwxMCBAQAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIHV1aWQgaXMgZXF1YWwgdG8gRUZGRUNUX1VVSURfTlVMTC4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RJc051bGxVdWlkKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkKTsKIAorQU5EUk9JRF9BUEkKIGludCBFZmZlY3REdW1wRWZmZWN0cyhpbnQgZmQpOwogCiAjaWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS90ZXN0L0R1bXBDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNTZiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS90ZXN0L0R1bXBDb25maWcuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY2hhciogcGF0aCA9IG51bGxwdHI7CisgICAgYm9vbCBsZWdhY3lGb3JtYXQ7CisKKyAgICBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLS1sZWdhY3kiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeUZvcm1hdCA9IHRydWU7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyBsZWdhY3kgZWZmZWN0IGNvbmZpZyBmaWxlXG4iKTsKKyAgICB9IGVsc2UgaWYgKChhcmdjID09IDIgfHwgYXJnYyA9PSAzKSAmJiBzdHJjbXAoYXJndlsxXSwgIi0teG1sIikgPT0gMCkgeworICAgICAgICBsZWdhY3lGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ2MgPT0gMykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIFhNTCBlZmZlY3QgY29uZmlnIGZpbGU6ICVzXG4iLCBwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVtcGluZyBkZWZhdWx0IFhNTCBlZmZlY3QgY29uZmlnIGZpbGUuXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBhcmd1bWVudHMuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNhZ2U6ICVzIFstLWxlZ2FjeXwtLXhtbCBbRklMRV1dXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCFsZWdhY3lGb3JtYXQpIHsKKyAgICAgICAgc3NpemVfdCByZXQgPSBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKHBhdGgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkWG1sRWZmZWN0Q29uZmlnIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJ0aWFsbHkgZmFpbGVkIHRvIGxvYWQgY29uZmlnLiBTa2lwcGVkICV6dSBlbGVtZW50cywgIgorICAgICAgICAgICAgICAgICAgICAic2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIiwgKHNpemVfdClyZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlZ2FjeUZvcm1hdCkgeworICAgICAgICBhdXRvIHJldCA9IEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibG9hZEVmZmVjdENvbmZpZyBmYWlsZWQsIHNlZSBsb2djYXQgZm9yIGRldGFpbC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJsZWdhY3kgbG9hZEVmZmVjdENvbmZpZyBoYXMgcHJvYmFibHkgc3VjY2VlZCwgc2VlIGxvZ2NhdCB0byBtYWtlIHN1cmUuXG4iKTsKKyAgICB9CisKKyAgICBpZiAoRWZmZWN0RHVtcEVmZmVjdHMoU1RET1VUX0ZJTEVOTykgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVmZmVjdCBkdW1wIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgIHJldHVybiA0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKaW5kZXggODNlODI4OC4uOTQxZWIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKQEAgLTcyLDE5ICs3MiwyNSBAQAogICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMgXAogICAgIENvbW1vbi9zcmMvQ29weV8xNi5jIFwKICAgICBDb21tb24vc3JjL01vbm9UbzJJXzE2LmMgXAorICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIFwKICAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgXAorICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyBcCiAgICAgQ29tbW9uL3NyYy9BYnNfMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgXAogICAgIENvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jIFwKICAgICBDb21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgXAogICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgXApAQCAtMTIwLDcgKzEyNiw3IEBACiAgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9zcmMgXAogICAgICQoTE9DQUxfUEFUSCkvU3RlcmVvV2lkZW5pbmcvbGliCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC0xNzksNiArMTg1LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9saWIgXAogICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL3NyYwogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCAyMjg5NzdkLi40YzJiOTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMTk4LDYgKzE5OCwxMCBAQAogI2RlZmluZSBMVkRCRV9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICA2NAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAxMDI0CisjZW5kaWYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTAsNiArMjE0LDEwIEBACiAgICAgTFZEQkVfRlNfMzIwMDAgPSA2LAogICAgIExWREJFX0ZTXzQ0MTAwID0gNywKICAgICBMVkRCRV9GU180ODAwMCA9IDgsCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgTFZEQkVfRlNfOTYwMDAgPSA5LAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwogCkBAIC00NTAsMTIgKzQ1OCwxNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IGIxZWJhZGYuLmYzMmVkMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgX19MVkRCRV9DT0VGRlNfSF9fCiAKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTE0LDUgKzUxNSw2MzIgQEAKICNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwogI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCiAKKyNlbHNlIC8qQlVJTERfRkxPQVQqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkRCRV9TQ0FMRVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTc2OThmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU4ODQ5ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MzkwMDFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwODA3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTMzODE4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1NzMyZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NjY5MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzMwMGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTMyN2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjAxMzhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDcxNzZmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk0OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5OTUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1MzQzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc3ODYzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODEwNWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NzEwMmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTY2MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk4NjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjIwODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODQ3NDZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0ODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2MTk0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg4OTMxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODk5MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NzA3OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4OTgzMWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODk4ODJmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MjA4MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NDkxNWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NDU4OGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NzQ1OGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTc0NjFmCiAjZW5kaWYKKworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjAzMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNjgxMGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45MjkzOTZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MjUyNzVmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDY4ODFmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ4MjU2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI5NDM1ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUxMTk2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1MjM1OWYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTI0NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MzM5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQwNTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTEwMTlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzM0MzZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNzg0ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUzMTI1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1NTk0ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTg4OWYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTA5M2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY5NWYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjQwMTlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODY3MThmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2ODA1ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY1MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg3Nzk3ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxMDc3ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkzODk4ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc0MDg2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2OTQ5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njk1NGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuODkzMzg3ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTEzNTE3ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzEwNWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNTk5OGYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzIyOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MzkxNDBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MjA4OTJmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDIzMjZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQzOTQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM0Nzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU2NzQwZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzY1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NjMxM2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2ODYwN2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjkwOTJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NDg3OTdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzExNTdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNTY4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1ODM2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc4MzY3ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU5OWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MTY0OWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDMwM2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MjVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjI5MDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODU1NzhmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk5ODRmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTI3ODlmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODE1ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzM1MzlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTYzOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NDAxZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuODgwODI1ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwNDEyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkwMDIzMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkwNDk3N2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MDY3NjZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTI3NTc5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTMwMTExZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkxMjM4N2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45MzM0NTlmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzU2MDNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTI4MzY1ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MTgzZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MDA4N2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MTMwM2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NDE2MThmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzNzc4ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NDIzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NDQ3N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjY3MjFmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjcyNjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUyNTg0ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2MjkyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTA0MGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NTM0N2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTkyODJmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgxODg4ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDUwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MDcyNGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODMzNTlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODM0OTdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2ODg5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTY4MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3Mjk5MmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTg0MGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MTk3ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTU0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTM5M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDY2OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg1NDg4ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDY0ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MTUwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjE1MGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODY3MzNmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODc1NTdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjIwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDE4OWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MDY1M2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDMzNTdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyOTY0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMjA5ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMDg1ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzA4NWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTM1NTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTM3NTlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE1ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTE5OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTMxNmYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDE2ODFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2NTM3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NTk5ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTQ1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTU0NWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY4MjNmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY4NzVmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDA3NjJmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk4NDYxZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NDc3ZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMzgxZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5OTIzNGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTIzOGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI2NDhmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc0NDEyZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkyMDlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTIwOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTk2NmYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg0NjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwODQ2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY4NWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgyODY5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYzNjRmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjM2NGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjQ1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTI0ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ2MjZmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDYyNmYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI4OGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjQxZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQyNTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDI1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTEwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkxMzk4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxOTJmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzE5MmYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzM3NGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNTQxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIzMThmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjMxOGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTIyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzA5ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIxMzFmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjEzMWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTYxNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1NjkwZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk3ODY4ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgIC0wLjAwMDUyOGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgLTEuOTk4OTM5ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg5NDVmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE4NTcyZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTg1NzJmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTg3NDVmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2MjQyN2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEzNTQ1ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzA2NDdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3MjU5NmYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDU4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzMxNDhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3NDc5NWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA5MzczZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODAxMDhmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4MTAzN2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2ODE5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODU3MTRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NjIwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjY4ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODY5MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NzMxOGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0NzA5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTAyNDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MDQ3M2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzNDIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NTVmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzA3OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTQ0ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTM1MzVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTU1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgLTEuOTk2ODYwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgIC0wLjAwMDc3OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgLTEuOTk4NDM3ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg0NDRmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMjI3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ5MDczZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzOTUzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNjYxOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjYzNzdmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTUyODlmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE1Mjg5ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Njg4MmYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA2N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTE1MTFmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1NDc3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NzExZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwODM3OWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODIzOTVmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODMwNDdmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDc3MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA3NzA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Mzg2M2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQxNGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDU3ODlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg3OTc3ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg4Mjg4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDIwN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTEzMjRmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTE0ODhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM4NjdmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzODY3ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MjAzOGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE3N2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAxOTEzZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk2MTM0ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTc0ZgorCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDA5NThmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAtMS45OTgwNzVmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTgwODVmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBdXRvbWF0aWMgR2FpbiBDb250cm9sIHRpbWUgY29uc3RhbnRzIGFuZCBnYWluIHNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFHQyBUaW1lIGNvbnN0YW50cyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44NDEzOTVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg4MjIyM2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMjUxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MTcyNzZmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTI2N2YKKyNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ0MDYxZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NTc3NDVmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTE1OGYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCisjZW5kaWYKKworI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBR0NfREVDQVlfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNDJmCisjZGVmaW5lIEFHQ19ERUNBWV9GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDI4ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjFmCisjZGVmaW5lIEFHQ19ERUNBWV9GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE0ZgorI2RlZmluZSBBR0NfREVDQVlfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwOGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTc1ZgorI2VuZGlmCisKKy8qIEFHQyBHYWluIHNldHRpbmdzICovCisjZGVmaW5lIEFHQ19HQUlOX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19UQVJHRVRMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4ODU1M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgorI2RlZmluZSBBR0NfR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4NDg5M2YKKyNkZWZpbmUgQUdDX0dBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIEFHQ19HQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ODkyNWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgorI2RlZmluZSBBR0NfR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIzODcyMWYKKyNkZWZpbmUgQUdDX0dBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfSFBGR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIEFHQ19HQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgorI2RlZmluZSBBR0NfR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2MjI3OGYKKyNkZWZpbmUgQUdDX0dBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfSFBGR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIEFHQ19HQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgorI2RlZmluZSBBR0NfR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ2NjgzNmYKKyNkZWZpbmUgQUdDX0dBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIEFHQ19HQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorI2RlZmluZSBBR0NfR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjMwOTU3M2YKKyNkZWZpbmUgQUdDX0dBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi4wNzk0NThmCisjZGVmaW5lIEFHQ19HQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDYuOTQzMjgyZgorI2RlZmluZSBBR0NfR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVm9sdW1lIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBWb2x1bWUgY29udHJvbCBnYWluICovCisjZGVmaW5lIFZPTFVNRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisjZGVmaW5lIFZPTFVNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisKKy8qIFZvbHVtZSBjb250cm9sIHRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFZPTF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDI0NjkwZgorI2RlZmluZSBWT0xfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNzk3N2YKKyNkZWZpbmUgVk9MX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1MjlmCisjZGVmaW5lIFZPTF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDIyZgorI2RlZmluZSBWT0xfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTAyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgyOTlmCisjZGVmaW5lIFZPTF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjMxZgorI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKKyNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgorI2RlZmluZSBWT0xfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTAzOWYKKyNlbmRpZgorI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCisjZGVmaW5lIE1JWF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMjMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjI1NDggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLworI2RlZmluZSBNSVhfVENfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ1Mzg3ICovCisjZGVmaW5lIE1JWF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTk4MDQgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE1NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLworI2RlZmluZSBNSVhfVENfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxOTczICovCisjZGVmaW5lIE1JWF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIxNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBNSVhfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNTMwICovCisjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KKyNlbmRpZgorCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwppbmRleCBiNjYzMmEzLi5mZDQwMTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTEwNywzNSArMTA3LDY4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CiAKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cwogICAgICAqLwotICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7Ci0KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzE5MjAwMCkpKTsKKyNlbHNlCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOyAgICAKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgaGlnaCBwYXNzIGZpbHRlcgogICAgICAqLwotICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisjZWxzZQorICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJRX0MzMl9Db2Vmc190ICopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbHNlCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgYmFuZCBwYXNzIGZpbHRlcgogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworI2Vsc2UKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZW5kaWYKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0MzMl9Db2Vmc190ICopJkxWREJFX0JQRl9UYWJsZVtPZmZzZXRdKTsKLQorI2Vsc2UKKyAgICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUF9GTE9BVF9Db2Vmc190ICopJkxWREJFX0JQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbmRpZgogfQogCiAKQEAgLTE3NSw3ICsyMDgsOSBAQAogICAgIHsKICAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19HQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCiAgICAgfQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluU2hpZnQgPSBBR0NfR0FJTl9TSElGVDsKKyNlbmRpZgogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7CiAKIH0KQEAgLTIxMiw2ICsyNDcsOSBAQAogICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwogICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICBkQlNoaWZ0c19mYWM7CisjZW5kaWYKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgaWYgZW5hYmxlZAogICAgICAqLwpAQCAtMjM3LDMzICsyNzUsNTggQEAKICAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KICAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBkQlNoaWZ0c19mYWMgPSAoTFZNX0ZMT0FUKSgxIDw8IGRCU2hpZnRzKTsKKyNlbmRpZgogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZW5hYmxlZCB1c2UgQUdDIHZvbHVtZQogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9ICgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSA8PCAxNik7CiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID4+IGRCU2hpZnRzOwotCisjZWxzZQorICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IChMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCAvIGRCU2hpZnRzX2ZhYzsKKyNlbmRpZgogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDICAgID0gTFZEQkVfVm9sdW1lVENUYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVTaGlmdCA9IFZPTFVNRV9TSElGVCsxOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFdoZW4gREJFIGlzIGRpc2FibGVkIHVzZSB0aGUgYnlwYXNzIHZvbHVtZSBjb250cm9sCiAgICAgICovCiAgICAgaWYoZEJTaGlmdHMgPiAwKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLCgoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pID4+IGRCU2hpZnRzKSk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZW5kaWYKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisjZWxzZQorICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisjZW5kaWYKIH0KIAogCkBAIC0zMDksNyArMzcyLDExIEBACiB7CiAKICAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CisjZWxzZQorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKyNlbmRpZgogCiAKICAgICAvKgpAQCAtMzMyLDEyICszOTksMTkgQEAKICAgICB7CiAgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKIAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKIAogCiAgICAgfQpAQCAtMzU3LDEzICs0MzEsMjMgQEAKIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PTiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRik7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMCk7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAxLjBmKTsKKyNlbmRpZgogICAgIH0KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09OKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRik7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCk7CisjZW5kaWYKICAgICB9CiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggYTM2MjNiYy4uM2ZmZjJhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC04MCw3ICs4MCwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBEYXRhIG1lbW9yeQogICAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgPSBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KTsKKyNlbHNlCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9EYXRhX3QpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQV9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTg4LDcgKzkyLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENvZWYgbWVtb3J5CiAgICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKKyNlbHNlCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOyAgIAorI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTk2LDcgKzEwNCwxMiBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQogICAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KICAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICA9IExWREJFX1NDUkFUQ0hfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVkRCRV9TQ1JBVENIOwpAQCAtMTUxLDEwICsxNjQsMTYgQEAKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgIE1peEdhaW47CisjZWxzZQogICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOwogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICBNaXhHYWluOworI2VuZGlmCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CiAKIAogICAgIC8qCkBAIC0yMzUsNyArMjU0LDExIEBACiAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWl4ZXIgd2l0aCBzb21lIGZpeGVzIHZhbHVlcyBzaW5jZSBvdGhlcndpc2UgTFZEQkVfU2V0Vm9sdW1lIGVuZHMgdXAKICAgICAvLyByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YQogICAgIHBNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWU7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKKyNlbHNlCisgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIDEuMCwgMS4wKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBJbml0aWFsaXNlIHRoZSB2b2x1bWUKQEAgLTI0NSw5ICsyNjgsMTMgQEAKIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLE1peEdhaW4sTWl4R2Fpbik7CisjZWxzZQorICAgIE1peEdhaW4gPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTWl4R2FpbiwgTWl4R2Fpbik7CisjZW5kaWYKIAogICAgIC8qIENvbmZpZ3VyZSB0aGUgbWl4ZXIgcHJvY2VzcyBwYXRoICovCiAgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKQEAgLTI2OCw5ICsyOTUsMTEgQEAKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0wOworCiAgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAogICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KQEAgLTI3OCw5ICszMDcsMTUgQEAKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIDEuMCwgMS4wKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogCiAgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggODMzOWQzYy4uNGU1MjA3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC03Nyw2ICs3Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRGF0YSBzdHJ1Y3R1cmUgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KQEAgLTk4LDcgKzk5LDI5IEBACiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwogCiB9IExWREJFX0NvZWZfdDsKKyNlbHNlCisvKiBEYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBBR0MgcGFyYW1ldGVycyAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgIEFHQ0luc3RhbmNlOyAgICAgICAgLyogQUdDIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KIAorICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgIEhQRlRhcHM7ICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgIEJQRlRhcHM7ICAgICAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgICAgICAgICAgIEJ5cGFzc1ZvbHVtZTsgICAgICAgLyogQnlwYXNzIHZvbHVtZSBzY2FsZXIgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgZm9yIENsaWNrIFJlbW92YWwgKi8KKworfSBMVkRCRV9EYXRhX0ZMT0FUX3Q7CisKKy8qIENvZWZzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBIUEZJbnN0YW5jZTsgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCit9IExWREJFX0NvZWZfRkxPQVRfdDsKKyNlbmRpZgogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTA4LDggKzEzMSwxMyBAQAogICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgICBDYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBEYXRhIGFuZCBjb2VmZmljaWVudCBwb2ludGVycyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWREJFX0RhdGFfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KICAgICBMVkRCRV9Db2VmX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyNlbHNlCisgICAgTFZEQkVfRGF0YV9GTE9BVF90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLworICAgIExWREJFX0NvZWZfRkxPQVRfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworI2VuZGlmCiB9IExWREJFX0luc3RhbmNlX3Q7CiAKIApAQCAtMTM2LDUgKzE2NCwzIEBACiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCmluZGV4IDY5ZDc5ZDIuLjEwZWE3MDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgIkFHQy5oIgogI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03MiwxMzYgKzcxLDIzNiBAQAogLyogICAgIG92ZXJhbGwgZW5kIHRvIGVuZCBnYWluIGlzIG9kQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgIGNvbnN0IExWTV9JTlQxNiAqcEluRGF0YSwgTFZNX0lOVDE2ICpwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCisgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopIGhJbnN0YW5jZTsKKyAgTFZNX0lOVDMyICpwU2NyYXRjaCA9CisgICAgICAoTFZNX0lOVDMyICopIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CisgIExWTV9JTlQzMiAqcE1vbm87CisgIExWTV9JTlQxNiAqcElucHV0ID0gKExWTV9JTlQxNiAqKSBwSW5EYXRhOworCisgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIHNob3J0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2wgPSAoTFZNX0lOVDE2ICopICgmcFNjcmF0Y2hbTnVtU2FtcGxlc10pOworCisgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgcE1vbm8gPSAmcFNjcmF0Y2hbMiAqIE51bVNhbXBsZXNdOworCisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkgeworICAgIHJldHVybiAoTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICB9CisKKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pCisgICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCisgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQorICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCisgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKSB7CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQorICAgICAqIChGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gYXBwbHkgaGVhZHJvb20gbG9zcyBoZXJlKQorICAgICAqLworICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgIHBTY3JhdGNoLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSAoMiAqIE51bVNhbXBsZXMpLCAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KKyAgICBMVkRCRV9TQ0FMRVNISUZUKTsgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pIHsKKyAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgIChMVk1fSU5UMzIgKikgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KKyAgICAgKi8KKyAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAgKi8KKyAgICAoTFZNX0lOVDMyICopIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAoTFZNX0lOVDMyICopIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KKyAgICAoTFZNX0lOVDE2KSBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLworICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCisgICAgICogKE5vdCByZXF1aXJlZCBmb3IgMTYtYml0IGltcGxlbWVuYXRpb25zKQorICAgICAqLworICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLworICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsIC8qIERlc3QuIDE2LWJpdCBkYXRhICAgICAqLworICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KKworICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKQorICAgICAgfHwgKExWQ19NaXhlcl9HZXRDdXJyZW50KAorICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICAhPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KAorICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwgcEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2hWb2wsIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgICAqLworCisgIH0KKworICAvKgorICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICovCisgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsIHBTY3JhdGNoVm9sLCBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcykpOworCisgIHJldHVybiAoTFZEQkVfU1VDQ0VTUyk7Cit9CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICBjb25zdCBMVk1fRkxPQVQgKnBJbkRhdGEsCisgICAgTFZNX0ZMT0FUICpwT3V0RGF0YSwKKyAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCiB7CiAKLSAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDMyICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICpwTW9ubzsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXQgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgTFZNX0ZMT0FUICpwU2NyYXRjaF9pbiA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbgorICBbTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0ZMT0FUICpwU2NyYXRjaCA9IHBTY3JhdGNoX2luICsgMiAqIE51bVNhbXBsZXM7CisgIExWTV9GTE9BVCAqcE1vbm87CisgIExWTV9JTlQzMiBpaSA9IDA7CiAKKyAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiA0Kk51bVNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0ZMT0FUICopKCZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc10pOworLy8gIExWTV9JTlQxNiAqcFNjcmF0Y2hWb2xfaW50ID0gKExWTV9JTlQxNiAqKShwU2NyYXRjaFZvbCk7CiAKLSAgICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyBzaG9ydCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBTY3JhdGNoVm9sID0gKExWTV9JTlQxNiAqKSgmcFNjcmF0Y2hbTnVtU2FtcGxlc10pOworICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCisgIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKIAotICAgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgICBwTW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZwU2NyYXRjaFsyKk51bVNhbXBsZXNdOworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgIHsKKyAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICB9CisKKyAgLyoKKyAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byBGbG9hdAorICAgKi8KKyAgQ29weV9GbG9hdChwSW5EYXRhLCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KKyAgICAgIHBTY3JhdGNoX2luLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworCisgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgcFNjcmF0Y2hbaWldID0gcFNjcmF0Y2hfaW5baWldOworICB9CisgIC8qCisgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgKi8KKyAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKKyAgewogCiAgICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCiAgICAgewotICAgICAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQogICAgICAqLwotICAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8Ci0gICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCi0gICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQotICAgICAgICAgKiAoRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIGFwcGx5IGhlYWRyb29tIGxvc3MgaGVyZSkKLSAgICAgICAgICovCi0gICAgICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCi0gICAgICAgICAqLwotICAgICAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgICAgICovCi0gICAgICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBNb25vLCAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4Ci0gICAgICAgICAqLwotICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAgICAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCi0gICAgICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKLSAgICAgICAgICovCi0gICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwgICAgICAgICAgICAvKiBEZXN0LiAxNi1iaXQgZGF0YSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpLCAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLwotCi0gICAgfQotCi0gICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpfHwKLSAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKLSAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKLSAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKLSAgICAgICAgICovCi0gICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCi0KLSAgICB9CisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCiAKICAgICAvKgotICAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKyAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAqLworICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgeworICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KKyAgICAgIGlmKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgICAgcFNjcmF0Y2hbaWldID0gLTEuMDsKKyAgICAgIH0gZWxzZSBpZihwU2NyYXRjaFtpaV0gPiAxLjApIHsKKyAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAorICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpCisgIHsKKworICAgIC8qCisgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQorICAgICAqLworICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBTY3JhdGNoX2luLAorICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgcFNjcmF0Y2gsCisgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKworICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCmluZGV4IGY1ZDIyOWUuLmM0YTliMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKQEAgLTM2LDcgKzM2LDExIEBACiAvKgogICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBCUV9DMzJfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM4MDAwX0ZjNTVfQTEsCkBAIC04Myw2ICs4NywxOCBAQAogICAgICBIUEZfRnM0ODAwMF9GYzU1X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTEzMCw2ICsxNDYsMTkgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCisjZW5kaWYKKwogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTE3Nyw2ICsyMDYsMTkgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisjZW5kaWYKKwogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTIyMywxMiArMjY1LDMyIEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX19OworICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX0KKworI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyNlbmRpZgorCit9OwogCiAvKgogICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBCUF9DMzJfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLApAQCAtMjU3LDYgKzMxOSwxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjg2LDYgKzM1NiwxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTMxNSw2ICszOTMsMTQgQEAKICAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0zNDMsNyArNDI5LDE5IEBACiAgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzNDgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9fTsKKyAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyNlbmRpZgorCisKK307CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1Myw3ICs0NTEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfQVRUQUNLX0ZzODAwMCwKICAgICBBR0NfQVRUQUNLX0ZzMTEwMjUsCiAgICAgQUdDX0FUVEFDS19GczEyMDAwLApAQCAtMzYyLDEwICs0NjQsMjAgQEAKICAgICBBR0NfQVRUQUNLX0ZzMjQwMDAsCiAgICAgQUdDX0FUVEFDS19GczMyMDAwLAogICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDgwMDB9OworICAgIEFHQ19BVFRBQ0tfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE5MjAwMAorI2VuZGlmCisKK307CiAKIC8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfREVDQVlfRnM4MDAwLAogICAgIEFHQ19ERUNBWV9GczExMDI1LAogICAgIEFHQ19ERUNBWV9GczEyMDAwLApAQCAtMzc0LDEwICs0ODYsMjAgQEAKICAgICBBR0NfREVDQVlfRnMyNDAwMCwKICAgICBBR0NfREVDQVlfRnMzMjAwMCwKICAgICBBR0NfREVDQVlfRnM0NDEwMCwKLSAgICBBR0NfREVDQVlfRnM0ODAwMH07CisgICAgQUdDX0RFQ0FZX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0RFQ0FZX0ZTOTYwMDAKKyAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCisjZW5kaWYKKworfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfR0FJTl8wZEIsCiAgICAgQUdDX0dBSU5fMWRCLAogICAgIEFHQ19HQUlOXzJkQiwKQEAgLTM5Niw3ICs1MTgsMTEgQEAKICAgICBBR0NfR0FJTl8xNWRCfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXSA9IHsKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KICAgICBBR0NfSFBGR0FJTl8wZEIsCiAgICAgQUdDX0hQRkdBSU5fMWRCLAogICAgIEFHQ19IUEZHQUlOXzJkQiwKQEAgLTQyMiw2ICs1NDgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gewogICAgIDB4NDAwMCwgICAgICAgICAgICAgLyogLTZkQiAqLwogICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLwpAQCAtNDMwLDggKzU1NywyMiBAQAogICAgIDB4NjVBRCwgICAgICAgICAgICAgLyogLTJkQiAqLwogICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLwogICAgIDB4N0ZGRn07ICAgICAgICAgICAgLyogIDBkQiAqLworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKKyAgICAwLjUwMDAwMGYsICAgICAgICAgLyogLTZkQiAqLworICAgIDAuNTYyMzQxZiwgICAgICAgICAvKiAtNWRCICovCisgICAgMC42MzA5NTdmLCAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjcwNzk0NmYsICAgICAgICAgLyogLTNkQiAqLworICAgIDAuNzk0MzI4ZiwgICAgICAgICAvKiAtMmRCICovCisgICAgMC44OTEyNTFmLCAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAxLjAwMDAwMGZ9OyAgICAgICAgLyogIDBkQiAqLworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIFZPTF9UQ19GczgwMDAsCiAgICAgVk9MX1RDX0ZzMTEwMjUsCiAgICAgVk9MX1RDX0ZzMTIwMDAsCkBAIC00NDAsOSArNTgxLDE3IEBACiAgICAgVk9MX1RDX0ZzMjQwMDAsCiAgICAgVk9MX1RDX0ZzMzIwMDAsCiAgICAgVk9MX1RDX0ZzNDQxMDAsCi0gICAgVk9MX1RDX0ZzNDgwMDB9OworICAgIFZPTF9UQ19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLFZPTF9UQ19Gczk2MDAwCisgICAgLFZPTF9UQ19GczE5MjAwMAorI2VuZGlmCit9OworCisKIAogY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdID0geworCiAgICAgTUlYX1RDX0ZzODAwMCwKICAgICBNSVhfVENfRnMxMTAyNSwKICAgICBNSVhfVENfRnMxMjAwMCwKQEAgLTQ1MSw2ICs2MDAsMTAgQEAKICAgICBNSVhfVENfRnMyNDAwMCwKICAgICBNSVhfVENfRnMzMjAwMCwKICAgICBNSVhfVENfRnM0NDEwMCwKLSAgICBNSVhfVENfRnM0ODAwMH07CisgICAgTUlYX1RDX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsTUlYX1RDX0ZzOTYwMDAKKyAgICAsTUlYX1RDX0ZzMTkyMDAwCisjZW5kaWYKIAotCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCmluZGV4IDQ3NmU2YTAuLmNhNDZlMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzYsOCArNzcsNTcgQEAKIAogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW107CiAKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhpZ2ggUGFzcyBGaWx0ZXIgQ29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW107CisKKy8qCisgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXTsKKworLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19HQUlOX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW107CisKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KKwogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXTsKIAorCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAppbmRleCAxZmYyYTJjLi45YjZkYTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApAQCAtNTE0LDExICs1MTQsMTkgQEAKIC8qICAgICAgU1RFUkVPICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwYWlycyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyNlbHNlCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworI2VuZGlmCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwppbmRleCA2Y2JlZTdkLi4wYTNjMzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTQ4LDcgKzQ4LDE1MiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgKnBTdGFydDsKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CisgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBwQnVmZmVyICAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgcERlc3QgICAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFRvUHJvY2VzcyA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgICpwUHJvY2Vzc2VkID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayBvZiBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKyBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgICAgPSBMVk1fRklSU1RDQUxMOworICAgIH0KKyAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyB0byBvdXRwdXQgaXMgc2FtZSBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsIGFuZCB1cGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUHJvY2VzcyB0aGUgbWF4aW11bSBib2NrIHNpemUgb2Ygc2FtcGxlcy4KKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZUNvdW50ID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMYXN0IGNhbGwgZm9yIHRoZSBibG9jaywgc28gY2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyBhbmQgc2FtcGxlcyB0byBwcm9jZXNzCisgICAgICAgICAgKi8KKyAgICAgICAgTFZNX0lOVDE2ICAgTnVtRnJhbWVzOworCisgICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBOdW1GcmFtZXMgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KShOdW1GcmFtZXMgPDwgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RMQVNUQ0FMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0xBU1RDQUxMOworICAgICAgICB9CisgICAgfQorICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KVNhbXBsZUNvdW50OyAgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLworCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpKTsgICAgLyogTnVtYmVyIG9mIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVzdCBvZiB0aGUgc2FtcGxlcyBmb3IgdGhpcyBjYWxsIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gMCkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIE51bVNhbXBsZXMpKTsgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgaW5wdXQgZGF0YSBwb2ludGVyIGFuZCBzYW1wbGVzIHRvIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgLyogVXBkYXRlIHNhbXBsZXMgdG8gb3V0cHV0ICovCisgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCArIE51bVNhbXBsZXMpOworICAgIH0KKworCisgICAgLyoKKyAgICAgICogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgYW5kIGlucHV0IHBvaW50ZXIKKyAgICAgKi8KKyAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNhbXBsZXMgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOworICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICAgPSBwU3RhcnQ7IC8qIFVwZGF0ZSBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscyAqIFNhbXBsZUNvdW50OyAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIE51bVNhbXBsZXMpKTsgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGRlbGF5IHNhbXBsZSBjb3VudAorICAgICAgICAgKi8KKyAgICAgICAgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgICAgID0gTnVtU2FtcGxlczsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZSBwYWlycyAqLworICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtMTg5LDcgKzMzNCw3IEBACiAgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KICAgICB9CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjEzLDcgKzM1OCw0NyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZmlyc3QgY2FsbCAqLworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAqcFRvUHJvY2VzczsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBJL08gcG9pbnRlcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICA9ICpwUHJvY2Vzc2VkOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2VzcyBwb2ludGVycworICAgICAqLworICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOworICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBQcm9jZXNzZWQsCkBAIC0yNTIsNyArNDM3LDcgQEAKICAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKICAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7CiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjc4LDYgKzQ2Myw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWTV9CdWZmZXJPcHRpbWlzZWRJbihMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICoqcFRvUHJvY2VzcywKQEAgLTQxNiw3ICs2MDIsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ3MSw3ICs2NTcsMzcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtNTAxLDcgKzcxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUyMiw3ICs3MzgsMTU2IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQnVmZmVyX3QgICAgKnBCdWZmZXIgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIExWTV9JTlQxNiAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAqcFN0YXJ0OworICAgIExWTV9GTE9BVCAgICAgICAqcERlc3Q7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwb2ludGVycworICAgICAqLworICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7CisgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworCisKKyAgICAvKgorICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKQorICAgIHsKKyAgICAgICAgLyogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBPdXREYXRhOyAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgb3V0cHV0IGFkZHJlc3MgKi8KKworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm9uLXplcm8gdGhlbiB0aGVyZSBhcmUgc3RpbGwgc2FtcGxlcyB0byBzZW5kIHRvCisgICAgICogdGhlIG91dHB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYKKyAgICAgICAgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGRlbGF5ZWQgb3V0cHV0IGJ1ZmZlciBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPD0gTnVtU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgYWxsIG91dHB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVhbGlnbiB0aGUgZGVsYXkgYnVmZmVyIGRhdGEgdG8gYXZvaWQgdXNpbmcgY2lyY3VsYXIgYnVmZmVyIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBOdW1TYW1wbGVzICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7ICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCAtIE51bVNhbXBsZXMpOyAvKiBQcm9jZXNzZWQgc2FtcGxlcyBsZWZ0ICovCisgICAgICAgICAgICBOdW1TYW1wbGVzICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCisgICAgICovCisgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLworICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBwb2ludGVycywgY291bnRzIGFuZCBzZXQgZGVmYXVsdCBidWZmZXIgcHJvY2Vzc2luZworICAgICAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCisgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLworICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKQEAgLTY3Miw3ICsxMDM3LDcgQEAKICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIGJsb2NrIHNpemUgKi8KICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7ICAgICAgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc0MSw2ICsxMTA2LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKIHsKQEAgLTgwNSw3ICsxMTcxLDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NDMsNyArMTIwOSwzMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJPdXQoTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZE91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWTV9CdWZmZXJPdXQoTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCkBAIC04NjcsNCArMTI1Nyw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggMjcxMmIyYy4uMzUzNTYwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMjYsMTAgKzI2LDY1NSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUcmVibGVCb29zdE1pblJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDIyMDUwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAzODQzNAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMTU5OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDgxNTU3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjg4NDc1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjk5NDMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNDAwOTAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE4NDIzMgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4NTgwMQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjQ1MTQ1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI0ODg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTM0OTEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTY1NDEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM5MDE3NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMjAxNDQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NjIxOQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMDYxODcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU3Mjc2MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDI3MjgKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODEwODIKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzExMDQ5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODAyNjIwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzMjU4OAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzODk4OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41Njg5NTYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTE5OTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzIxOTY0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjYzNjc0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5MzY0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ1NjMwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODYyNjcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDQ0NjYyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjIzMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQ3NzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNzMxNzYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE1MDk5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjExNjk1MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjE0MDg2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDUzODYzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yODQ4NzAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2OTIxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDI5MQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA5NjM0MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUzNDAzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4NTQ1NAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTUzMzg5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4NTQ0MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjY1NTc0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM5NzYyNQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc5MTQ0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41MjM0OTkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MzI2ODIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY0NzMzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxMTQ4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyMzE5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2ODk1MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMDEwMDEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40Njg0NDcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjAwNDk4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjkyMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyNDMzOAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTQ2MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNjI2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MjQ0NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zODkxNDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjE5MzYxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NTU5NDMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MTEzOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yNzQwNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjczMzQxOAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDA1OTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzExNzA3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNzQzNjQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkzMjU3CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU3ODAxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM3NjY5NQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjUxNDIwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDcwMzEzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzU2NDYxCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NTM1NQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NDMyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42OTMyMTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwNjU1OQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjgyNTQ1MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU0OTM1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczODI4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTIxNDE0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjE0MDMwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjEwODIwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zMjcxMDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMTc3OTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41MzY2ODcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NTI5NTIKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS43NzE4NDYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTY4MDUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMzU2OTgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTEyODUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjMzMTc0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ0NTAyMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjY2MzkxNgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjgxNzcyNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjAzNjYxOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgNDgwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NzM1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzQ1MzA2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NDE1MgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyMTAxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI2MTUzOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTI5NDg4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNzA4MDcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42Mzg3NTcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5MzQwOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2MTM1OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYzMDk3MQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTg5MjAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODUzMTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDUzMjY3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTg0OTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjY0NDcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTUyODA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40MjA3NTgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAyLjM3MDgyOQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNjM4Nzc4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjE1NDUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODgzNDAxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODg5OTI0CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTU3ODczCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE5Nzg4NgorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi40NjU4MzUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDM0MjUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi44MTEzNzQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAzLjkzMTEyNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMTk5MDc2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisjaWZkZWYgSElHSEVSX0ZTCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgOTYwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NjIzMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjczNTgzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNDIwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzgxNTU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMyNTM1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTAyNzA4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NjEyOTEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMzg2NDEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYxMzgxMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjE5MTE2MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NDkzOQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zNjIyODkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk3Njk0OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41NTQyOTkKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE5MjM4NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc2OTczOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQzNDExMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDExNDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMi43MDUzMzUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuMjgyNjg1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA5NjUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNTg3MDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjM1MTA5NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjkyODQ0NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjczNDIwNworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4zMTE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjE2NDA2NAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNzQxNDE0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNC42NDYzNzEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00LjIyMzcyMQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxOTIwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA3ODIzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODc1MTUwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI4ODAzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTk2MTMwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDU0NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjEzMTg3MQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTY4NDkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yODQxNzYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4NzczNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40NTUwNjQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44Nzk0NzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjY0NjgwNAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTQ2MTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjg2MTk0MAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzM1OTk5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjEwMzMyNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42MDY4MzkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zNzQxNjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjkxMDcyNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjc4MDUzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yNTE2OTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDE5MDIwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MzQyNjQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuNDAxNTkxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjA2MzUxNgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuODMwODQzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTQ1MTQ1CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC00LjMxMjQ3MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wODU1NDIKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtNC44NTI4NjgKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisKKyNlbmRpZgorCisjZWxzZQogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyMjA1MEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE2NDI5MSAqLwpAQCAtNTcxLDMgKzEyMTYsNCBAQAogCiAKICNlbmRpZgorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKaW5kZXggNzI1NjRkNC4uY2ZlNTNiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCkBAIC02NSw5ICs2NSwxNiBAQAogICAgIGlmKAogICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KICAgICAgICAgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKKyNlbmRpZgogICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAogICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCiAgICAgewpAQCAtMjY4LDcgKzI3NSwxMiBAQAogdm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGV4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZWxzZQogICAgIGV4dGVybiBGT19DMTZfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworI2VuZGlmCisKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSAwOwogCkBAIC0yOTgsNiArMzEwLDIwIEBACiAgICAgICAgICAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMgYW5kIGVuYWJsZWQgdGhlIHRyZWJsZSBib29zdAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShFZmZlY3RMZXZlbCAtIDEgKyBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9GTE9BVCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2Vsc2UKICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkxWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0pOwpAQCAtMzA5LDYgKzMzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKS9zaXplb2YoTFZNX0lOVDE2KSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTM0Miw2ICszNjksOSBAQAogICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgIFRlbXA7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogTGltaXQgdGhlIGdhaW4gdG8gdGhlIG1heGltdW0gYWxsb3dlZApAQCAtNDAxLDIyICs0MzEsNDYgQEAKICAgICAgKi8KICAgICBpZihkQlNoaWZ0cyA9PSAwKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOwotICAgIH0KKyNlbmRpZgorICAgICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBUZW1wID0gTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XTsKKyAgICAgICAgd2hpbGUoZEJTaGlmdHMpIHsKKyAgICAgICAgICAgIFRlbXAgPSBUZW1wIC8gMi4wZjsKKyAgICAgICAgICAgIGRCU2hpZnRzLS07CisgICAgICAgIH0KKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIFRlbXApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKT4+ZEJTaGlmdHMpKTsKKyNlbmRpZgogICAgIH0KICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CiAgICAgaWYocEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9PSBMVk1fVFJVRSkKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2VuZGlmCiAgICAgfQogfQogCkBAIC01NTQsOCArNjA4LDIzIEBACiAgICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLwogICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisjZW5kaWYKICAgICAgICAgICAgIC8qIERyb3AgaW4gcmlnaHQgY2hhbm5lbCB2b2x1bWUqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8PCA0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKQEAgLTU2MywxMSArNjMyLDI3IEBACiAgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlPDw0KSk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlID4wKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogRHJvcCBpbiBsZWZ0IGNoYW5uZWwgdm9sdW1lKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSA8PCA0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisjZWxzZQogICAgICAgICAgICAgVGFyZ2V0ID0gZEJfdG9fTGluMzIoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKTw8NCkpOwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKQEAgLTU3NSwxNyArNjYwLDM2IEBACiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworI2Vsc2UKICAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisjZW5kaWYKICAgICAgICAgICAgIC8qIE5vIGRyb3AqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisjZWxzZQogICAgICAgICAgICAgVGFyZ2V0ID0gTFZNX01BWElOVF8xNjsKKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwogCiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgLyoKQEAgLTEwMDgsMTggKzExMTIsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCiB7CiAgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0OworI2Vsc2UKICAgICBMVk1fSU5UMzIgICAgVGFyZ2V0OworI2VuZGlmCiAKICAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOwogICAgICh2b2lkKSBDYWxsQmFja1BhcmFtOwogCiAgICAgLyogV2hlbiB2b2x1bWUgbWl4ZXIgaGFzIHJlYWNoZWQgMCBkQiB0YXJnZXQgdGhlbiBzdG9wIGl0IHRvIGF2b2lkCiAgICAgICAgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZy4gKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKKyAgICBpZihUYXJnZXQgPT0gMS4wZikKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgIH0KKyNlbHNlCiAgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0pOwogCiAgICAgaWYoVGFyZ2V0ID09IDB4N0ZGRikKICAgICB7CiAgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgIH0KKyNlbmRpZgogICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKaW5kZXggNTQyYzNjOC4uMjZjMWM0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCkBAIC0yMzIsNyArMjMyLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7CiAKQEAgLTI2NSw3ICsyNjksMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CisjZW5kaWYKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOwpAQCAtNTQyLDEwICs1NTAsMTUgQEAKICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworI2VuZGlmCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlTYW1wbGVzID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgLyogU2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5PdXREZWxheVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RDQUxMOyAgICAgICAgICAgICAvKiBTZXQgdGhlIHN0YXRlIHJlYWR5IGZvciB0aGUgZmlyc3QgY2FsbCAqLwpAQCAtNTk4LDE0ICs2MTEsMjYgQEAKICAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLDApOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgIH0KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKKyNlbmRpZgogCiAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOwpAQCAtNjE1LDE1ICs2NDAsMjQgQEAKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOwogCiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisjZWxzZQogICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMVk1fRlNfODAwMCwyKTsKKwogICAgIC8qCiAgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKICAgICAgKi8KQEAgLTcwOSw3ICs3NDMsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKIApAQCAtNzYzLDcgKzgwMSwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CkBAIC04NjgsOSArOTEwLDE0IEBACiAgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKIAogICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQorICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CiAKIApAQCAtOTk0LDcgKzEwNDEsNiBAQAogICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwogCi0KICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IDJlODVmNzcuLmI0NTMyMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTM4LDYgKzEzOCwyMyBAQAogCiAKIC8qIEJ1ZmZlciBNYW5hZ2VtZW50ICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KKworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KK30gTFZNX0J1ZmZlcl90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KQEAgLTE1MCwyMiArMTY3LDI4IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT3V0RGVsYXlTYW1wbGVzOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgbGVmdCBhbmQgcmlnaHQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLwogfSBMVk1fQnVmZmVyX3Q7Ci0KKyNlbmRpZgogCiAvKiBGaWx0ZXIgdGFwcyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190IFRyZWJsZUJvb3N0X1RhcHM7ICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyNlbHNlCiAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLworI2VuZGlmCiB9IExWTV9URV9EYXRhX3Q7CiAKLQogLyogQ29lZmZpY2llbnRzICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KKyNlbHNlCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KKyNlbmRpZgogfSBMVk1fVEVfQ29lZnNfdDsKIAotCiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCkBAIC0xODEsMTUgKzIwNCwyNCBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOyAgLyogTWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplICovCiAgICAgTFZNX0J1ZmZlcl90ICAgICAgICAgICAgKnBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzOyAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKIAogICAgIC8qIENvbmZpZ3VyYXRpb24gbnVtYmVyICovCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk51bWJlcjsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCbGlja1NpemVNdWx0aXBsZTsKIAogICAgIC8qIERDIHJlbW92YWwgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyNlbHNlCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kICovCiAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgaENTSW5zdGFuY2U7ICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLwpAQCAtMjA5LDggKzI0MSwxNiBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIERCRV9BY3RpdmU7ICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisjZWxzZQogICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAgIFZDX1ZvbHVtZTsgICAgICAgICAgLyogVm9sdW1lIHNjYWxlciAqLworI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19Wb2x1bWVkQjsgICAgICAgIC8qIEdhaW4gaW4gZEIgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FWTEZpeGVkVm9sdW1lOyAgLyogQVZMIGZpeGVkIHZvbHVtZSAqLwpAQCAtMjM0LDcgKzI3NCwxMSBAQAogICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgIFBTQV9Db250cm9sUGFyYW1zOyAgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgUFNBX0dhaW5PZmZzZXQ7ICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLwogICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisjZW5kaWYKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIApAQCAtMjYxLDE2ICszMDUsMjggQEAKIAogdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgIExWTV9CdWZmZXJJbiggICBMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcyk7CisjZWxzZQogdm9pZCAgICBMVk1fQnVmZmVySW4oICAgTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOworI2VuZGlmCiAKIExWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCAgICAgdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcERhdGEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCBmNWEwMWYzLi40YTE5YTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTUxLDcgKzUxLDIzMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFNhbXBsZUNvdW50ID0gTnVtU2FtcGxlczsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQgICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgKi8KKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgdW5tYW5hZ2VkIG1vZGUgb25seQorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgYSBnb29kIG11bHRpcGxlICh1bm1hbmFnZWQgbW9kZSBvbmx5KQorICAgICAgICAgKi8KKyAgICAgICAgaWYoKE51bVNhbXBsZXMgJSBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CisgICAgICAgICAqLworICAgICAgICBpZigoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZNX0FMSUdOTUVOVEVSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworCisgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKKyAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIHRoZSBkYXRhIHdpdGggbWFuYWdlZCBidWZmZXJzCisgICAgICovCisgICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgZnJhbWUgcHJvY2Vzc2luZworICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICZwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgJnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gU2FtcGxlQ291bnQgaXMgbm9uZSB6ZXJvLCBhIHplcm8gY291bnQgY2FuIG9jY3VyIHdoZW4KKyAgICAgICAgICogdGhlIEJ1ZmZlckluIHJvdXRpbmUgaXMgd29ya2luZyBpbiBtYW5hZ2VkIG1vZGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGwgTi1CYW5kIGVxdWFsaXNlciBpZiBlbmFibGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgICAgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBiYXNzIGVuaGFuY2VtZW50IGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCeXBhc3MgbW9kZSBvciBldmVyeXRoaW5nIG9mZiwgc28gY29weSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFRvUHJvY2VzcyAhPSBwUHJvY2Vzc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKworICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogREMgcmVtb3ZhbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlck91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNzMsMyArNDk3LDQgQEAKIAogICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CiB9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKaW5kZXggZTE0ZjkwOS4uMTk5ZGRkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpAQCAtMjksNyArMjksMzQyIEBACiAvKiAgICBUcmVibGUgQm9vc3QgRmlsdGVyIENvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSx9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0OGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjE1X0IxfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIH07CisjZWxzZQogRk9fQzE2X0xTaHhfQ29lZnNfdCAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0gewogCiAgICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KQEAgLTM0MCw4ICs2NzUsOSBAQAogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KICAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCwKICAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9fTsKLQorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X1NoaWZ0fQorICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTAsNiArNjg2LDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CisgICAgMS4wMDBmLCAgICAgICAgICAgICAvKiAgMGRCICovCisgICAgMC44OTFmLCAgICAgICAgICAgICAvKiAtMWRCICovCisgICAgMC43OTRmLCAgICAgICAgICAgICAvKiAtMmRCICovCisgICAgMC43MDhmLCAgICAgICAgICAgICAvKiAtM2RCICovCisgICAgMC42MzFmLCAgICAgICAgICAgICAvKiAtNGRCICovCisgICAgMC41NjJmLCAgICAgICAgICAgICAvKiAtNWRCICovCisgICAgMC41MDFmfTsgICAgICAgICAgICAvKiAtNmRCICovCisjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWTV9Wb2x1bWVUYWJsZVtdID0gewogICAgIDB4N0ZGRiwgICAgICAgICAgICAgLyogIDBkQiAqLwogICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLwpAQCAtMzU4LDYgKzcwNCw3IEBACiAgICAgMHg1MEMzLCAgICAgICAgICAgICAvKiAtNGRCICovCiAgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCiAgICAgMHg0MDAwfTsgICAgICAgICAgICAvKiAtNmRCICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKaW5kZXggYTc2MDFmZi4uNGNmNzExOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaApAQCAtMzcsMTYgKzM3LDIzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworI2Vsc2UKIGV4dGVybiBGT19DMTZfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXTsKKyNlbHNlCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWTV9Wb2x1bWVUYWJsZVtdOworI2VuZGlmCisKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdOwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggMjA4MGQ2NC4uOWEzZDM1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTM3LDcgKzM3LDcgQEAKIC8qICAgIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgIEFHQ19HYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCkBAIC01MiwyMCArNTIsMzkgQEAKICAgICBMVk1fSU5UMTYgIFZvbHVtZVRDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCiB9IEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEFHQ19HYWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICBBR0NfTWF4R2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgIFRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0YXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19UYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19BdHRhY2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBhdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICBBR0NfRGVjYXk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgZGVjYXkgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KIAorfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3Q7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAppbmRleCA3YWM3ZmJkLi4zZWU3ZjYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaApAQCAtMjcsMTkgKzI3LDM0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07CiAKK30gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKIAogfSBCaXF1YWRfSW5zdGFuY2VfdDsKLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0ZMT0FUICBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUICBCMTsgICAvKiAtYjEhICovCit9IEJRX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTI7ICAgLyogIGEyICAqLwpAQCAtNTcsOCArNzIsMTcgQEAKICAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gQlFfQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCit9IEZPX0ZMT0FUX0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLwpAQCAtNzIsOCArOTYsMTcgQEAKICAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gRk9fQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgd2l0aCBTaGlmdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBBMTsgICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMTsgICAgLyogLWIxISAqLworfSBGT19GTE9BVF9MU2h4X0NvZWZzX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgQTE7ICAgIC8qICBhMSAgKi8KQEAgLTgxLDggKzExNCwxNiBAQAogICAgIExWTV9JTlQxNiBCMTsgICAgLyogLWIxISAqLwogICAgIExWTV9JTlQxNiBTaGlmdDsgLyogU2hpZnQgKi8KIH0gRk9fQzE2X0xTaHhfQ29lZnNfdDsKLQorI2VuZGlmCiAvKioqIEJhbmQgcGFzcyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlBfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCkBAIC05Niw4ICsxMzcsMTggQEAKICAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KICAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KIH0gQlBfQzMyX0NvZWZzX3Q7CisjZW5kaWYKIAogLyoqKiBQZWFraW5nIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0ZMT0FUICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCkBAIC0xMTMsMTYgKzE2NCwyNiBAQAogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogICAgIExWTV9JTlQxNiAgRzsgICAvKiBHYWluICovCiB9IFBLX0MzMl9Db2Vmc190OwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIFRBUFMgVFlQRSBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgZmlyc3Qgb3JkZXIgYW5kIHNoZWx2aW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDIpIF07ICAvKiBPbmUgY2hhbm5lbCwgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAKIHR5cGVkZWYgc3RydWN0CiB7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdDsKIApAQCAtMTMwLDEyICsxOTEsMjIgQEAKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDIqMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzJJX09yZGVyMV9UYXBzX3Q7Ci0KKyNlbmRpZgogCiAvKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzFJX09yZGVyMl9UYXBzX3Q7CiAKQEAgLTE0Myw3ICsyMTQsNyBAQAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMio0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KIH0gQmlxdWFkXzJJX09yZGVyMl9UYXBzX3Q7Ci0KKyNlbmRpZgogLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLwogI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCiAjZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgpAQCAtMTU0LDU5ICsyMjUsMTQ4IEBACiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjE1LDMzICszNzUsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogRklSU1QgT1JERVIgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTI1MCwxMyArNDQzLDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEJBTkQgUEFTUyBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Cit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTI3NCwxMCArNDgyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLQorI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiggICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjg2LDQyICs1MDEsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAKIC8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQogdm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCit2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKIAogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKaW5kZXggNGNiOGFhMi4uNDk4ZmFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApAQCAtNjYsMTMgKzY2LDE3IEBACiAvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOworI2Vsc2UKIHZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmSW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZPdXQsCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOwotCi0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKaW5kZXggMjI5NzAxYS4uMGM4OTU1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKQEAgLTMzLDExICszMywzMiBAQAogICAgREVGSU5FUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEZJTFRFUl9MT1NTICAgICAzMjczMCAgICAgICAvKiAtMC4wMWRCIGxvc3MgdG8gYXZvaWQgd3JhcHBpbmcgZHVlIHRvIGJhbmQgcmlwcGxlICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAgICAwLjk5ODg0OWYKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMCggICBMVk1fRkxPQVQgIFgpOworCitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBYKTsKKyNpZmRlZiBISUdIRVJfRlMKK0xWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICBGYywKKyNlbHNlCitMVk1fRkxPQVQgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgRmMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKKworTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgIExWTV9GTE9BVCAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcyk7CisKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKCAgICBMVk1fRkxPQVQgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqcENvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgIFgpOwpAQCAtNTIsNyArNzMsNyBAQAogCiBMVk1fSU5UMzIgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgRmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZSk7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKaW5kZXggNjhjNTVmNy4uY2IxNWI2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKQEAgLTQ0LDYgKzQ0LDkgQEAKIAogI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCiAjZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3CisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZNX01BWEZMT0FUICAgICAgICAgICAgMS4wZgorI2VuZGlmCiAjZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKICNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NwogCkBAIC05NSw3ICs5OCw5IEBACiB0eXBlZGVmICAgICBpbnQzMl90ICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCiB0eXBlZGVmICAgICB1aW50MzJfdCAgICAgICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgTFZNX0ZMT0FUOyAgICAgICAgICAvKiBzaW5nbGUgcHJlY2lzc2lvbiBmbG9hdGluZyBwb2ludCovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMyw2ICsxMzgsMTAgQEAKICAgICBMVk1fRlNfMzIwMDAgPSA2LAogICAgIExWTV9GU180NDEwMCA9IDcsCiAgICAgTFZNX0ZTXzQ4MDAwID0gOCwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICBMVk1fRlNfOTYwMDAgPSA5LAorICAgIExWTV9GU18xOTIwMDAgPSAxMCwKKyNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fRnNfZW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaAppbmRleCA4OWRlYjBkLi4wN2M1M2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKQEAgLTMwLDYgKzMwLDQzIEBACiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2YWx1ZS4gIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDsgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgdmFsdWUuICBTZXQgYnkgdGhlIG1peGVyIGZ1bmN0aW9uLiAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0OyAgICAgICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlOyAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworfSBNaXhfMVN0X0NsbF9GTE9BVF90OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBbHBoYTE7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0MTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7CisKKyAgICBMVk1fRkxPQVQgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgICBUYXJnZXQyOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKK30gTWl4XzJTdF9DbGxfRkxPQVRfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgIEFscGhhOyAgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uICBDYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSAqLwpAQCAtNjQsOSArMTAxLDM1IEBACiAKIH0gTWl4XzJTdF9DbGxfdDsKIAorI2VuZGlmCiAKIC8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7CisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIExWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7CkBAIC04OCwxMCArMTUxLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKIAorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTIChMT1cgTEVWRUwgU1VCRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtMTA3LDYgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpAQCAtMTE1LDEzICsxOTUsMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAvKiBfX01JWEVSX0hfXyAqLwotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKaW5kZXggM2Q2MjcwNC4uY2RiMzgzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaApAQCAtMzQsNyArMzQsMTIgQEAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogCiAvKiBBYnNvbHV0ZSB2YWx1ZSBpbmNsdWRpbmcgdGhlIGNvcm5lciBjYXNlIGZvciB0aGUgZXh0cmVtZSBuZWdhdGl2ZSB2YWx1ZSAqLworCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgIGlucHV0KTsKKyNlbHNlCiBMVk1fSU5UMzIgICBBYnNfMzIoTFZNX0lOVDMyICAgICBpbnB1dCk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKQEAgLTQ4LDggKzUzLDExIEBACiAgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CiAgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBkQl90b19MaW5GbG9hdChMVk1fSU5UMTYgICAgZGJfZml4KTsKKyNlbHNlCiBMVk1fSU5UMzIgZEJfdG9fTGluMzIoTFZNX0lOVDE2ICBkYl9maXgpOworI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDJiNzkxYmQuLjBiYTIwYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTI5LDYgKzI5LDExIEBACiAgICAgVkFSSU9VUyBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTG9hZENvbnN0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBMb2FkQ29uc3RfMTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKQEAgLTM2LDEwICs0MSwxNyBAQAogdm9pZCBMb2FkQ29uc3RfMzIoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18xNngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTQ5LDEwICs2MSwxNyBAQAogICogICAgICAgVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoaWNoIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgKgogICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNdWx0M3NfRmxvYXQoICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNdWx0M3NfMTZ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMzJ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC02NiwyMCArODUsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZGVsYXksICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsICAgICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgIDsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbHNlCiB2b2lkIERlbGF5TWl4XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIHZvaWQgRGVsYXlXcml0ZV8zMiggICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywgICAgICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgKnBPZmZzZXQsICAgICAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEFkZDJfU2F0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEFkZDJfU2F0XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKQEAgLTg3LDcgKzExNywxMyBAQAogdm9pZCBBZGQyX1NhdF8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgTWFjM3NfU2F0XzE2eDE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LApAQCAtOTcsNyArMTMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KQEAgLTEwOSw3ICsxNDUsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgU0hJRlQgRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbik7CisjZWxzZQogdm9pZCBTaGlmdF9TYXRfdjE2eHYxNiAoICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xMTksMTEgKzE2MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIEFVRElPIEZPUk1BVCBDT05WRVJTSU9OIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNb25vVG8ySV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgTW9ub1RvMklfMTYoICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CkBAIC0xMzEsMjkgKzE3Niw1MiBAQAogdm9pZCBNb25vVG8ySV8zMiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTVNUbzJpX1NhdF9GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIE1TVG8yaV9TYXRfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyY00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyY1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTVNfRmxvYXQoICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBGcm9tMmlUb01TXzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdE0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBKb2luVG8yaV9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KIHZvaWQgSm9pblRvMmlfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY0wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggOTIwYjUxNS4uZmE5ZjAxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMzLDcgKzMzLDEwIEBACiAKICNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBWT0xfVENfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMGYgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIERFQ0FZX0ZBQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NC4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjksNyArNzIsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwpAQCAtMTkzLDQgKzE5NiwxMTMgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbHNlCit2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3sKIAorICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfQXR0YWNrICAgID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgICAgICAvKiBBdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0RlY2F5ICAgICA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UQyAgICAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQgKi8KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLworICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGxlZnQgc2FtcGxlICovCisgICAgICAgIFJpZ2h0ID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSByaWdodCBzYW1wbGUgKi8KKyAgICAgICAgTW9ubyAgPSAqcE1vbm9TcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBzdGVyZW8gc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworICAgICAgICBSaWdodCArPSAoTW9ubyAqIEFHQ19NdWx0KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgPSBMZWZ0ICAqIFZvbF9NdWx0OworICAgICAgICBSaWdodCA9IFJpZ2h0ICogVm9sX011bHQ7CisgICAgICAgICpwRHN0KysgPSBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAqcERzdCsrID0gUmlnaHQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChMZWZ0KSA+IEFic19GbG9hdChSaWdodCkgPyBBYnNfRmxvYXQoTGVmdCkgOiBBYnNfRmxvYXQoUmlnaHQpOworICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwppbmRleCA5MTI4YjgyLi44NGZhYmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwpAQCAtNDcsNCArNDcsMTQgQEAKICAgICB9CiAgICAgcmV0dXJuIGlucHV0OwogfQotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgIGlucHV0KQoreworICAgIGlmKGlucHV0IDwgIDApCisgICAgeworICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCisgICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwppbmRleCA2OWQzNTdlLi5lM2VkY2NjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTU3LDQgKzU3LDMzIEBACiAgICAgcmV0dXJuOwogfQogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSAqc3JjKSArICgoTFZNX0ZMT0FUKSAqZHN0KTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwppbmRleCBmNGM1NzU3Li44OGY5OTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKQEAgLTMzLDcgKzMzLDUxIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCiAKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAgKiAoeChuKUwgIC0geChuLTIpTCAgKSApCisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogKCgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9eW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03OCw0ICsxMjIsNSBAQAogICAgICAgICB9CiAKICAgICB9CisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDg4OTE0YWQuLjI3YWI1N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDE5IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNDksNiArNjIsNyBAQAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CiAgIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTgwNTM5Yy4uZTE5NGY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjcsNCArMjcsMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IGJhMWE0MmYuLjNhYmRkNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNDggQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQoreworICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwogCisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvLyB5bkw9IChBMCAqICh4KG4pTCAtIHgobi0yKUwgKSkKKyAgICAgICAgdGVtcGwgPSAoTFZNX0ZMT0FUKSAqcERhdGFJbiAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9ICh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICB9Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODAsNCArMTIxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCBlODMzMjE4Li5kNmUwNDdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC00OCw2ICs0OCwyMCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7CisKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01OSw2ICs3Myw3IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOWNjYTYyNy4uYWE5ZTY2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjYsNSArMjYsMTIgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0Zsb2F0OwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKaW5kZXggYjA5YzFhYS4uYWJkYjJmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCkBAIC0zMyw3ICszMyw1MiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03OCw0ICsxMjMsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCmluZGV4IDkzNjc5MTIuLjU1OTBjMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKQEAgLTM3LDYgKzM3LDIxIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01MCw2ICs2NSw3IEBACiAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCmluZGV4IDVjYzFjZTIuLjgwYzM5MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKQEAgLTI2LDUgKzI2LDEzIEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKIAogI2VuZGlmIC8qX0JQXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAyX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZjJmOGM2Yi4uZWU5YmY3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw1NiBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKC1CMSAgKiB5KG4tMSlMICApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTgyLDQgKzEzMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggYmFmMGMxYS4uM2Q1YmVmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTYsNiArNzYsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5MDljNjk5Li44MTFkYThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDkyZjZjYWYuLmM3NGExMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpAQCAtMzIsNyArMzIsNTQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9IC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCkoeW5MKTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTgxLDQgKzEyOCw0IEBACiAKICAgICAgICAgfQogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggYWVhMTBmMC4uOTgxMjI3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjcsNCArMjcsMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKaW5kZXggMWQ2YmU0ZS4uZmVhZTIwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMzgsNiArMzgsMjcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKilwVGFwczsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTcsNiArNzgsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwppbmRleCA5NzJlNzA0Li45YjBmZGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDgxIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOworCisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0CisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTEyLDMgKzE4Niw0IEBACiAKICAgICB9CiAKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGUwNTYzNzMuLmYyNGRiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsODEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTExLDQgKzE4NSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMGE4YWMzNS4uMzllMWJkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMjcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU3LDYgKzc4LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggN2Q0MmNlZC4uMDY5MWI4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKaW5kZXggNGEwY2NlNC4uNjFjMDdjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw3OSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICogeChuLTIpTCAqLworICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwKiB4KG4pTCAgICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0tQjIqeShuLTIpTCAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluTCs9LUIxKnkobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAqIHgobilSICAgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0tQjIgKiB5KG4tMilSICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5SKz0tQjEgKiB5KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE1LDQgKzE4Nyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwppbmRleCAwNTJlMmEwLi5jZjE5ZTA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDgyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICApKSovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExICAqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgICogeChuKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyICAqIHkobi0yKVIgICkpKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSAgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNCw0ICsxODksNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggOGM3NDFlMS4uMjYxMWIxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCkBAIC0zNiw3ICszNiw4NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiApICovCisgICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNCw0ICsxOTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDRmMGNmNjcuLmMwMzE5YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKaW5kZXggNDU5MWVlMC4uNGQ5YmJmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IGZkODIxMmU0Li45NjBkZTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDk0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQogCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHRlbXBsLHRlbXBkOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKCBBMiAgKiB4KG4tMilMICApICovCisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPSAoIEExICAqIHgobi0xKUwgICkqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoIEEwICAqIHgobilMICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAgLyogeW5MKz0gKC1CMiAgKiB5KG4tMilMICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgtQjEgICogeShuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKCBBMiAgKiB4KG4tMilSICApICovCisgICAgICAgICAgICB5blIgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEExICAqIHgobi0xKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAgKiB4KG4pUiAgKSAqLworICAgICAgICAgICAgdGVtcGQgPSogKHBEYXRhSW4rMSk7CisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiB0ZW1wZDsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMiAgKiB5KG4tMilSICApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisgICAgICAgICAgICB5blIgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgtQjEgICogeShuLTEpUiAgKSAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0gKExWTV9GTE9BVCl5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSAoTFZNX0ZMT0FUKXluTDsgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW5SOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTIzLDQgKzIxMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDE3MDlmNzEuLmZmZjA1ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDI2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTYsNiArNzYsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QzMkYzMkMzMl9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3NDdhZjZhLi5jMGYwZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOSw0ICsyOSwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmluZGV4IDIwNDA0YWQuLmU0ODkwMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTU0LDUgKzU0LDM1IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29weV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKIAorICAgIGlmIChzcmMgPiBkc3QpCisgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNyYyArPSBuIC0gMTsKKyAgICAgICAgZHN0ICs9IG4gLSAxOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QtLTsKKyAgICAgICAgICAgIHNyYy0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKaW5kZXggYmY2OWUzNS4uZWE5ODA0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gQ09SRV9NSVhIQVJEXzJTVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7CiAKKyAgICBDdXJyZW50MVNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDEpOworICAgIEN1cnJlbnQyU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50Mik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAxID0gKnNyYzErKzsKKyAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7CisgICAgICAgIFRlbXAyID0gKnNyYzIrKzsKKyAgICAgICAgVGVtcDEgPSBUZW1wMiAqIEN1cnJlbnQyU2hvcnQ7CisgICAgICAgIFRlbXAyID0gKFRlbXAxIC8gMi4wZikgKyAoVGVtcDMgLyAyLjBmKTsKKyAgICAgICAgaWYgKFRlbXAyID4gMC41ZikKKyAgICAgICAgICAgIFRlbXAyID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDIgPCAtMC41ZiApCisgICAgICAgICAgICBUZW1wMiA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUZW1wMiA9IChUZW1wMiAqIDIpOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDI7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLApAQCAtNTUsNiArODUsNSBAQAogICAgICAgICAgICAgKmRzdCsrID0gVGVtcDI7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKaW5kZXggMzQ3MWYwNS4uMjgxNGYxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMjYsNiArMjYsNzAgQEAKICAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCAqLwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7CisgICAgTFZNX0ZMT0FUICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUICAgIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiAgICAgaWksamo7CisKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKCgxLjBmIC1wSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KXsKKyAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPShMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3ApeworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKworICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0peworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC04OSw2ICsxNTMsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCmluZGV4IDcwOWMzMDQuLjgxNGNjZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0yNSw3ICsyNSw3OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgVGVtcDEsVGVtcDI7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudFRpbWVzQWxwaGE7CiAKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldDsgLyogZmxvYXQgKiBmbG9hdCBpbiBmbG9hdCAqLworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCisgICAgeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3AgIT0gMCkKKyAgICB7CisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gKHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGEpOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtOTgsNiArMTcwLDUgQEAKICAgICAgICAgICAgIGRzdCsrOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggNDlmYTE4NC4uZDI2MWM5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0xOCw3ICsxOCw1MyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7CisgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CisgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChMZWZ0REMpOworICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgIExlZnREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgKz0gRENfRkxPQVRfU1RFUDsgfQorCisKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKFJpZ2h0REMpOworICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KKyAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgIFJpZ2h0REMgLT0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyArPSBEQ19GTE9BVF9TVEVQOyB9CisKKyAgICAgICAgfQorICAgICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyA9IExlZnREQzsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gUmlnaHREQzsKKworCisgICAgfQorI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTY0LDQgKzExMCw0IEBACiAKIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggNDY4YTg4ZC4uNGY0ZmNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMTcsMTEgKzE3LDE4IEBACiAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCit7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwLjBmOworICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDAuMGY7Cit9CisjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CiAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwOwogICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDA7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDg5YTRlNjguLmZhNmI3MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDExICsxOCwyMyBAQAogI2lmbmRlZiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogI2RlZmluZSBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGY7CisjZWxzZQogI2RlZmluZSBEQ19EMTZfU1RFUCAgICAgMHgyMDA7CisjZW5kaWYKIAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlXworeworICAgIExWTV9GTE9BVCAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLworICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KK31GaWx0ZXJfRkxPQVRfU3RhdGU7Cit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOworI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgIExWTV9JTlQzMiAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLwpAQCAtMzAsNSArNDIsNSBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2VuZGlmCiAjZW5kaWYgLyogX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCmluZGV4IDdlMzE4MmQuLmY1MDI3MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYwpAQCAtMzYsMTAgKzM2LDU1IEBACiAgICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OwogICAgIExWTV9JTlQxNiAgIHRlbXA7CiAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTGVmdCBjaGFubmVsICovCisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7CisgICAgICAgIE9mZnNldCsrOworICAgICAgICBzcmMrKzsKKworCisgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSAtIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZGVsYXksICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsICAgICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworeworICAgIExWTV9JTlQxNiAgIGk7CisgICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OworICAgIExWTV9GTE9BVCAgIHRlbXA7CisKICAgICBmb3IgKGk9MDsgaTxuOyBpKyspCiAgICAgewogICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpICsgKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCArIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKICAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAKQEAgLTQ5LDcgKzk0LDcgQEAKIAogCiAgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCAtIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKICAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKICAgICAgICAgZHN0Kys7CiAKQEAgLTY5LDUgKzExNCw1IEBACiAKICAgICByZXR1cm47CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBkZTc3MzYxLi4wMzljODhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTMxLDYgKzMxLDQ2IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNzEsNCArMTExLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCA5NjI1MmNjLi5iMjFiOGE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwyMiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKilwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTMsNiArNjksNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA1MTZjYTgzLi42ZmRiMDM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCmluZGV4IDBmMWQ1YmMuLjQxNmU4ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYwpAQCAtMzEsNyArMzEsNDcgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwsdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiAgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03MSw0ICsxMTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDEzNmU0ZjYuLmYzM2QyNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM3LDYgKzM3LDIzIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSAgICBwVGFwczsKKworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Miw2ICs2OSw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDk0YWQ0OGMuLmZkYjUyOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI5LDQgKzI5LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVF8KK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKaW5kZXggODM4ODA1MC4uMTkyOTI3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpAQCAtMzIsNyArMzIsOTIgQEAKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMSlSIGluIFExNSBmb3JtYXQKIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMSlSIGluIFEzMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgIHluTCx5blI7CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCAgIE5lZ1NhdFZhbHVlOworICAgICAgICBMVk1fSU5UMTYgICBpaTsKIAorICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvLyB5bkwgPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqKHBEYXRhSW4rMSkpOworCisKKyAgICAgICAgICAgIC8vIHluTCArPSAgKC1CMSAgKiB5KG4tMSlMICApCisgICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluTCArPSBUZW1wOworICAgICAgICAgICAgLy8geW5SICs9ICAoLUIxICAqIHkobi0xKVIgKSApCisgICAgICAgICAgICBUZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluUiArPSBUZW1wOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0geW5SOyAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5blIgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTEyNSw0ICsyMTAsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwppbmRleCBhMTljMzJjLi4zM2NhNmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCkBAIC01NSw2ICs3Miw3IEBACiAgIHRlbXA9cENvZWYtPlNoaWZ0OwogICBwQmlxdWFkU3RhdGUtPlNoaWZ0ID0gdGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNDY0MDc0My4uMzY4YmZjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTIwLDYgKzIwLDE1IEBACiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgICBMVk1fRkxPQVQgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfRmxvYXRfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX0Zsb2F0X1N0YXRlICogUEZpbHRlcl9GbG9hdF9TdGF0ZSA7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICAgICAqcERlbGF5czsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KQEAgLTI4LDUgKzM3LDUgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KKyNlbmRpZgogI2VuZGlmIC8qIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAppbmRleCA0ZDMyZGYxLi5iMWZkZTBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCkBAIC0zNCw2ICszNCw3IEBACiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExLCBBMiwgQjEgYW5kIEIyIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAgICAgTFZNX0lOVDE2ICAgQTA7CkBAIC00MywxMiArNDQsMjIgQEAKICAgICAgICAgTFZNX0lOVDE2ICAgQjI7CiAgICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDEyQjEyQ29lZnNTUF90OwotCi0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEEwOworICAgIExWTV9GTE9BVCAgIEExOworICAgIExWTV9GTE9BVCAgIEEyOworICAgIExWTV9GTE9BVCAgIEIxOworICAgIExWTV9GTE9BVCAgIEIyOworICAgIExWTV9VSU5UMTYgIFNjYWxlOworfSBCaXF1YWRBMDEyQjEyQ29lZnNTUF90OworI2VuZGlmCiAvKgogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSBhbmQgQjEgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgICAgICBMVk1fSU5UMTYgICBBMDsKQEAgLTU2LDggKzY3LDE1IEBACiAgICAgICAgIExWTV9JTlQxNiAgIEIxOwogICAgICAgICBMVk1fVUlOVDE2ICBTY2FsZTsKIH0gQmlxdWFkQTAxQjFDb2Vmc1NQX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQTA7CisgICAgTFZNX0ZMT0FUICAgQTE7CisgICAgTFZNX0ZMT0FUICAgQjE7CisgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMUIxQ29lZnNTUF90OworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCmluZGV4IDc5NzVlOGIuLjJjNmU2YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKQEAgLTUzLDUgKzUzLDM0IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9NU19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9GTE9BVCB0ZW1wMSxsZWZ0LHJpZ2h0OworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGxlZnQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOwogCisgICAgICAgIHJpZ2h0ID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQgKyByaWdodCkgLyAyLjBmOworICAgICAgICAqZHN0TSA9IChMVk1fRkxPQVQpdGVtcDE7CisgICAgICAgIGRzdE0rKzsKKworICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQgLSByaWdodCkgLyAyLjBmOworICAgICAgICAqZHN0UyA9IChMVk1fRkxPQVQpdGVtcDE7CisgICAgICAgIGRzdFMrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwppbmRleCA4YmIyOTJmLi5hYzFlZWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwpAQCAtNDYsNSArNDYsMjcgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgqc3JjKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSBUZW1wIC8gMi4wZjsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCmluZGV4IDliOTM4YmQuLmViYzQ3N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYwpAQCAtNDksNiArNDksMzEgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBKb2luVG8yaV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICpzcmNMLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgc3JjTCArPSBuIC0gMTsKKyAgICBzcmNSICs9IG4gLSAxOworICAgIGRzdCAgKz0gKCgyICogbikgLSAxKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKaW5kZXggM2QzOWI5My4uZWI1NzU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMjcsNyArMjcsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CiAKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UyLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICB9CisKKworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKQEAgLTY2LDQgKzk4LDUgQEAKIAogCiB9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCmluZGV4IDJkYWY3NGEuLmVjMGJhYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKQEAgLTI0LDcgKzI0LDM3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWEhBUkRfMlNUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBDdXJyZW50MTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDI7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CiAKKworICAgIEN1cnJlbnQxID0gKHBJbnN0YW5jZTEtPkN1cnJlbnQpOworICAgIEN1cnJlbnQyID0gKHBJbnN0YW5jZTItPkN1cnJlbnQpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wID0gKCgoTFZNX0ZMT0FUKSooc3JjMSsrKSAqIChMVk1fRkxPQVQpQ3VycmVudDEpKSArCisgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpKihzcmMyKyspICogKExWTV9GTE9BVClDdXJyZW50MikpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKQEAgLTU0LDYgKzg0LDUgQEAKICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCmluZGV4IGNhYTA5NTEuLmQyNjk0Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsOTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKIAorICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQgPCBUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCkBAIC0xMjMsNiArMjEyLDUgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwppbmRleCAwOWVjNDI3Li42NTZhMTE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0yNiw3ICsyNiwxMjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorc3RhdGljIExWTV9GTE9BVCBBREQyX1NBVF9GTE9BVChMVk1fRkxPQVQgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBjKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIHRlbXAgPSBhICsgYiA7CisgICAgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgYyA9IC0xLjBmOworICAgIGVsc2UgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICBjID0gMS4wZjsKKyAgICBlbHNlCisgICAgICAgIGMgPSB0ZW1wOworICAgIHJldHVybiBjOworfQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VMID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VSID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBMVk1fRkxPQVQgICBEZWx0YUwgPSBwSW5zdGFuY2VMLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50TCA9IHBJbnN0YW5jZUwtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0TCA9IHBJbnN0YW5jZUwtPlRhcmdldDsKKworICAgIExWTV9GTE9BVCAgIERlbHRhUiA9IHBJbnN0YW5jZVItPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnRSID0gcEluc3RhbmNlUi0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRSID0gcEluc3RhbmNlUi0+VGFyZ2V0OworCisgICAgTFZNX0ZMT0FUICAgVGVtcCA9IDA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYgKE91dExvb3ApCisgICAgeworICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3AgKiAyOyBpaSAhPSAwOyBpaSAtPSAyKQorICAgICAgICB7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3AgKiAyOyBpaSAhPSAwOyBpaS09MikKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOworICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgIH0KKyAgICBwSW5zdGFuY2VMLT5DdXJyZW50ID0gQ3VycmVudEw7CisgICAgcEluc3RhbmNlUi0+Q3VycmVudCA9IEN1cnJlbnRSOworCit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLApAQCAtMTQwLDQgKzI2MCw1IEBACiAgICAgcEluc3RhbmNlUi0+Q3VycmVudD1DdXJyZW50UjsKIAogfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwppbmRleCBmMWE5Y2EzLi5iNWU3ZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCkBAIC0yNiw3ICsyNiw4NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YT0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKIAorICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZihDdXJyZW50PFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCkBAIC0xMDEsNiArMTgwLDUgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggMDA1MmRkNy4uMTkyZjEyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTMzLDcgKzMzLDgwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xMDgsNSArMTgxLDUgQEAKICAgICB9CiAKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCmluZGV4IGY0NDNjOGYuLmJkNWE5MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsMTM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UxLT5EZWx0YSA9PSAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZTItPkRlbHRhID09IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpCisgICAgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSAxLjBmKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IDEuMGYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTQ4LDUgKzI3OSw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCBjOGRjYWQ3Li4xMDE3ZGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTMzLDcgKzMzLDc3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKKyAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOworICAgICAgICAgICAgZWxzZSBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTEwNyw1ICsxNzcsNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggNzI0MDcwNS4uM2M5MDA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNSw3ICsyNSw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpzcmMyLApAQCAtNjYsNSArMTA4LDUgQEAKICAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQotCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggOTgwYzc4My4uZjkwNDkxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTMxLDYgKzMxLDE5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogTFZNaXhlcjNfc3Qgc3RydWN0dXJlIHN0b3JlcyBJbnN0YW5jZSBwYXJhbWV0ZXJzIGZvciBvbmUgYXVkaW8gc3RyZWFtICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgICAgIFByaXZhdGVQYXJhbXNbM107ICAgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gc2hpZnQgcGFyYW1ldGVyICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrU2V0OyAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgICAgICBDYWxsYmFja1BhcmFtOyAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAqcENhbGxiYWNrSGFuZGxlOyAgIC8qIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayAgICBwQ2FsbEJhY2s7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit9IExWTWl4ZXIzX0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICAgICAgIFByaXZhdGVQYXJhbXNbNF07ICAgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIEF1ZGlvIFN0cmVhbSAqLwpAQCAtNDAsMjIgKzUzLDM1IEBACiAgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCiAgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIH0gTFZNaXhlcjNfc3Q7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICBNaXhlclN0cmVhbVsxXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCit9IExWTWl4ZXIzXzFTdF9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsxXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCiB9IExWTWl4ZXIzXzFTdF9zdDsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit9IExWTWl4ZXIzXzJTdF9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsyXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0d28gQXVkaW8gU3RyZWFtcyAqLwogfSBMVk1peGVyM18yU3Rfc3Q7Ci0KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bM107ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdGhyZWUgQXVkaW8gU3RyZWFtcyAqLwogfSBMVk1peGVyM18zU3Rfc3Q7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKEhJR0ggTEVWRUwgRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NSw1NyArMTAxLDExNSBAQAogLyogdGhlbiB0aGUgY2FsY3VsYXRpb24gd2lsbCBnaXZlIGFuIGluY29ycmVjdCB2YWx1ZSBmb3IgYWxwaGEsIHNlZSB0aGUgbWl4ZXIgICAgICovCiAvKiBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgIFRhcmdldEdhaW4pOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2Fpbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOworI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2Fpbik7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50R2Fpbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2VuZGlmCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzBdIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMV0gYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKaW5kZXggYjVhZTI2NC4uNTk5MDQxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCkBAIC0zMSw3ICszMSwxNSBAQAogLyogIEN1cnJlbnRHYWluICAgICAgLSBDdXJyZW50R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIEN1cnJlbnRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBDdXJyZW50R2FpbiA9IHBJbnN0YW5jZS0+Q3VycmVudDsgIC8vIEN1cnJlbnRHYWluCisgICAgcmV0dXJuIEN1cnJlbnRHYWluOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCiB7CiAgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOwpAQCAtMzksMyArNDcsNCBAQAogICAgIEN1cnJlbnRHYWluPXBJbnN0YW5jZS0+Q3VycmVudD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gQ3VycmVudEdhaW4gaW4gUTE2LjE1IGZvcm1hdAogICAgIHJldHVybiBDdXJyZW50R2FpbjsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGRjMmY4ZTkuLmM2NzQ1NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTMwLDcgKzMwLDE2IEBACiAvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9GTE9BVCAgICAgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICAKKyAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCisgICAgcmV0dXJuIFRhcmdldEdhaW47Cit9CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQogewogICAgIExWTV9JTlQzMiAgICAgICBUYXJnZXRHYWluOwpAQCAtNDAsMyArNDksNCBAQAogCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCmluZGV4IDQ0OWU3YjEuLjczN2UyNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYwpAQCAtNDQsNyArNDQsMTkgQEAKIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgVGFyZ2V0R2FpbiwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudEdhaW4pCit7CisgICAgTFZNX0ZMT0FUIE1heEdhaW4gPSBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIGlmKEN1cnJlbnRHYWluID4gTWF4R2FpbikKKyAgICAgICAgTWF4R2FpbiA9IEN1cnJlbnRHYWluOworICAgIHBJbnN0YW5jZS0+VGFyZ2V0ID0gVGFyZ2V0R2FpbjsgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnRHYWluOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKQpAQCAtNjQsNCArNzYsNCBAQAogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50R2Fpbjw8KDE2LVNoaWZ0KTsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CiAgICAgcEluc3RhbmNlLT5TaGlmdD1TaGlmdDsgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCAyOTRlMDVjLi5kMGQwZTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTI2LDYgKzI2LDE1IEBACiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCiAvKiBJbnN0YW5jZSBwYXJhbWV0ZXIgc3RydWN0dXJlICovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OyAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBUYXJnZXQgR2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudDsgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLworfSBNaXhfUHJpdmF0ZV9GTE9BVF9zdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIEdlbmVyYWwgKi8KQEAgLTM0LDggKzQzLDcgQEAKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgZm9yIEludGVnZXIgcGFydCBvZiBHYWluICovCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGZyYWN0aW9uYWwgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLwogfSBNaXhfUHJpdmF0ZV9zdDsKLQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklOSVRJT05TCkBAIC00OSwyMyArNTcsNDMgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwSW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTczLDEyICsxMDEsMTkgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODYsMTYgKzEyMSwyMiBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwotCi0KKyNlbmRpZgogCiAvKioqIDMyIGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTExMiw3ICsxNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfUFJJVkFURV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYwppbmRleCA1ZWZhNTAxLi41NzcxNzlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCkBAIC00Myw3ICs0MywxNCBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICBUYXJnZXRHYWluKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIHBJbnN0YW5jZS0+VGFyZ2V0ID0gVGFyZ2V0R2FpbjsgICAgICAgICAgICAgICAvLyBVcGRhdGUgZ2FpbiBUYXJnZXQKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pCiB7CkBAIC02NCwzICs3MSw0IEBACiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKICAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNGMxYzhiMi4uNDhmNWQ1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNDQsNyArNDQsNTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworI2lmZGVmIEhJR0hFUl9GUworICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjdmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KKyNlbmRpZgogCisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CisgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CisKKyAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKKyAgICBlbHNlCisgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKKworICAgIGlmKERlbHRhID09IDApCisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCkBAIC03MywzICsxMTcsNCBAQAogCiAgICAgcEluc3RhbmNlLT5EZWx0YT1EZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpIGluIFEgMC4zMSBmb3JtYXQKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDhkNTMwNGUuLjlkYzdkMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTQ1LDcgKzQ1LDcyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisjaWZkZWYgSElHSEVSX0ZTCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KKyNlbHNlCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVs5XSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZn07Lyo0ODAwMCovCisjZW5kaWYKKyAgICBMVk1fRkxPQVQgVGNfbWlsbGlzZWNfZmxvYXQ7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CiAKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldDsKKworICAgIERlbHRhPURlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIC8qICBHZXQgZ2FpbiB2YWx1ZXMgICovCisgICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKworICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkKKyAgICB7CisgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gKExWTV9GTE9BVCkoVGNfbWlsbGlzZWMpIC8gKEN1cnJlbnQgLSBUYXJnZXQpOworICAgICAgICBpZiAoVGNfbWlsbGlzZWNfZmxvYXQgPCAwKQorICAgICAgICAgICAgVGNfbWlsbGlzZWNfZmxvYXQgPSAtVGNfbWlsbGlzZWNfZmxvYXQ7CisKKyAgICAgICAgaWYoVGNfbWlsbGlzZWMgPT0gMCkKKyAgICAgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWNfZmxvYXQ7CisKKyAgICAgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogTWluaW11bSB2YWx1ZSBmb3IgcHJvcGVyIGNhbGwtYmFja3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0dGluZyBpdCB0byB6ZXJvIGhhcyBzb21lIHByb2JsZW1zLCB0byBiZSBjb3JyZWN0ZWQpICovCisgICAgfQorCisgICAgcEluc3RhbmNlLT5EZWx0YSA9IERlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykKK30KKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKQEAgLTkzLDMgKzE1OCw0IEBACiAKICAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKaW5kZXggNmQ4ZmU0Ni4uOTA5NDYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogICBBOSAgICAgICAgICAgICAxOTQ2Njk1NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEwICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4LDcgKzY4LDM2IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOwogCisgICAgcENvZWZmcy0+QjEgPSAtWTsgICAgICAgICAvKiBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxISovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQTA9KDEtQjEpLzI9IEIxLzIgLSAwLjUqLworICAgIFkgPSBZIC8gMi4wZjsgICAgICAgICAgICAgICAgIC8qIEEwPVk9QjEvMiovCisgICAgWSA9IFkgLSAwLjVmOyAgICAgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KKworICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisKKyAgICByZXR1cm4gMTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX0ZPX0hQRiggICBMVk1fSU5UMzIgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcykKIHsKQEAgLTk3LDQgKzEyNiw0IEBACiAKICAgICByZXR1cm4gMTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKaW5kZXggODZlYzk1MS4uOWZlNjdmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogICBBOSAgICAgICAgICAgICAxOTQ2Njk1NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEwICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4LDcgKzY4LDMzIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fRk9fTFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKKyAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41CisgICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZID0gWSArIDAuNWY7ICAgICAvLyBBMD1ZPShCMS8yICsgMC41KQogCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7CisgICAgcENvZWZmcy0+QTEgPSBwQ29lZmZzLT5BMDsKKworICAgIHJldHVybiAxOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fRk9fTFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQogewpAQCAtOTQsNCArMTIwLDQgQEAKICAgICBwQ29lZmZzLT5BMT1wQ29lZmZzLT5BMDsKICAgICByZXR1cm4gMTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IGYzYjliM2MuLjc4NDZjYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC0zMiwxNiArMzIsNDUgQEAKICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDEgICAgMTIgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgOGtIeiwgMTEuMDI1a0h6IGFuZCAxMmtIeiBpLmUuIDEyPTQxLTI5ICovCiAjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQyICAgIDEzICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDE2a0h6LCAyMi4wNTBrSHogYW5kIDI0a0h6IGkuZS4gMTM9NDItMjkgKi8KICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDMgICAgMTQgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMzJrSHosIDQ0LjFrSHogYW5kIDQ4a0h6IGkuZS4gMTQ9NDMtMjkgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMCAsIC8qIDhrSHogaW4gUTQxLCAxNmtIeiBpbiBRNDIsIDMya0h6IGluIFE0MyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMTAyNSwgIC8qIDExMDI1IEh6IGluIFE0MSwgMjIwNTBIeiBpbiBRNDIsIDQ0MTAwIEh6IGluIFE0MyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwfTsgLyogMTJrSHogaW4gUTQxLCAyNGtIeiBpbiBRNDIsIDQ4a0h6IGluIFE0MyAqLwotCisjZW5kaWYKIAogY29uc3QgTFZNX0lOVDMyICAgICBMVlZETF8yUGlPbkZzU2hpZnRUYWJsZVtdPXtMVlZETF8yUGlCeUZzX1NISUZUMSAsICAgICAgICAgLyogOGtIeiwgMTEwMjVIeiwgMTJrSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDIsICAgICAgICAgIC8qIDE2a0h6LCAyMjA1MEh6LCAyNGtIeiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5RnNfU0hJRlQzfTsgICAgICAgICAvKiAzMmtIeiwgNDQxMDBIeiwgNDhrSHogKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgICAgICAgIDAuMDAwNzg1Mzk4ZgorI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNV9mICAgICAgIDAuMDAwNTY5OTAzZgorI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMF9mICAgICAgIDAuMDAwNTIzNTk5ZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNjAwMF9mICAgICAgIDAuMDAwMzkyNzAwZgorI2RlZmluZSBMVlZETF8yUGlCeV8yMjA1MF9mICAgICAgIDAuMDAwMjg0OTUyZgorI2RlZmluZSBMVlZETF8yUGlCeV8yNDAwMF9mICAgICAgIDAuMDAwMjYxODAwZgorI2RlZmluZSBMVlZETF8yUGlCeV8zMjAwMF9mICAgICAgIDAuMDAwMTk2MzUwZgorI2RlZmluZSBMVlZETF8yUGlCeV80NDEwMF9mICAgICAgIDAuMDAwMTQyNDc2ZgorI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgogCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWVkRMXzJQaUJ5Xzk2MDAwX2YgICAgICAgMC4wMDAwNjU0NTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE5MjAwMF9mICAgICAgMC4wMDAwMzI3MjVmCisjZW5kaWYKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1X2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTYwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yNDAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMzIwMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIExWTV9HZXRPbWVnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTksNyArODgsMjAgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgSElHSEVSX0ZTCitMVk1fRkxPQVQgTFZNX0dldE9tZWdhKExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBGYywKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQorI2Vsc2UKK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCisjZW5kaWYKK3sKKyAgICBMVk1fRkxPQVQgICB3OworICAgIHcgPSAoTFZNX0ZMT0FUKUZjICogTFZWRExfMlBpT25Gc1RhYmxlW0ZzXTsKKyAgICByZXR1cm4gdzsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGYywKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQogewpAQCAtNjcsNCArMTA5LDQgQEAKICAgICBNVUwzMngzMklOVE8zMigoTFZNX0lOVDMyKUZjLExWVkRMXzJQaU9uRnNUYWJsZVtGcyUzXSx3LExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW0ZzLzNdKQogICAgIHJldHVybiB3OwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaAppbmRleCA2ODQ2ZDQ5Li5mMWU0NWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCkBAIC04Nyw1ICs4Nyw1OCBAQAogI2RlZmluZSBBTFBIQV80OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KICNkZWZpbmUgQUxQSEFfNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCAqLworI2RlZmluZSBBTFBIQV9GbG9hdF8wICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTkyZgorI2RlZmluZSBBTFBIQV9GbG9hdF82ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzcgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk4NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTc5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF85ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEwICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk1N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5MTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEzICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTg3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTk3NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE2ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTY1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTcgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NTE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOCAgICAgICAgICAgICAgICAgICAgICAgMC45OTkzMTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE5ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTAzM2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NjMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMSAgICAgICAgICAgICAgICAgICAgICAgMC45OTgwNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NzI2OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjMgICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNCAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ1NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI1ICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjI5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjYgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5MTIzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNyAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI4ICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODM3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjkgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5NTUzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMCAgICAgICAgICAgICAgICAgICAgICAgMC45NTcyMjFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMxICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDA1MWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzIgICAgICAgICAgICAgICAgICAgICAgIDAuOTE2Mjk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMyAgICAgICAgICAgICAgICAgICAgICAgMC44ODM3MjlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM0ICAgICAgICAgICAgICAgICAgICAgICAwLjgzOTY0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzUgICAgICAgICAgICAgICAgICAgICAgIDAuNzgxMDM2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNiAgICAgICAgICAgICAgICAgICAgICAgMC43MDUwNzhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM3ICAgICAgICAgICAgICAgICAgICAgICAwLjYxMDEwOGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzggICAgICAgICAgICAgICAgICAgICAgIDAuNDk3MjM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOSAgICAgICAgICAgICAgICAgICAgICAgMC4zNzIzNDNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQwICAgICAgICAgICAgICAgICAgICAgICAwLjI0NzM1MWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDEgICAgICAgICAgICAgICAgICAgICAgIDAuMTM4NzIyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MiAgICAgICAgICAgICAgICAgICAgICAgMC4wNjEyMzRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQzICAgICAgICAgICAgICAgICAgICAgICAwLjAxOTI2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDQgICAgICAgICAgICAgICAgICAgICAgIDAuMDAzNzU2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNzJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ2ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDcgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ5ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCmluZGV4IDgwOWQ5MDQuLjE4YjI3ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKQEAgLTU3LDcgKzU3LDExMCBAQAogLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCit7CiAKKyAgICBMVk1fVUlOVDMyICBQcm9kdWN0OworICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OworICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7CisgICAgTFZNX1VJTlQxNiAgU2hpZnQ7CisgICAgTFZNX0ZMT0FUICAgRGlmZjsKKyAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdGhlIHRpbWUgY29uc3RhbnQgYW5kIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIFByb2R1Y3QgPSAoKHRjID4+IDE2KSAqIChMVk1fVUlOVDMyKUZzKSA8PCAxMzsgIC8qIFN0ZXJlbyB2YWx1ZSAqLworICAgIFByb2R1Y3QgPSBQcm9kdWN0ICsgKCgodGMgJiAweDAwMDBGRkZGKSAqIChMVk1fVUlOVDMyKUZzKSA+PiAzKTsKKworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPj4gMTsgICAvKiBNb25vIHZhbHVlICovCisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIGdldCB0aGUgdGFibGUgaW5kZXggYW5kIGludGVycG9sYXRpb24gZmFjdG9yICovCisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChQcm9kdWN0ICYgMHg4MDAwMDAwMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOworICAgIH0KKyAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOworCisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCisgICAgeworICAgICAgICBTaGlmdCsrOworICAgIH0KKworICAgIEludGVycG9sYXRlU2hvcnQgPSAoTFZNX0lOVDE2KSgoUHJvZHVjdCA+PiAxNSkgJiAweDAwMDA3RkZGKTsKKyAgICBJbnRlcnBvbGF0ZSA9IChMVk1fRkxPQVQpSW50ZXJwb2xhdGVTaG9ydCAvIDMyNzY4LjBmOworCisgICAgRGlmZiA9IChUYWJsZVtTaGlmdF0gLSBUYWJsZVtTaGlmdCArIDFdKTsKKyAgICBEaWZmID0gRGlmZiAqIEludGVycG9sYXRlOworICAgIFByb2R1Y3RGbG9hdCA9IFRhYmxlW1NoaWZ0ICsgMV0gKyBEaWZmOworCisgICAgcmV0dXJuIFByb2R1Y3RGbG9hdDsKK30KKyNlbHNlCiBMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCkBAIC0xNTQsMyArMjU3LDQgQEAKIAogICAgIHJldHVybiBQcm9kdWN0OwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwppbmRleCBhNmQ3ZGIyLi5jZDU3NzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKQEAgLTI1LDcgKzI1LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLCAgICAgICAgICAgICAgICAgICovCkBAIC00MCw3ICs0MCw0OCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgWCkKK3sKKyAgICBMVk1fSU5UMzIgaTsKKyAgICBMVk1fRkxPQVQgWSxBLFhUZW1wLFRlbXAsc2lnbjsKIAorICAgIFkgPSAqcENvZWZmaWNpZW50czsgLyogWT1BMCovCisgICAgcENvZWZmaWNpZW50cysrOworCisgICAgaWYoWCA9PSAtMS4wZikKKyAgICB7CisgICAgICAgIFRlbXAgPSAtMTsKKyAgICAgICAgc2lnbiA9IFRlbXA7CisgICAgICAgIGZvcihpID0gMTsgaSA8PSBOOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFkgKz0gKCgqcENvZWZmaWNpZW50cykgKiBzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24gKj0gVGVtcDsKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgWFRlbXAgPSBYOworICAgICAgICBmb3IoaSA9IE4tMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEEgPSAqcENvZWZmaWNpZW50czsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgICAgICAgICAgVGVtcCA9IEEgKiBYVGVtcDsKKyAgICAgICAgICAgIFkgKz0gVGVtcDsKKworICAgICAgICAgICAgVGVtcCA9IFhUZW1wICogWDsKKyAgICAgICAgICAgIFhUZW1wID0gVGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAqcENvZWZmaWNpZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgWCkKQEAgLTkzLDQgKzEzNCw0IEBACiAgICAgfQogICAgIHJldHVybiBZOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCmluZGV4IDZjYTEwNzcuLjg3ODU1OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYwpAQCAtNDQsNyArNDQsNyBAQAogLyogICBBMTEgICAgICAgICAgICA1MDQ3NzI0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgQTEyICAgICAgICAgICAgLTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU0LDcgKzU0LDI4IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKExWTV9GTE9BVCAgICAgWCkKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdPXswLjk5OTkwNmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMDI0NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjUyNzY1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAzNTQ5NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNjU2NjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM3Njc2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIxMzE5MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNjk2MDNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NTUzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDM3M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE4MTdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzY3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTExLAorICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgWCk7CisgICAgcmV0dXJuIFk7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb3dlcjEwKExWTV9JTlQzMiAgICAgWCkKIHsKICAgICBMVk1fSU5UMzIgWSxDb2VmZmljaWVudHNbMTNdPXsgIDE2Nzc1NjM2LApAQCAtNzUsNCArOTYsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgWCk7CiAgICAgcmV0dXJuIFk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwppbmRleCAyZjFlNTkxLi45ZTE0YzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwpAQCAtMjQsNyArMjQsMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMb2FkQ29uc3RfMzIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExvYWRDb25zdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gdmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZWxzZQogdm9pZCBMb2FkQ29uc3RfMzIoY29uc3QgTFZNX0lOVDMyICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQpAQCAtMzksNSArNTQsNiBAQAogCiAgICAgcmV0dXJuOwogfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCmluZGV4IDI2Mjk3ZTcuLjAyYzkwNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKQEAgLTc3LDQgKzc3LDU4IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTVNUbzJpX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAsbVZhbCxzVmFsOworICAgIExWTV9JTlQxNiBpaTsKKworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBtVmFsID0gKExWTV9GTE9BVCkqc3JjTTsKKyAgICAgICAgc3JjTSsrOworCisgICAgICAgIHNWYWwgPSAoTFZNX0ZMT0FUKSpzcmNTOworICAgICAgICBzcmNTKys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgKyBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworCisgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKaW5kZXggZjI4ZjM2Ni4uZTNmYjQwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKQEAgLTY0LDcgKzY0LDQ0IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBzcmN2YWw7CisgICAgTFZNX0ZMT0FUIFRlbXAsZEluVmFsOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBzcmN2YWwgPSAqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wID0gc3JjdmFsICogdmFsOworCisgICAgICAgIGRJblZhbCAgPSAoTFZNX0ZMT0FUKSpkc3Q7CisgICAgICAgIFRlbXAgPSBUZW1wICsgZEluVmFsOworCisgICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKaW5kZXggNzNjMjZlZC4uMTZlMzY3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0zMiw3ICszMiw3MSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIEluIGNhc2UgdGhlIGNvcmUgZnVuY3Rpb24gd291bGQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENhbGwgYmFjayBiZWZvcmUgdGhlIGhhcmQgbWl4aW5nLCBiZWNhdXNlIGluIHRoaXMgY2FzZSwgaGFyZCBtaXhpbmcgbWFrZXMKKyAgICAgICB1c2Ugb2YgdGhlIGNvcmUgc29mdCBtaXggZnVuY3Rpb24gd2hpY2ggY2FuIGNoYW5nZSB0aGUgQ3VycmVudCB2YWx1ZSEgICAgICAqLworCisgICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX3QgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgKmRzdCwKQEAgLTkxLDUgKzE1NSw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKaW5kZXggY2E4OGIwNC4uODY5MjkzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpAQCAtMzQsNyArMzQsNjggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgcEluc3RhbmNlLT5DdXJyZW50LCBkc3QsIG4pOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpeworICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTkxLDUgKzE1Miw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKaW5kZXggMmUwYTA5OS4uNmZjMWI5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwpAQCAtMjYsNyArMjYsNDQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhTT0ZUXzJTVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQorewogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCisgICAgeworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KilwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIE1peEluU29mdF9EMzJDMzFfU0FUKCh2b2lkICopJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50MSA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgodm9pZCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAocEluc3RhbmNlLT5DdXJyZW50MiA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopIHBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCkBAIC02MSw1ICs5OCw2IEBACiAgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAppbmRleCA2MDcwNzNjLi4wMGQ1NWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCkBAIC0yNiw2ICsyNiwxMCBAQAogCiAjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCIDI0NzM4MDUgLyogMC4wMSBkQiBvbiBhIGZ1bGwgc2NhbGUgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKaW5kZXggYzA5ZWMwZi4uNzk2YTE1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCkBAIC00NSw1ICs0NSwyNiBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgc3JjICs9IChuIC0gMSk7CisgICAgZHN0ICs9ICgobiAqIDIpIC0gMSk7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyYy0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCmluZGV4IGE1ZGM1MGYuLmM3NTg1NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jCkBAIC00Nyw1ICs0NywyMyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE11bHQzc19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKKyAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIHRlbXA7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7CisgICAgICAgIHNyYysrOworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwppbmRleCA3MzM0M2NkLi41MTU2ZWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKQEAgLTExNCw0ICsxMTQsNTQgQEAKICAgICB9CiAKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCit7CiAKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgIFRlbXA7CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObyA8IEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOworICAgICAgICBwRGF0YUluKys7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCisgICAgICAgICAqIGdhaW4gZmFjdG9yCisgICAgICAgICAqLworICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKChTYW1wbGUgKiBTYW1wbGUpKTsKKyAgICAgICAgICAgIGlmKFNhbXBsZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOworICAgICAgICBwRGF0YU91dCsrOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggYzhjMTUyNy4uOWMxN2EwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCkBAIC0zOCw2ICszOCw4OCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx5blIseW5MTyx5blJPLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKEEwICAqICh4KG4pTCAtIHgobi0yKUwgICkgKSovCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICB5bkwgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkpICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxICogeShuLTEpTCAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAqIHluTCApKSAqLworICAgICAgICAgICAgeW5MTyA9IHluTCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluTE89KCB5bkxPICsgeChuKUwgICkqLworICAgICAgICAgICAgeW5MTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAgKiAoeChuKVIgIC0geChuLTIpUiAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9ICgqKHBEYXRhSW4gKyAxKSkgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICB5blIgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIyICAqIHkobi0yKVIgICkgKSAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgICogeShuLTEpUiAgKSApICAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5STz0gKChHYWluICAqIHluUiApKSAqLworICAgICAgICAgICAgeW5STyA9IHluUiAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUk89KCB5blJPICsgeChuKVIgICkqLworICAgICAgICAgICAgeW5STyArPSAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IHluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExOCw0ICsyMDAsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggNjdhNTcwYi4uZjcwNWNiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCkBAIC0zOCw2ICszOCw3IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTYsNCArMTE3LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCAxZDYxNDJjLi42NTQ3NWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC0zNSw0ICszNSw0IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7CiAKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggYjlmNjRlNi4uYTM2MzMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMTcsNyArMTcsMjMgQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwogCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHBDb2VmLT5HOworfQorI2Vsc2UKIHZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC0zNCw0ICs1MCw0IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7CiAKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZTIwNTBlMC4uMWUzMjA2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjEsNiArMjEsMTYgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLworCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRmxvYXRfCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GbG9hdCA7CisjZW5kaWYKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKaW5kZXggODM2MzI3MC4uMjhmZWE2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCkBAIC0yNCw3ICsyNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIFNoaWZ0X1NhdF92MTZ4djE2IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICpkc3QsCkBAIC03Nyw1ICs3Nyw1IEBACiAgICAgfQogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCmluZGV4IGZiZDEzMmUuLmZhYzlkZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYwpAQCAtMjQsNyArMjQsNjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjMyeHYzMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworICAgIExWTV9GTE9BVCAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgaWksaWo7CisgICAgTFZNX0lOVDE2ICAgUlNoaWZ0OwogCisgICAgaWYodmFsID4gMCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IHZhbDsgaWorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAqIDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRlbXAgPiAxLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IDEuMDsKKyAgICAgICAgICAgIGlmKHRlbXAgPCAtMS4wKQorICAgICAgICAgICAgICAgIHRlbXAgPSAtMS4wOworCisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZih2YWwgPCAwKQorICAgIHsKKyAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworCisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IFJTaGlmdDsgaWorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorI2Vsc2UKIHZvaWQgU2hpZnRfU2F0X3YzMnh2MzIgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMzIgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgKmRzdCwKQEAgLTc5LDUgKzEzNCw1IEBACiAgICAgfQogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCmluZGV4IGFjMDM0M2YuLjlhNzI2ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYwpAQCAtMjksNiArMjksOSBAQAogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiAKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjQsNiArNjcsMTggQEAKICNkZWZpbmUgU0VDT05EX0NPRUYgICAgICAzODgzNgogI2RlZmluZSBNQVhfVkFMVUUgICAgICAgIDE1MzYgICAgICAgICAgICAgICAgICAgLyogOTYgKiAxNiAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCAgIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0ZMT0FUICAgIGRCX0Zsb2F0OworICAgIExWTV9GTE9BVCAgICBMaW5GbG9hdDsKKworICAgIGRCX0Zsb2F0ID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVClkYl9maXggLyAxNi4wZik7CisgICAgTGluRmxvYXQgPSBwb3coMTAsIGRCX0Zsb2F0IC8gMjAuMCk7CisKKyAgICByZXR1cm4gTGluRmxvYXQ7Cit9CisjZWxzZQogTFZNX0lOVDMyICAgZEJfdG9fTGluMzIoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKIHsKICAgICBMVk1fSU5UMzIgTGluX3ZhbF8zMjsKQEAgLTEwNiw0ICsxMjEsNCBAQAogCiAgICAgcmV0dXJuIExpbl92YWxfMzI7ICAvKiBmb3JtYXQgMS4xNi4xNSAqLwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IGRiNmFhYmUuLjhlMGI3MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMjAwLDYgKzIwMCwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzMyMDAwICAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgMTAyNAorI2VuZGlmCiAKIHR5cGVkZWYgZW51bQogewpAQCAtMjEyLDYgKzIxNiwxMCBAQAogICAgIExWRVFOQl9GU18zMjAwMCA9IDYsCiAgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKICAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAorI2lmZGVmIEhJR0hFUl9GUworICAgIExWRVFOQl9GU185NjAwMCA9IDksCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CiAKQEAgLTI2OCw2ICsyNzYsNyBAQAogewogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCYW5kczsKQEAgLTQ2MCwxMSArNDY5LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwppbmRleCBmZGRlZGI5Li5mZjUyYjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKQEAgLTIyLDcgKzIyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03Nyw2ICs3OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKQpAQCAtMTY4LDcgKzE3MSw3IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwNSw3ICsyMDgsNjcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAqcENvZWZmaWNpZW50cykKK3sKIAorICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW107CisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbiAgICAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKKyAgICAvKiBBcyBtZW50aW9uZWQgaW4gZWZmZWN0YnVuZGxlLmggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFFGYWN0b3IgICAgID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKKworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVkVRTkJfVHdvUGlPbkZzVGFibGVbRnNdOyAgICAgICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgaWYgKEdhaW4gPj0gMCkKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlWzE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgICAgICAgICAgICBpZiBHYWluZEIgPj0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVtHYWluICsgMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMixCMSxBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMiA9IC0wLjUgKiAoMiAqIFFGYWN0b3IgLSBEICogVDApIC8gKDIgKiBRRmFjdG9yICsgRCAqIFQwKTsKKyAgICBCMSA9ICgwLjUgLSBCMikgKiBjb3MoVDApOworICAgIEEwID0gKDAuNSArIEIyKSAvIDIuMDsKKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICAvKiBhbGwgdGhlIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCB3aXRoIDIgdG8gbWFrZSB0aGVtIGFsaWduIHdpdGggZml4ZWQgcG9pbnQgdmFsdWVzKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IDIgKiBBMDsKKyAgICBwQ29lZmZpY2llbnRzLT5CMSA9IDIgKiBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IDIgKiBCMjsKKyAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbiArIDE1XTsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKQEAgLTI5NiwzICszNTksNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggOTUyMTJmMi4uZjBkZWI2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTI1LDcgKzI1LDM5IEBACiAvKiBHYWluIHRhYmxlIGZvciAoMTBeKEdhaW4vMjApIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIyMTcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODAwNDc0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzc2MTI4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzQ4ODExZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzE4MTYyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjgzNzcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjQ1MTg3ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxODkzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTUzMzE2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk4ODEzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDM3NjU5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzY5MDQzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyMDU0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA1NjcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA4NzQ5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8zX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl80X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl82X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl83X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl85X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX0dBSU5TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2ODQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MjIxNzIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2MzkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MDA0NzQgKi8KQEAgLTU4LDE0ICs5MCwzMCBAQAogI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuNDY2ODM2ICovCiAjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGcmVxdWVuY3kgdGFibGUgZm9yIDIqUGkvRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzg1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1NzBmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDUyNGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzkzZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAyODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI2MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTk2ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxNDJmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAorI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNjVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKKyNlbmRpZgorCisjZWxzZQogI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KQEAgLTc2LDE0ICsxMjQsMzEgQEAKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDE5NiAqLwogI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTQyICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxMzEgKi8KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjIzNDEzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjQ2NjgzNmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDgxMzRmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjE2MjI3OGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE4ODZmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIzODcyMWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NzgyNzlmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU4NDg5M2YKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyMjAxOGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwZgorI2Vsc2UKICNkZWZpbmUgTFZFUU5CXzEwMERTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc5OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjYyMzQxMyAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuMDExODcyICovCkBAIC0xMDEsNiArMTY2LDYgQEAKICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCiAjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KLQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCmluZGV4IDEwZTdkNzQuLmMyOTBhZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKQEAgLTE0MCw4ICsxNDAsMTIgQEAKIHZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKLQorI2lmZGVmIEhJR0hFUl9GUworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZWxzZQogICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZW5kaWYKKwogICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWRVFOQl9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgLyogU2FtcGxlIHJhdGUgKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwpAQCAtMTU4LDExICsxNjIsMTUgQEAKICAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OyAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNlbHNlCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIGZpbHRlciBzZXQgdGhlIHR5cGUgb2YgYmlxdWFkIHJlcXVpcmVkCiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX1NpbmdsZVByZWNpc2lvbjsgICAgICAgICAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBpZiAoKGZjIDw8IDE1KSA8PSAoTE9XX0ZSRVEgKiBmcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qCkBAIC0xNzcsNyArMTg1LDcgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9Eb3VibGVQcmVjaXNpb247CiAgICAgICAgIH0KLQorI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcwpAQCAtMjMwLDYgKzIzOCwyNSBAQAogICAgICAgICBCaXF1YWRUeXBlID0gcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXTsKICAgICAgICAgc3dpdGNoICAoQmlxdWFkVHlwZSkKICAgICAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZWxzZQogICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwpAQCAtMjY5LDYgKzI5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg4LDcgKzMxNiw3IEBACiAvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSkKIHsKICAgICBMVk1fSU5UMTYgICAgICAgKnBUYXBBZGRyZXNzOwpAQCAtMzA1LDggKzMzMywyNCBAQAogICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KICAgICB9CiB9CisjZWxzZQordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9GTE9BVCAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CiAKKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQ7CisgICAgTnVtVGFwcyAgICAgPSAoTFZNX0lOVDE2KSgocEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKSAvIHNpemVvZihMVk1fRkxPQVQpKTsKIAorICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyMiw5ICs0NjYsMTMgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCiAgICAgICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLjBmKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2KTsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOwotCisjZW5kaWYKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgfQpAQCAtNDMyLDE1ICs0ODAsMTggQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBTdGF5IG9uIHRoZSBPTiBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9PTjsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMC4wZik7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCk7CiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVk1fTUFYSU5UXzE2KTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLQogICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOwogICAgICAgICB9CiAKQEAgLTQ3MCw4ICs1MjEsMTMgQEAKICAgICAgLyoKICAgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKKyAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7CisjZWxzZQogICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgogICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKICAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKXsKICAgICAgICAgICAgIENhbGxCYWNrKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwgTFZNX05VTEwsIEFMR09SSVRITV9FUU5CX0lEfExWRVFOQl9FVkVOVF9BTEdPRkYpOwpAQCAtNDg1LDkgKzU0MSwzIEBACiAKICAgICByZXR1cm4gMTsKIH0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwppbmRleCBlMDFjMWM1Li5kZTFiYmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCkBAIC05Nyw2ICs5NywyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpKTsKKyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOworICAgICAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KQEAgLTEwNyw2ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpKTsgICAgLyogQmlxdWFkIHR5cGVzICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0RBVEFfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBOwpAQCAtMTE3LDEyICsxMzMsMjIgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfQ09FRl9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0NPRUY7CkBAIC0xMzMsOCArMTU5LDE0IEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSF9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgICAgICA9IExWRVFOQl9TQ1JBVENIOwpAQCAtMjQ4LDggKzI4MCwxNSBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworICAgIHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyNlbmRpZgogCiAKIApAQCAtMjU5LDkgKzI5OCwxNSBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzKTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCA9IChCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisjZWxzZQogICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKICAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHMgPSAoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworI2VuZGlmCiAgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7CiAgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKQEAgLTI3OSw4ICszMjQsMTMgQEAKICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0lOVDE2ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKQEAgLTMwOCwxNSArMzU4LDIyIEBACiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gKHZvaWQqKXBJbnN0YW5jZTsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrOworCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CiAKKwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIDEuMGYpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIExWTV9GU184MDAwLCAyKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fTUFYSU5UXzE2KTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDAsTFZNX0ZTXzgwMDAsMik7CisjZW5kaWYKIAogICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDlkZjk4MGMuLjU2YjAyZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTYwLDYgKzYwLDkgQEAKIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIHR5cGVkZWYgZW51bQogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdCA9IC0xLAorI2VuZGlmCiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbiA9IDAsCiAgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbiA9IDEsCiAgICAgTFZFUU5CX091dE9mUmFuZ2UgICAgICA9IDIsCkBAIC04NCwxMSArODcsMjAgQEAKICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBFUU5CX1RhcHNfRmxvYXQ7ICAgICAgICAvKiBFcXVhbGlzZXIgVGFwcyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0OyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLworI2Vsc2UKICAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLwogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgICAgICAgKnBFUU5CX1RhcHM7ICAgICAgICAvKiBFcXVhbGlzZXIgVGFwcyAqLwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICAgICAgKnBFUU5CX0ZpbHRlclN0YXRlOyAvKiBTdGF0ZSBmb3IgZWFjaCBmaWx0ZXIgYmFuZCAqLworI2VuZGlmCiAKICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIGNhbGwgYmFjayAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KQEAgLTk2LDcgKzEwOCwxMiBAQAogICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCiAKICAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgQnlwYXNzTWl4ZXI7CisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdXNlZCBpbiB0cmFuc2l0aW9ucyAqLworI2VuZGlmCisKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCiAKIH0gTFZFUU5CX0luc3RhbmNlX3Q7CkBAIC0xMTQsNyArMTMxLDExIEBACiB2b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSk7CiAKIHZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAqcEluc3RhbmNlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOwpAQCAtMTIyLDYgKzE0Myw3IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogCiBMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwppbmRleCA1OGY1OGVkLi42MzI4MTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCkBAIC01Nyw3ICs1NywxMjEgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBCaXF1YWQ7CisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKKworCisgICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgKi8KKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CisgICAgfQorCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisKKyAgICAvKgorICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWRVFOQl9UT09NQU5ZU0FNUExFUyk7CisgICAgfQorCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCisgICAgICAgICAqLworCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uR2FpbiAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNlbGVjdCBzaW5nbGUgb3IgZG91YmxlIHByZWNpc2lvbiBhcyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNb2RlIGlzIE9GRiBzbyBjb3B5IHRoZSBkYXRhIGlmIG5lY2Vzc2FyeQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisKK30KKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTE5OCwzICszMTIsNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKaW5kZXggOGUyZTBlOC4uNTYzMTgxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTM2LDYgKzM2LDIwIEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCitjb25zdCBMVk1fVUlOVDMyICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAorfTsKKyNlbHNlCiBjb25zdCBMVk1fVUlOVDE2ICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLApAQCAtNDQsOCArNTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwCit9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYsNiArNzEsMjIgQEAKIC8qCiAgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl85NjAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLApAQCAtNjUsMTAgKzk2LDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDB9OyAgICAvKiA0OGtTL3MgKi8KKyNlbmRpZgogCiAvKgogICogR2FpbiB0YWJsZQogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9HYWluVGFibGVbXSA9IHtMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTNfZEIsCkBAIC0xMDEsMTAgKzE2NiwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KIAotCisjZW5kaWYKIC8qCiAgKiBEIHRhYmxlIGZvciAxMDAgLyAoR2FpbiArIDEpCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXSA9IHtMVkVRTkJfMTAwRF9OZWcxNV9kQiwgICAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzE0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzExX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnOF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLApAQCAtMTIyLDcgKzIwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCiAKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZpbHRlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAppbmRleCAyOGUzMzY5Li45YzJlMjk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKQEAgLTEwNyw4ICsxMDcsMTQgQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgZm9yIFJFViAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMZXZlbDsgICAgICAgICAgICAgICAgICAvKiBMZXZlbCwgMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugb2YgcmV2ZXJiICovCisjaWZuZGVmIEhJR0hFUl9GUwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCisjZWxzZQorICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCisjZW5kaWYKKwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEYW1waW5nOyAgICAgICAgICAgICAgICAvKiBEYW1waW5nICovCkBAIC0yOTcsMTEgKzMwMywxNyBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKaW5kZXggYWMyZWY5ZC4uZTcxMDg0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwpAQCAtNDEsNiArNDEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCiB7CiAKQEAgLTU5Myw4ICs1OTQsNTg5IEBACiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KKyNlbHNlIC8qIEJVSUxEX0ZMT0FUKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQoreworCisgICAgTFZNX01vZGVfZW4gIE9wZXJhdGluZ01vZGU7CisgICAgTFZNX0lOVDMyICAgIE51bWJlck9mRGVsYXlMaW5lczsKIAogCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOworICAgIH0KKworICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKworICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKyAgICAgICAgTFZNX0ZPX0hQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKworICAgICAgICBDb2VmZnMuQTAgPSAxOworICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKE9tZWdhIDw9IChMVk1fRkxPQVQpTFZSRVZfMl85X0lOUTI5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCkgLyBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcm9vbSBzaXplIHBhcmFtZXRlcgorICAgICAqLworICAgIGlmKCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKQorICAgIHsKKyAgICAgICAgLyogUm9vbSBzaXplIHJhbmdlIGlzIDEwbXMgdG8gMjAwbXMKKyAgICAgICAgICogMCUgICAtLSAxMG1zCisgICAgICAgICAqIDUwJSAgLS0gNjVtcworICAgICAgICAgKiAxMDAlIC0tIDEyMG1zCisgICAgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zID0gMTAgKyAoKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplKjExKSArIDUpIC8gMTApOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIFQgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHRoZSBhbGwgcGFzcyBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9VSU5UMzIgIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOworICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4VF9EZWxheVtdICA9IHtMVlJFVl9NQVhfVDBfREVMQVksIExWUkVWX01BWF9UMV9ERUxBWSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMl9ERUxBWSwgTFZSRVZfTUFYX1QzX0RFTEFZfTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4QVBfRGVsYXlbXSA9IHtMVlJFVl9NQVhfQVAwX0RFTEFZLCBMVlJFVl9NQVhfQVAxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAxOyAgLyogdG8gYXZvaWQgUUFDIHdhcm5pbmcgb24gdHlwZSBjb252ZXJzaW9uICovCisKKyAgICAgICAgICAgICAgICBUZW1wMT0oTFZNX0ZMT0FUKURlbGF5TGVuZ3RoU2FtcGxlczsKKyAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9VSU5UMzIpKFRlbXAxICogU2NhbGVUYWJsZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBUZW1wID0gRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVBEZWxheVNpemUgPSBUZW1wICAvIDE1MDA7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgZml4ZWQgZGVsYXkKKyAgICAgICAgICAgICAqLworCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyAxOTIwMDA7CisjZWxzZQorICAgICAgICAgICAgVGVtcCAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gNDgwMDA7CisjZW5kaWYKKyAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSB0YXAgc2VsZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIHRhcCBCICovCisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMDsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBCIHRvIHRhcCBBICovCisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMDsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxLjBmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gdGhlIHNtYWxsZXN0IGRlbGF5IHNpemUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiAgID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBMaW1pdCB0aGUgbWF4aW11bSBibG9jayBsZW5ndGgKKyAgICAgICAgICovCisgICAgICAgIC8qIEp1c3QgYXMgYSBwcmVjYXVzaW9uLCBidXQgbm8gcHJvYmxlbSBpZiB3ZSByZW1vdmUgdGhpcyBsaW5lICAgICAgKi8KKyAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5NYXhCbGtMZW4gLSAyOworICAgICAgICBpZihwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGFtcGluZykgICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX0lOVDMyICAgICAgIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworICAgICAgICBMVk1fSU5UMTYgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgIERhbXBpbmcgICAgICA9IChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgKiAxMDApICsgMTAwMCk7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyXzBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX0lOVDMyKShTY2FsZVRhYmxlW2ldICogRGFtcGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IERhbXBpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihUZW1wIDw9IChMVk1fSU5UMzIpKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EoVGVtcCwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQTAgPSAxOworICAgICAgICAgICAgICAgIENvZWZmcy5BMSA9IDA7CisgICAgICAgICAgICAgICAgQ29lZmZzLkIxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbaV0sICZDb2VmZnMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBBbGwtcGFzcyBmaWx0ZXIgbWl4ZXIgdGltZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQWxwaGFUYXA7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIEFscGhhVGFwID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGZlZWQgYmFjayBnYWluCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgICAgICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgR1szXSA9IDA7CisgICAgICAgICAgICBHWzJdID0gMDsKKyAgICAgICAgICAgIEdbMV0gPSAwOworICAgICAgICAgICAgR1swXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMTsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAyOworICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAxID0gKDMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zICogU2NhbGVUYWJsZVtpXSkgLyBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDsKKyAgICAgICAgICAgICAgICBpZihUZW1wMSA+PSAoNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAyID0gTFZNX1Bvd2VyMTAoLShUZW1wMSAvIDIuMGYpKTsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IFRlbXAxICogVGVtcDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXBHOworICAgICAgICAgICAgICAgICAgICBUZW1wRyA9IFRlbXAxICogT05FX09WRVJfU1FSVF9UV087CisgICAgICAgICAgICAgICAgICAgIEdbaV09VGVtcEc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHVwIHRoZSBmZWVkYmFjayBtaXhlcnMgZm9yIGZvdXIgZGVsYXkgbGluZXMgKi8KKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uVGFyZ2V0PUdbMF07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLlRhcmdldD1HWzFdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5UYXJnZXQ9R1syXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uVGFyZ2V0PUdbM107CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSApCisgICAgeworICAgICAgICBMVk1fSU5UMzIgSW5kZXg9MDsKKyAgICAgICAgTFZNX0ZMT0FUIEluZGV4X0ZMT0FUOworICAgICAgICBMVk1fSU5UMzIgaT0wOworICAgICAgICBMVk1fRkxPQVQgR2Fpbj0wOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0ZMT0FUIFQ2MDsKKyAgICAgICAgTFZNX0ZMT0FUIENvZWZzWzVdOworCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZSA9IChMVk1fSU5UMzIpcFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPCAxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUm9vbVNpemUgPD0gTFZSRVZfR2FpblBvbHlUYWJsZVtpXVswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgICAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIGdhaW4gYmV0d2VlbiBuZWFyZXN0IHJvb20gc2l6ZXMgKi8KKworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLEdhaW4yOworICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LERpc3Q7CisKKyAgICAgICAgICAgIFRvdF9EaXN0ID0gKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1bMF07CisgICAgICAgICAgICBEaXN0ID0gUm9vbVNpemUgLSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4IC0gMV1bMF07CisKKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIGZpcnN0ICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisKKyAgICAgICAgICAgIEdhaW4xID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIHNlY29uZCAqLworICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKworICAgICAgICAgICAgR2FpbjIgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworCisgICAgICAgICAgICAvKiBMaW5lYXIgSW50ZXJwb2xhdGUgdGhlIGdhaW4gKi8KKyAgICAgICAgICAgIEdhaW4gPSBHYWluMSArICgoKEdhaW4yIC0gR2FpbjEpICogRGlzdCkgLyAoVG90X0Rpc3QpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnZlcnNlIG9mIGdhaW46IFEuMTUKKyAgICAgICAgICogR2FpbiBpcyBtb3N0bHkgYWJvdmUgb25lIGV4Y2VwdCBmZXcgY2FzZXMsIHRha2Ugb25seSBnYWlucyBhYm92ZSAxCisgICAgICAgICAqLworICAgICAgICBpZihHYWluIDwgMSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxIC8gR2FpbjsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4X0ZMT0FUID0gMTAwLjBmIC8gKExWTV9GTE9BVCkoMTAwICsgcFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCk7CisgICAgICAgIHBQcml2YXRlLT5HYWluID0gcFByaXZhdGUtPkdhaW4gKiBJbmRleF9GTE9BVDsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAocFByaXZhdGUtPkdhaW4qSW5kZXhfRkxPQVQpIC8gMjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBhbGwgcGFzcyBjb21iIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudAorICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSAgIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KKyAgICAgICAgTFZNX0ZMT0FUICAgIEFscGhhOworCisgICAgICAgIEFscGhhID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9GRUVEQkFDS01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1DaGFubmVscyk7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzFdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhID0gQWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLkFscGhhID0gQWxwaGE7CisKKyAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBzdGVyZW8gb3V0cHV0ICovCisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0JZUEFTU01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGEyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSAgICA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRhcmdldHMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICYmCisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUpCisgICAgeworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworCisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgICAgICAgICA9IExWTV9NT0RFX09OOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICA9IDAuMDMxMjVmOworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIHRvIEFwcGx5TmV3IHNldHRpbmdzIGZvcmNlIHRoZSBjdXJyZW50IHRvIHRoZSB0YXJnZXQgXAorICAgICAgICB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdCAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAqLworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zID0gcFByaXZhdGUtPk5ld1BhcmFtczsKKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZTsKKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgZmxhZworICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CisgICAgfQorCisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCmluZGV4IDZiYjFlODguLjk0OTEwMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYwpAQCAtNjEsMTYgKzYxLDI2IEBACiAgICAgICogQ2xlYXIgYWxsIGZpbHRlciB0YXAgZGF0YSwgZGVsYXktbGluZXMgYW5kIG90aGVyIHNpZ25hbCByZWxhdGVkIGRhdGEKICAgICAgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgMik7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgIDIpOworI2Vsc2UKICAgICBMb2FkQ29uc3RfMzIoMCwKICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAyKTsKICAgICBMb2FkQ29uc3RfMzIoMCwKICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwogICAgICAgICAyKTsKLQorI2VuZGlmCiAgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwpAQCAtODAsMjQgKzkwLDQ2IEBACiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDJfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10sIExWUkVWX01BWF9UM19ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIExWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9CiAKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworI2VuZGlmCiAgICAgfQogCiAgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzEpCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9Ci0KICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKaW5kZXggZmZhNTEzOC4uMzM2NmJjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCkBAIC0xMDgsMTEgKzEwOCwyOSBAQAogICAgIC8qCiAgICAgICogWmVybyBhbGwgbWVtb3J5IHJlZ2lvbnMKICAgICAgKi8KLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyNlbHNlCisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyNlbmRpZgogICAgIC8qCiAgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKICAgICAgKi8KQEAgLTE0Niw3ICsxNjQsNyBAQAogICAgICAqIFNldCB0aGUgZGF0YSwgY29lZmZpY2llbnQgYW5kIHRlbXBvcmFyeSBtZW1vcnkgcG9pbnRlcnMKICAgICAgKi8KICAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCiAgICAgewogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CkBAIC0xOTAsNyArMjA4LDY3IEBACiAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAsIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKICAgICB9CisjZWxzZQorICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisjZW5kaWYKICAgICAvKiBBbGwtcGFzcyBkZWxheSBidWZmZXIgYWRkcmVzc2VzIGFuZCBzaXplcyAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5UWzBdICAgICAgICAgPSBMVlJFVl9NQVhfVDBfREVMQVk7CiAgICAgcExWUkVWX1ByaXZhdGUtPlRbMV0gICAgICAgICA9IExWUkVWX01BWF9UMV9ERUxBWTsKQEAgLTIwMCwxMCArMjc4LDE5IEBACiAKIAogICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdENvZWYgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0Q29lZiwgc2l6ZW9mKExWUkVWX0Zhc3RDb2VmX3N0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KICAgICBMb2FkQ29uc3RfMzIoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSoyKSk7Ci0KKyNlbHNlCisgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUgKiAyKSk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCkBAIC0yNTIsOSArMzM5LDEzIEBACiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wR2VuZXJhbFB1cnBvc2UgICAgPSBMVk1fTlVMTDsKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tTZXQgICAgICAgID0gTFZNX0ZBTFNFOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDB4MDNmZmZmZmY7Ci0KKyNlbHNlCisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBBbGwtUGFzcyBGaWx0ZXIgbWl4ZXJzCkBAIC0yNzcsNyArMzY4LDExIEBACiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMSAgICAgICA9IExWTV9OVUxMOwogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MSAgICAgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDEgICAgICAgICA9IDA7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDB4N2ZmZmZmZmY7CisjZWxzZQorICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgICAgICAgICAgPSAxOworI2VuZGlmCiAgICAgICAgIC8qIEZlZWRmb3J3YXJkIG1peGVyICovCiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkNhbGxiYWNrUGFyYW0gICA9IDA7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKaW5kZXggMjAxMjQzMi4uZjZkNDQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCkBAIC0xNjEsMjEgKzE2MSwzNyBAQAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7CiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdERhdGEpOwpAQCAtMTk1LDE0ICsyMTEsMjUgQEAKICAgICAgICAgLyoKICAgICAgICAgICogVGVtcG9yYXJ5IGZhc3QgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggbWVtb3J5ICovCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMipzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZWQgZm9yIGVuZCBtaXggKi8KLQorI2Vsc2UKKyAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZWQgZm9yIGVuZCBtaXggKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjEwLDcgKzIzNywxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTgsNyArMjUwLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAppbmRleCBmYmZhNDM3Li5mZjc0NzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCkBAIC00MiwxNiArNDIsMjcgQEAKIC8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAgICAyMzE3MCAgICAgICAgICAgLyogMS9zcXJ0KDIpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9CXzhfb25fMTAwMCAgICAgICAgICAgIDE3MTc5ODY5ICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCiAjZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDgxOTIgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgIDE1ODM3NjkxOTBMICAgICAgICAgICAvKiAyLjkgaW4gUTI5IGZvcm1hdCAqLwogI2RlZmluZSBMVlJFVl9NSU4zREIgICAgICAgICAgICAgICAgICAgMHg1QTgyICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNlbHNlCisvKiBHZW5lcmFsICovCisjZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgMC43MDcxMDdmICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgICAgMC4wMDhmICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCisjZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDAuMjVmICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAgICAgICAgIDIuOWYgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCisjZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAwLjcwNzk0NTdmICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNlbmRpZgogCiAvKiBJbnRlbmFsIGNvbnN0YW50cyAqLwogI2RlZmluZSBMVlJFVl9MUF9Qb2x5X09yZGVyICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgICAgICAgICAgICAgICAgIDUKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgIDMyNzY4CiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAgNDMxMjUKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgICA1Njc1NQpAQCAtNjEsMTQgKzcyLDQ3IEBACiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAgICAgMjQ4OTggICAgICAgICAgIC8qIDNeKC0xLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQgICAgIDE4OTE5ICAgICAgICAgICAvKiAzXigtMi80KSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80ICAgICAxNDM3NSAgICAgICAgICAgLyogM14oLTMvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX01BWF9UM19ERUxBWSAgICAgICAgICAgICAgIDI1MjcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgMzMyNiAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICA0Mzc3ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMF9ERUxBWSAgICAgICAgICAgICAgIDU3NjAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgMTY4NSAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAyMjE4ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDFfREVMQVkgICAgICAgICAgICAgIDI5MTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgMzg0MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2Vsc2UvKkJVSUxEX0ZMT0FUKi8KKyNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFICAgICAgICAgICAgICAgIDAuMDAwMTQyZiAgICAgICAgICAgLyooMS83MDAwKSAqLworCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgICAgIDEuMGYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgIDEuMzE2MDc0ZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgMS43MzIwNTFmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8zX29uXzQgICAgICAgICAyLjI3OTUwN2YKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80ICAgICAgICAgMS4wZiAgICAgICAgLyogM14oLTAvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAgICAwLjc1OTgzNmYgICAgICAgIC8qIDNeKC0xLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQgICAgMC41NzczNTBmICAgICAgICAvKiAzXigtMi80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80ICAgIDAuNDM4NjkxZiAgICAgICAgLyogM14oLTMvNCkgKiAyXjE1ICovCisjZW5kaWYKKworI2lmbmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgIDI1MjcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgIDMzMjYgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgIDU3NjAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgIDE2ODUgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgIDI5MTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgIDM4NDAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNlbHNlCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMTAxMDgKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAxMzMwNAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDE3NTA4CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgMjMwNDAKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAgNjc0MAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgICA4ODcyCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMTE2NzIKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAxNTM2MAorI2VuZGlmCisKICNkZWZpbmUgTFZSRVZfQllQQVNTTUlYRVJfVEMgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQqLwogI2RlZmluZSBMVlJFVl9BTExQQVNTX1RDICAgICAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgdGltZSBjb25zdGFudCAqLwogI2RlZmluZSBMVlJFVl9BTExQQVNTX1RBUF9UQyAgICAgICAgICAgICAxMDAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIGRlbHkgdGFwIGNoYW5nZSAqLwpAQCAtNzYsNyArMTIwLDEyIEBACiAjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgICAgICAgICAgICAgIDUgICAgICAgICAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyogUGFyYW1ldGVyIGxpbWl0cyAqLworI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNlbHNlCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZW5kaWYKKwogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCiAjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KICNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLwpAQCAtOTUsNiArMTQ0LDcgQEAKIC8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNjEsNyArMjExLDgxIEBACiAKIH0gTFZSRVZfSW5zdGFuY2Vfc3Q7CiAKKyNlbHNlIC8qIEJVSUxEX0ZMT0FUICovCiAKKy8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgSFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IExQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgdGFwcyAqLworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFJldkxQVGFwc1s0XTsgICAgICAgICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyB0YXBzICovCisKK30gTFZSRVZfRmFzdERhdGFfc3Q7CisKKworLyogRmFzdCBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBIUENvZWZzOyAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBMUENvZWZzOyAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldkxQQ29lZnNbNF07ICAgICAgICAvKiBSZXZlcmIgbG93IHBhc3MgZmlsdGVycyBjb2VmZmljaWVudHMgKi8KKworfSBMVlJFVl9GYXN0Q29lZl9zdDsKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RhbmNlUGFyYW1zOyAgICAgICAgICAgLyogSW5pdGlhbGlzYXRpb24gdGltZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgTWVtb3J5VGFibGU7ICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgIC8qIFBhcmFtZXRlcnMgYmVpbmcgdXNlZCAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgZnJvbSB0aGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBhcHBsaWNhdGlvbiAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRyb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgIGJEaXNhYmxlUmV2ZXJiOyAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtaXggbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgLyogUm9vbSBzaXplIGluIG1zZWMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBNYXhCbGtMZW47ICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBmb3IgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgKi8KKworICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisgICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIExWUkVWX0Zhc3RDb2VmX3N0ICAgICAgICpwRmFzdENvZWY7ICAgICAgICAgICAgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoRGVsYXlMaW5lWzRdOyAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAvKiBNdWx0aSB1c3NnZSBzY3JhdGNoICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dFNhdmU7ICAgICAgICAgICAgICAvKiBSZXZlcmIgYmxvY2sgaW5wdXQgc2F2ZSBmb3IgZHJ5L3dldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW5nKi8KKworICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgLyogTWl4ZXIgZm9yIFBvcCBhbmQgQ2xpY2sgU3VwcmVzc2lvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgZmVlZGJhY2sgR2FpbiAqLworCisKKyAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gZGVsYXkgc2l6ZSBvZiBidWZmZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERlbGF5X1RbNF07ICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGVsYXkgYnVmZmVycyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIERlbGF5X0FQWzRdOyAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gQiB3aGVuIDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIEIgdG8gQSAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEFfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQSBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJfRGVsYXlTaXplWzRdOyAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQSBkZWxheSB0YXAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE9mZnNldEJbNF07ICAgICAgICAgICAgIC8qIE9mZnNldCBmb3IgdGhlIEIgZGVsYXkgdGFwICovCisgICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfQVBUYXBzWzRdOyAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgLyogU21vb3RoZWQgU0FmZWVkYmFjayBnYWluICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkZm9yd2FyZFs0XTsgICAvKiBTbW9vdGhlZCBBUCBmZWVkZm9yd2FyZCBnYWluICovCisKKyAgICAvKiBPdXRwdXQgZ2FpbiAqLworICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgIEJ5cGFzc01peGVyOyAgICAgICAgICAgICAgLyogRHJ5L3dldCBtaXhlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiBhcHBsaWVkIHRvIG91dHB1dCB0byBtYWludGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBzaWduYWwgcG93ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBHYWluTWl4ZXI7ICAgICAgICAgICAgICAgIC8qIEdhaW4gc21vb3RoaW5nICovCisKK30gTFZSRVZfSW5zdGFuY2Vfc3Q7CisKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTY5LDEyICsyOTMsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMVlJFVl9BcHBseU5ld1NldHRpbmdzKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZWxzZQogdm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICAgICAgICAgICAqcElucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiBMVk1fSU5UMzIgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkICAgICAgICpwQ2FsbGJhY2tEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBHZW5lcmFsUHVycG9zZSApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCmluZGV4IDVjN2E4YTAuLjU2NmQ4NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTQ2LDE0ICs0NiwyNiBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKKyNlbHNlCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKKyNlbmRpZgogewogICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5wdXQgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQgPSBwT3V0RGF0YTsKKyNlbHNlCiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0lOVDMyICopcEluRGF0YTsKICAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworI2VuZGlmCiAgICBMVk1fSU5UMzIgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKICAgIExWTV9JTlQzMiAgICAgICAgICAgICBmb3JtYXQgPSAxOwogCkBAIC0xMDUsNyArMTE3LDcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBjb252ZXJ0IHRvIHN0ZXJlbyBpcyByZXF1aXJlZAogICAgICAgICAgICAgICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIGlmKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTyl7CiAgICAgICAgICAgICAgICAgTW9ub1RvMklfMzIocElucHV0LCBwT3V0cHV0LCBOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMTMsNiArMTI1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMikpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCiAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKKyAgICAgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbworICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKQEAgLTE0Myw5ICsxNjQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcElucHV0ICA9IChMVk1fRkxPQVQgKikocElucHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiBmb3JtYXQpKTsKKyAgICAgICAgcE91dHB1dCA9IChMVk1fRkxPQVQgKikocE91dHB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisjZWxzZQogICAgICAgICBwSW5wdXQgID0gKExWTV9JTlQzMiAqKShwSW5wdXQgKyhTYW1wbGVzVG9Qcm9jZXNzKmZvcm1hdCkpOwotICAgICAgICBwT3V0cHV0ID0gKExWTV9JTlQzMiAqKShwT3V0cHV0KyhTYW1wbGVzVG9Qcm9jZXNzKjIpKTsgICAgICAvLyBBbHdheXMgc3RlcmVvIG91dHB1dAorICAgICAgICBwT3V0cHV0ID0gKExWTV9JTlQzMiAqKShwT3V0cHV0KyhTYW1wbGVzVG9Qcm9jZXNzKjIpKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTc1LDcgKzIwMCw3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICpwSW5wdXQsIExWTV9JTlQzMiAqcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCiB7CiAgICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKQEAgLTQ3OSw3ICs1MDQsMzIyIEBACiAKICAgICByZXR1cm47CiB9CisjZWxzZQordm9pZCBSZXZlcmJCbG9jayhMVk1fRkxPQVQgKnBJbnB1dCwgTFZNX0ZMT0FUICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKK3sKKyAgICBMVk1fSU5UMTYgICBqLCBzaXplOworICAgIExWTV9GTE9BVCAgICpwRGVsYXlMaW5lOworICAgIExWTV9GTE9BVCAgICpwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBTY3JhdGNoID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9GTE9BVCAgICpwSW47CisgICAgTFZNX0ZMT0FUICAgKnBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyICAgTnVtYmVyT2ZEZWxheUxpbmVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBjYWxjdWxhdGlvbnMgd2lsbCBnbyBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwVGVtcCwgdGhpcyB3aWxsICAgICoKKyAgICAgKiB0aGVuIGJlIG1peGVkIHdpdGggdGhlIG9yaWdpbmFsIGlucHV0IHRvIGNyZWF0ZSB0aGUgZmluYWwgb3V0cHV0LiAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFdoZW4gSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkIHRoaXMgbXVzdCBiZSBhIHRlbXBvcmFyeSBidWZmZXIgYW5kICAgICoKKyAgICAgKiBoZW5jZSB0aGlzIGlzIHRoZSB3b3JzdCBjYXNlLCBzbyBmb3Igc2ltcGxpY2l0eSB0aGlzIHdpbGwgQUxXQVlTIGJlIHNvICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW50b3VjaGVkIHVudGlsIHRoZSBvdXRwdXQgb2YgdGhlIG1peGVyIGlmICAgICoKKyAgICAgKiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSB0ZW1wIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBOdW1TYW1wbGVzIGluIHNpemUgcmVnYXJkbGVzcyBvZiBNT05PIG9yICAgICoKKyAgICAgKiBTVEVSRU8gaW5wdXQuIEluIHRoZSBjYXNlIG9mIHN0ZXJlbyBpbnB1dCBhbGwgcHJvY2Vzc2luZyBpcyBkb25lIGluIE1PTk8gICAqCisgICAgICogYW5kIHRoZSBmaW5hbCBvdXRwdXQgaXMgY29udmVydGVkIHRvIFNURVJFTyBhZnRlciB0aGUgbWl4ZXIgICAgICAgICAgICAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIGlmKHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKKyAgICB7CisgICAgICAgIHBJbiA9IHBJbnB1dDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogIFN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KKyAgICAgICAgICovCisKKyAgICAgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgcEluID0gcFRlbXA7CisgICAgfQorCisgICAgTXVsdDNzX0Zsb2F0KHBJbiwKKyAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVlJFVl9IRUFEUk9PTSwKKyAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAvKgorICAgICAqICBIaWdoIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAvKgorICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIAorICAgIC8qCisgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCisgICAgICovCisKKyAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKKyAgICB7CisgICAgICAgIHBEZWxheUxpbmUgPSBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbal07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWxsLXBhc3MgZmlsdGVyIHdpdGggcG9wIGFuZCBjbGljayBzdXBwcmVzc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgLyogR2V0IHRoZSBzbW9vdGhlZCwgZGVsYXllZCBvdXRwdXQuIFB1dCBpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBSZS1hbGlnbiB0aGUgYWxsIHBhc3MgZmlsdGVyIGRlbGF5IGJ1ZmZlciBhbmQgY29weWluZyB0aGUgZml4ZWQgZGVsYXkgZGF0YSBcCisgICAgICAgICAgIHRvIHRoZSBBUCBkZWxheSBpbiB0aGUgcHJvY2VzcyAqLworICAgICAgICBDb3B5X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBEZWxheV9UW2pdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKHBQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlcykpOyAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCisgICAgICAgIC8qIEFwcGx5IHRoZSBzbW9vdGhlZCBmZWVkYmFjayBhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgZGVsYXkgbGluZSAqLworICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsICAgIC8qIEludmVydCBzaW5jZSB0aGUgZmVlZGJhY2sgY29lZmZpY2llbnQgaXMgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBBcHBseSBzbW9vdGhlZCBmZWVkZm9yd2FyZCBzYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIG91dHB1dCAqLworICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBGZWVkYmFjayBnYWluCisgICAgICAgICAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltqXSwgcERlbGF5TGluZSwgcERlbGF5TGluZSwgTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgQXBwbHkgcm90YXRpb24gbWF0cml4IGFuZCBkZWxheSBzYW1wbGVzCisgICAgICovCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworCisgICAgICAgIENvcHlfRmxvYXQocFRlbXAsCisgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogIFJvdGF0aW9uIG1hdHJpeCBtaXgKKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaChqKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgRGVsYXkgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdChwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCisgICAgfQogCiAKKyAgICAvKgorICAgICAqICBDcmVhdGUgc3RlcmVvIG91dHB1dAorICAgICAqLworICAgIHN3aXRjaChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzKQorICAgIHsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzQ6CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18yOgorCisgICAgICAgICAgICAgQ29weV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKworICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzE6CisgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiAgRHJ5L3dldCBtaXhlcgorICAgICAqLworCisgICAgc2l6ZSA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSk7CisgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIC8qIEFwcGx5IEdhaW4qLworCisgICAgU2hpZnRfU2F0X0Zsb2F0KExWUkVWX09VVFBVVEdBSU5fU0hJRlQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkdhaW5NaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qIEVuZCBvZiBmaWxlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCmluZGV4IGY1ODk1YTcuLmE3MTkwNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwpAQCAtNjEsMTAgKzYxLDE1IEBACiAgICAgICogQ2hlY2sgYWxsIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgYXJlIGluIHJhbmdlCiAgICAgICovCiAgICAgaWYoICAgICgocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICgocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgICAgICgKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAotICAgICAgICAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKKyNlbmRpZgorICAgICAgICApCisgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCA1YTZkNDNkLi5iM2VkYzYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtMjksNiArMjksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLworI2lmbmRlZiBISUdIRVJfRlMKIGNvbnN0IExWTV9VSU5UMTYgTFZNX0ZzVGFibGVbXSA9IHsKICAgICA4MDAwICwKICAgICAxMTAyNSwKQEAgLTQwLDE0ICs0MSwzNyBAQAogICAgIDQ0MTAwLAogICAgIDQ4MDAwCiB9OwotCisjZWxzZQorY29uc3QgTFZNX1VJTlQzMiBMVk1fRnNUYWJsZVtdID0geworICAgIDgwMDAgLAorICAgIDExMDI1LAorICAgIDEyMDAwLAorICAgIDE2MDAwLAorICAgIDIyMDUwLAorICAgIDI0MDAwLAorICAgIDMyMDAwLAorICAgIDQ0MTAwLAorICAgIDQ4MDAwLAorICAgIDk2MDAwLAorICAgIDE5MjAwMAorfTsKKyNlbmRpZgogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUwogTFZNX1VJTlQxNiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpewogICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzQ4MDAwKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHJldHVybiAoTFZNX0ZzVGFibGVbRnNJbmRleF0pOwogfQorI2Vsc2UKK0xWTV9VSU5UMzIgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KXsKKyAgICBpZiAoRnNJbmRleCA+IExWTV9GU18xOTIwMDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7Cit9CisjZW5kaWYKIAogLyogSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGFudCBpbnB1dCBhbmQgb3V0IHB1dCBzaWduYWwgc3RyZW5ndGhzCiAgICBvdXRwdXQgZ2Fpbi9hdHRlbnVhdGlvbiBpcyBhcHBsaWVkLiBUaGlzIGdhaW4gZGVwZW5kcyBvbiBUNjAgYW5kIFJvb21zCkBAIC02OSw2ICs5Myw3IEBACiAgICovCiAKIC8qIE5vcm1hbGl6aW5nIG91dHB1dCBpbmNsdWRpbmcgUmV2ZXJiIExldmVsIHBhcnQgKG9ubHkgc2hpZnQgdXApKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQzMiBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMTc1NDc0MzQsMTI4ODY3NDM0LC0xMjA5ODg4OTYsNTA3NjEyMjgsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMTgyNTY4NjksMTcyNjY2OTAyLC0xOTMxNjkyOTIsODgzNDU3NDQsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMTY1OTEzMTEsMTM5MjUwMTUxLC0xNDk2NjcyMzQsNjY3NzAwNTksfSwKQEAgLTk0LDYgKzExOSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMTYwMDMzMjIsNDgzMjM2NjEsLTM1NjA3Mzc4LDEzMTUzODcyLH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMTU5NTUyMjMsNDg1NTgyMDEsLTMzNzA2ODY1LDExNzE1NzkyLH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KKyNlbHNlCitjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDEuMDQ1OTA5Ziw3LjY4MTA5OGYsLTcuMjExNTAwZiwzLjAyNTYwNWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMS4wODgxOTRmLDEwLjI5MTc0OWYsLTExLjUxMzc4N2YsNS4yNjU4MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDAuOTg4OTE5Ziw4LjI5OTk1NmYsLTguOTIwODYyZiwzLjk3OTgwNmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsMS4wMzU5MjdmLDEwLjE4MjU2N2YsLTEwLjM0NjEzNGYsNC41NDY1MzNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LDEuMTMwMzEzZiwxMi41Mzg3MjdmLC0xMy42MjcwMjNmLDYuMTY1MjA4Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwxLjA2MDc0M2YsOC4wOTE3MTNmLC04LjU4ODA3OWYsMy44MzQyMzBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3LDEuMDQwMzgxZiwxMC40MDY1NjZmLC0xMS4xNzY2NTBmLDUuMDc1MTMyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwxLjAyNjk0NGYsOC4zODczMDJmLC04LjY4OTc5NmYsMy44OTU4NjNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5LDEuMDEzMzEyZiw5LjcyNzIzNmYsLTEwLjUzNDE2NWYsNC43NDIyNzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwwLjk5NjA5NWYsOC40OTIyNDlmLC03Ljk0NzY3N2YsMy40Nzg5MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxLjA3OTM0NmYsOC44OTQ0MjVmLC05LjY0MTc2OGYsNC40MzQ0NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNSwwLjk5NDMyN2YsNy40NDEzMzVmLC04LjAwMzk3OWYsMy41ODExNzdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNywwLjk5MTA2N2YsNy4yMDgzNzNmLC03LjI1Nzg1OWYsMy4xNjc3NzRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxLjAzMzQ0NWYsNy40NzYzNzFmLC03LjU0Njk2MGYsMy4zNjk3MDNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyNSwwLjk4MjgzMGYsNS45MTM4NjdmLC01LjYzODQ0OGYsMi40MjA5MzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwwLjkyODc4MmYsNS4wMzUzNDNmLC00LjQ5MjEwNGYsMS44NDQ5MDRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0MCwwLjk1MzcxNGYsNS4wNjAyMzJmLC00LjQ3MjIwNGYsMS44Mjk2NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1MCwwLjg5OTI1OGYsNC4yNzMzNTdmLC0zLjUzNzQ5MmYsMS4zODc1NzZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwwLjk0MzU4NGYsNC4wOTMyMjhmLC0zLjQ2OTY1OGYsMS40MTA5MTFmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MCwwLjkyNjAyMWYsMy45NzMxMjVmLC0zLjMzMTk4NWYsMS4zNDQ2OTBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3NSwwLjg5NDg1M2YsMi44NzE3NDdmLC0xLjQzODc1OGYsMC4zMTE4NTZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4MCwwLjkzNTEyMmYsMi45OTE4NTdmLC0yLjAzODg4MmYsMC42ODYzOTVmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwwLjk1Mzg3MmYsMi44ODAzMTVmLC0yLjEyMjM2NWYsMC43ODQwMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMC45NTEwMDVmLDIuODk0Mjk0ZiwtMi4wMDkwODZmLDAuNjk4MzE2Zix9LAorfTsKKyNlbmRpZgogLyogRW5kIG9mIGZpbGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAppbmRleCA1Zjk5M2JkLi4wNjU4MTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaApAQCAtMzcsMTAgKzM3LDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEhJR0hFUl9GUwogZXh0ZXJuIGNvbnN0ICAgIExWTV9VSU5UMTYgIExWTV9Gc1RhYmxlW107CiBleHRlcm4gICAgICAgICAgTFZNX1VJTlQxNiAgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KTsKLWV4dGVybiAgICAgICAgICBMVk1fSU5UMzIgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbHNlCitleHRlcm4gY29uc3QgICAgTFZNX1VJTlQzMiAgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiAgICAgICAgICBMVk1fVUlOVDMyICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworI2VuZGlmCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKK2V4dGVybiAgICAgICAgICBMVk1fSU5UMzIgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbHNlCitleHRlcm4gICAgICAgICAgTFZNX0ZMT0FUICAgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCmluZGV4IGE2NzVjYjIuLjIwMzhmYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oCkBAIC0yMTYsMTEgKzIxNiwxNyBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICAgKTsKKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICAgKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldFNwZWN0cnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwppbmRleCBjZDVmNjljLi5mNmM0ZWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKQEAgLTI4LDYgKzI4LDE1IEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cyk7CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cyk7CkBAIC0zOSw3ICs0OCw3IEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmZmljaWVudHMpOwotCisjZW5kaWYKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CiAKQEAgLTE3OSw3ICsxODgsMTEgQEAKICAgICBMVk1fVUlOVDE2IEZyZXE7CiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUGFyYW1zOwogICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CisjaWZuZGVmIEhJR0hFUl9GUwogICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKKyNlbHNlCisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworI2VuZGlmCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CiAKIApAQCAtMjY3LDggKzI4MCwxMSBAQAogTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCiB7Ci0KKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworI2Vsc2UKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZW5kaWYKICAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwpAQCAtMzQyLDI2ICszNTgsNDIgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI6CiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CiAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVlBTQV9CUERvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCkBAIC0zNzQsOSArNDA2LDI2IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MDksMTggKzQ1OCwzMSBAQAogewogICAgIExWTV9VSU5UMTYgICAgIGlpOwogICAgIExWTV9Gc19lbiAgICAgIEZzID0gcFBhcmFtcy0+RnM7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgUVBEX0MzMl9Db2VmcyAgKnBDb2VmZmljaWVudHM7CiAgICAgZXh0ZXJuICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107CiAKLQogICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworI2Vsc2UKKyAgICBRUERfRkxPQVRfQ29lZnMgICpwQ29lZmZpY2llbnRzOworICAgIGV4dGVybiAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CisKKyAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9GbG9hdF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKKyNlbmRpZgogCiAKICAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKICAgICB7Ci0gICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZQU0FfUVBEX0luaXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2Vsc2UKKyAgICAgICAgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKQEAgLTQ2MCw2ICs1MjIsODcgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKKyAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOworICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCAvIDIwNDgpICogMC42MzY1ODU1OGY7ICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzIgKi8KKyAgICB0MCA9IFQwIDsKKyAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ09TX1QwID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgICAgPSBMVlBTQV9GbG9hdF9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yICA9IChmYWN0b3IgKiB0MCkgOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwICogODsgICAgLypMVlBTQV9Db3NDb2VmX2Zsb2F0WzBdKi8gICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpICogKENPU19UMCk7ICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSArIEIyKSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTAgKiAyOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjEgKiAyOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjIgKiAyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICpwQ29lZmZpY2llbnRzKQpAQCAtNTQxLDcgKzY4NCw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4NCw2ICs3MjcsOTAgQEAKIC8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENvc0VycjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOworICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CisgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAorICAgICAqLworICAgIFQwID0gVDAgKiAwLjk5NDc1MGY7ICAgICAgICAgICAgICAgICAgICAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzUwICovCisgICAgdDAgPSBUMDsKKyAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ29zRXJyID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9GbG9hdF9EUENvc0NvZWZbaV07ICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDb3NFcnIgKz0gZmFjdG9yICogY29lZjsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciA9IGZhY3RvciAqIHQwOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ29zRXJyID0gQ29zRXJyICogMjsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIxIGFuZCBBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKTsgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKi8KKyAgICBBMCA9IEIxICogQ29zRXJyIDsgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICArIEIyKSAvIDI7ICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cykKQEAgLTY2Niw3ICs4OTMsNyBAQAogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OTAsMTEgKzkxNywxNyBAQAogCiAgICAgLyogQmFuZCBQYXNzIGZpbHRlcnMgdGFwcyAqLwogICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBCUF9UYXBzOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCk7IGkrKykKKyAgICB7CisgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKKyAgICB9CisjZWxzZQogICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpOyBpKyspCiAgICAgewogICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CiAgICAgfQotCisjZW5kaWYKICAgICAvKiBRdWFzaS1wZWFrIGZpbHRlcnMgdGFwcyAqLwogICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBRUERfVGFwczsKICAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpOyBpKyspCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwppbmRleCAyN2E0YmMzLi4xYzI2ODYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKQEAgLTQ3LDcgKzQ3LDExIEBACiAgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAgICpwTFZQU0FfSW5zdDsKICAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgZXJyb3JDb2RlICAgICAgID0gTFZQU0FfT0s7CiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIGlpOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgICAgICBMVlBTQV9HYWluVGFibGVbXTsKKyNlbHNlCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOworI2VuZGlmCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7CiAKICAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KQEAgLTE0MSwxOSArMTQ1LDM3IEBACiAKIAogICAgIC8qIEFzc2lnbiB0aGUgcG9pbnRlcnMgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICk7CisjZW5kaWYKICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOwogICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyNlbHNlCisgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOworI2VuZGlmCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKIAorI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKKyNlbmRpZgogCiAgICAgLyogQ29weSBmaWx0ZXJzIHBhcmFtZXRlcnMgaW4gdGhlIHByaXZhdGUgaW5zdGFuY2UgKi8KICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCkBAIC0xNjQsNyArMTg2LDEyIEBACiAgICAgLyogU2V0IFBvc3QgZmlsdGVycyBnYWlucyovCiAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0oTFZNX1VJTlQxNikgTFZQU0FfR2FpblRhYmxlW3BJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gKyAxNV07CisjZWxzZQorICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPSBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW5dOworI2VuZGlmCiAgICAgfQogICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCmluZGV4IDA5ODRiMTAuLjA2YThmOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKQEAgLTEwNiw3ICsxMDYsMTEgQEAKICAgICAgICAgICovCiAKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSApOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fRkxPQVQpICk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQxNikgKTsKKyNlbmRpZgogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKIAogICAgICAgICB7CkBAIC0xMzQsNyArMTM4LDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fSU5UMTYpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fRkxPQVQpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmU2NyYXRjaCk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVlBTQV9TQ1JBVENIOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xNDIsOCArMTUwLDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFBlcnNpc3RlbnQgY29lZmZpY2llbnRzIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworI2Vsc2UKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQ29lZik7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfQ09FRjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xNTEsOCArMTY0LDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KSApOwogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOworI2Vsc2UKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IDAzNTIyZmIuLmE3NTBiYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDMsOCArNDMsMTEgQEAKICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMSAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50cyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgKi8KICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMiAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IHRhcHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgKi8KICNkZWZpbmUgTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgIC8qIE9mZnNldCB0byBzY3JhdGNoICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLworI2Vsc2UKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZW5kaWYKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiAgICAgICAgICA0MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTMsMTIgKzk2LDI3IEBACiAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOwogCiAgICAgTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKnBCUEZpbHRlcnNQcmVjaXNpb247ICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmaWx0ZXIgcHJlY2lzaW9uIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICovCiAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAgKnBCUF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICovCiAgICAgUVBEX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICAgICAgICovCiAgICAgUVBEX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisjZWxzZQorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLworICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwQlBfVGFwczsKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgUVBEIGZpbHRlciBpbnN0YW5jZSBmb3IgZWFjaCBiYW5kICovCisgICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLworICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICAgICAgICAgICpwUVBEX1RhcHM7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAqLworI2Vsc2UKKyAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOworI2VuZGlmCiAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAgKnBGaWx0ZXJzUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgdGhlIGZpbHRlcnMgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKaW5kZXggOWUyOWY2OC4uZWE1Zjc0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCkBAIC00Myw2ICs0Myw5NiBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICApCisKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOworICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDSEVDSyBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICB9CisKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBwV3JpdGVfU2F2ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEFQUExZIE5FVyBTRVRUSU5HUyBJRiBORUVERUQKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IDA7CisgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoIHBMVlBTQV9JbnN0KTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUFJPQ0VTUyBTQU1QTEVTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBQdXQgc2FtcGxlcyBpbiByYW5nZSBbLTAuNTswLjVbIGZvciBCUCBmaWx0ZXJzIChzZWUgQmlxdWFkcyBkb2N1bWVudGF0aW9uKSAqLworICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAgICggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKKyAgICB7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKQEAgLTEzMCw3ICsyMjAsNyBAQAogCiAgICAgcmV0dXJuKExWUFNBX09LKTsKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCmluZGV4IDgzNmJmZDcuLjk5ZDg0NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKQEAgLTMxLDYgKzMxLDE1IEBACiAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogfVFQRF9TdGF0ZV90LCAqcFFQRF9TdGF0ZV90OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZWxheTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31RUERfRkxPQVRfU3RhdGVfdCwgKnBRUERfRkxPQVRfU3RhdGVfdDsKKyNlbmRpZgorCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLwpAQCAtMzgsMTIgKzQ3LDMwIEBACiAKIH0gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0ZMT0FUIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCisKK30gUVBEX0ZMT0FUX0NvZWZzLCAqUFFQRF9GTE9BVF9Db2VmczsKKyNlbmRpZgorCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbMV07CiAKIH0gUVBEX1RhcHNfdCwgKnBRUERfVGFwc190OwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbMV07CisKK30gUVBEX0ZMT0FUX1RhcHNfdCwgKnBRUERfRkxPQVRfVGFwc190OworCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDYgKzg5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4KTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MCw4ICsxMTMsMTIgQEAKIHZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7CisjaWZkZWYgQlVJTERfRkxPQVQKIAotCit2b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICggICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgKnBDb2VmICAgICApOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYwppbmRleCA1MGUwYTgwLi4yY2MzMmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYwpAQCAtNDAsMyArNDAsMTQgQEAKICAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSBwQ29lZi0+S1A7CiAgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gcENvZWYtPktNOwogfQorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIHBRUERfRkxPQVRfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICAqcENvZWYgICAgICkKK3sKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gKChMVk1fRkxPQVQpcENvZWYtPktQKTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S00pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCmluZGV4IDY3MTk3YzEuLmUyMzMxNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCkBAIC0zNSwxMiArMzUsMTYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgVmFsdWUgICApOwogCi0KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU0LDYgKzU4LDcgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKQEAgLTE3Myw3ICsxNzgsMTMxIEBACiAgICAgICAgIHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IChMVk1fVUlOVDE2KSgtaWkpOwogICAgIH0KIH0KKyNlbHNlCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpCit7CiAKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUEFSQU1FVEVSUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgUVBEX0ZMT0FUX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKKworICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLworICAgIExWTV9GTE9BVCogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OworCisgICAgLyogUGFyYW1ldGVycyBuZWVkZWQgZHVyaW5nIHF1YXNpIHBlYWsgY2FsY3VsYXRpb25zICovCisgICAgTFZNX0ZMT0FUICAgWDA7CisgICAgTFZNX0ZMT0FUICAgdGVtcCx0ZW1wMjsKKyAgICBMVk1fRkxPQVQgICBhY2N1OworICAgIExWTV9GTE9BVCAgIFhnMDsKKyAgICBMVk1fRkxPQVQgICBEMDsKKyAgICBMVk1fRkxPQVQgICBWMCA9IChMVk1fRkxPQVQpKCpwRGVsYXkpOworCisgICAgLyogRmlsdGVyJ3MgY29lZiAqLworICAgIExWTV9GTE9BVCAgIEtwID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMF0pKTsKKyAgICBMVk1fRkxPQVQgICBLbSA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzFdKSk7CisKKyAgICBMVk1fSU5UMTYgICBpaSA9IG51bVNhbXBsZXM7CisKKyAgICBMVk1fVUlOVDggICpwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKKyAgICBMVk1fSU5UMzIgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgIExWTV9VSU5UMTYgIERvd25TYW1wbGluZ0ZhY3RvciA9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSU5JVElBTElaQVRJT04KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcnJlY3QgdGhlIHBvaW50ZXIgdG8gdGFrZSB0aGUgZmlyc3QgZG93biBzYW1wbGVkIHNpZ25hbCBzYW1wbGUgKi8KKyAgICBwSW5TYW1wcyArPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQ7CisgICAgLyogQ29ycmVjdCBhbHNvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSAoTFZNX0lOVDE2KXBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCk7CisKKyAgICB3aGlsZSAoaWkgPiAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCisgICAgICAgIC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCisgICAgICAgIFgwID0gKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdOworICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCisgICAgICAgIGlmKFgwIDwgMC4wZikKKyAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPiAxLjBmKQorICAgICAgICAgICAgWGcwID0gMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgWGcwID1YMDsKKworCisgICAgICAgIC8qIFF1YXNpIHBlYWsgZmlsdGVyIGNhbGN1bGF0aW9uICovCisgICAgICAgIEQwICA9IFhnMCAtIFYwOworCisgICAgICAgIHRlbXAyID0gRDA7CisKKyAgICAgICAgYWNjdSA9IHRlbXAyICogS3A7CisgICAgICAgIEQwICAgID0gRDAgLyAyLjBmOworICAgICAgICBpZiAoRDAgPCAwLjBmKXsKKyAgICAgICAgICAgIEQwID0gLUQwOworICAgICAgICB9CisKKyAgICAgICAgdGVtcDIgPSBEMDsKKworICAgICAgICB0ZW1wID0gRDAgKiBLbTsKKyAgICAgICAgYWNjdSArPSB0ZW1wICsgWGcwOworCisgICAgICAgIGlmIChhY2N1ID4gMS4wZikKKyAgICAgICAgICAgIGFjY3UgPSAxLjBmOworICAgICAgICBlbHNlIGlmKGFjY3UgPCAwLjBmKQorICAgICAgICAgICAgYWNjdSA9IDAuMGY7CisKKyAgICAgICAgVjAgPSBhY2N1OworCisgICAgICAgIGlmKCgocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlIC0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50KSA8IERvd25TYW1wbGluZ0ZhY3RvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYwKTsKKworICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50IC09IHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZTsKKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCA9IChMVk1fVUlOVDE2KShudW1TYW1wbGVzIC0gaWkpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCArPSBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIERvd25TYW1wbGluZ0ZhY3Rvcik7CisKKyAgICB9CisKKyAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCisgICAgKnBEZWxheSA9IFYwOworCisgICAgLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBhZnRlciBsYXN0IGJhbmQgcHJvY2Vzc2luZywKKyAgICAgICB1cGRhdGUgdGhlIHBhcmFtZXRlcnMuICovCisgICAgaWYoQmFuZEluZGV4ID09IChwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVycyAtIDEpKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7CisgICAgICAgIC8qIEFkanVzdG1lbnQgZm9yIDExMDI1SHogaW5wdXQsIDIyMCw1IGlzIG5vcm1hbGx5CisgICAgICAgICAgIHRoZSBleGFjdCBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgMjBtcy4qLworICAgICAgICBpZigocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID09IExWTV9GU18xMTAyNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9PSAyMjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKKyAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7CisgICAgfQorfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDksNCArMzM4LDIzIEBACiAgICAgKnBwV3JpdGUgPSBwV3JpdGU7CiAKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgVmFsdWUgICApCit7CisgICAgTFZNX1VJTlQ4ICpwV3JpdGUgPSAqcHBXcml0ZTsKIAorICAgIC8qIFdyaXRlIHRoZSB2YWx1ZSBhbmQgdXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyICovCisgICAgKihwV3JpdGUgKyBCYW5kSW5kZXgpID0gKExWTV9VSU5UOCkoVmFsdWUgKiAyNTYpOworICAgIHBXcml0ZSArPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIGlmIChwV3JpdGUgPT0gKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgKyBwTFZQU0FfSW5zdC0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkpCisgICAgeworICAgICAgICBwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OworICAgIH0KKworICAgICpwcFdyaXRlID0gcFdyaXRlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKaW5kZXggMjFhNWQ4ZC4uMTI4NzUwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtMzQsNiArMzQsNyBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLworI2lmbmRlZiBISUdIRVJfRlMKIGNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCkBAIC00Myw2ICs0NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyNlbHNlCitjb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNyArNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTQ3OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzEwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOX07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogCiAKQEAgLTg0LDcgKzEwMywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRG93biBzYW1wbGluZyBmYWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAyLDcgKzEyNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMn07ICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjIsOCArMTUxLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTg4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5Mn07ICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTA5OCAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdID0geyAgMC44MDQyODQ3ZiwgICAgICAvKiA4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODM2MDU0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM2MTc5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQwMjE0MjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTE3ODc0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY4MTA1MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIwMTA1NTlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisjZW5kaWYKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KQEAgLTE1OSw2ICsyMTAsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNTc2fTsgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdPXsgIDAuMTc3NzM0Mzc1ZiwgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTIxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjIzNjMyODEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTA5NzY1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MTczODI4MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzE1OTE3OTY4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNTQ0OTIxODdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM5Nzk0OTIxOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQ2Mjg5MDYyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDA5NzY1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MjAxMTcxOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMwODU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDc1MTk1MzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5Mzk0NTMxMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMTEzMjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDAwMDBmLCAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIxNTgyMDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg3ODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQxMjEwOTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0NDcyNjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Nzc4MzIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAwMDAwMDAwMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4MjgxMjUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE3MTg3NTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxODM1OTM3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDc4NTE1NjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjk4MDk1NzAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2Nzk2ODc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE3MTg3NTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjY1MjM0Mzc1MGZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBDb3NvbmUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsNyArMjY1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMzhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwOTg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYwMTk3NzVmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDgxNTE0OWYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MjQyMDQyZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODk2MjA2Zn07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KKyNlbmRpZgogLyoKICAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKICAqCkBAIC0yMDEsNyArMjkzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdID0gezEuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDA4MzExZiwgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDYxNzk5OWYsICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTM0MjgxZn07ICAgICAgICAgICAgICAgIC8qIGEzICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzOSwzICszMzcsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyRTFFOTUwLDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNTgzMzMzMjEyODgyM2YsMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLDAuMDA2NTIyMTY3MDA4MzcwMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2MTQxMzA0NjkwMzkwOGYsMC4wNDI1MDkwODIyMzkxMjEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDcwOTk5NTUzNzk5NjNmLDAuMDQzODcwODU1NTg4NDY1OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsMC4yMjU0NDA5MDI2MzU0NTUxZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzgxNDUxMjA0NDE5MTM2ZiwwLjIyNzkyMDk2NTI5MTU1OTdmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzQxNTE4Njc5MDc0OTQzMWYsMC4yMjU0NDA5MDI2MzU0NTUxZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzMwOTU4MTM1MzMyOTEyMmYsMC4yMzMxNTY4MjI2MjE4MjI0Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggMGQ2MjI3NC4uZTc1Njk1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTM3NCwxMiArMzc0LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKaW5kZXggM2U0OGM3ZS4uMjllM2M5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwpAQCAtNzAsMTEgKzcwLDE3IEBACiB7CiAKICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50OworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW47CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50OworI2VuZGlmCiAgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CiAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisKIAogCiAgICAgLyoKQEAgLTg1LDcgKzkxLDExIEBACiAgICAgICAgICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnN0aW9uICovCiAgICAgICAgICkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSBwUGFyYW1zLT5FZmZlY3RMZXZlbDsKKyNlbHNlCisgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAoKExWTV9GTE9BVClwUGFyYW1zLT5FZmZlY3RMZXZlbCAvIDMyNzY3KTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTAyLDIzICsxMTIsNDYgQEAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogcEluc3RhbmNlLT5UcmFuc2l0aW9uR2Fpbik7CisjZWxzZQorICAgIEdhaW4gPSAgKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKyNlbmRpZgogCiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MTsKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKShHYWluID4+IDE1KSxDdXJyZW50KTsKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgorCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDB4N0ZGRiAtIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKICAgICBHYWluID0gKExWTV9VSU5UMzIpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2FpbiA+PiAxNSk7CiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqICgxLjAgLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKKyAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIEdhaW47CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAoTFZNX0ZMT0FUKShHYWluKSwgQ3VycmVudCk7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisjZW5kaWYKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBoSW5zdGFuY2U7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQ9MTsKQEAgLTEzNCw3ICsxNjcsNyBAQAogICAgICAqIENvcnJlY3QgZ2FpbiBmb3IgdGhlIGVmZmVjdCBsZXZlbAogICAgICAqLwogICAgIHsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW5Db3JyZWN0OwogICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4xOwogICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEdhaW4yOwpAQCAtMTcyLDYgKzIwNSw0MyBAQAogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMj4+MTYpOwogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluQ29ycmVjdDsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMTsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMjsKKworICAgICAgICBHYWluMSA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgR2FpbjIgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgICAgIC8qCisgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgR2FpbkNvcnJlY3QgPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbiAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluRnVsbCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCk7CisgICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpOworCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMik7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwpAQCAtMjA2LDkgKzI3NiwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFVucHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKIHsKIApAQCAtMjIzLDYgKzI5OSw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IHRoZSBieXBhc3MgbWl4CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBVbnByb2Nlc3NlZCwKQEAgLTIzNiw2ICszMTMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKXBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworI2Vsc2UKKyAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopIHBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IG91dHB1dCBnYWluIGNvcnJlY3Rpb24gc2hpZnQKKyAgICAgICAgICovCisgICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAppbmRleCBkMWVmNzBhLi5mNjliYTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCkBAIC00MiwxMiArNDIsMTYgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE91dHB1dF9TaGlmdDsgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW5nIGdhaW4gb3V0cHV0IHNoaWZ0ICovCiAKIH0gTFZDU19CeXBhc3NNaXhfdDsKIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKiBPdXRwdXQgZ2FpbiB0eXBlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNTYsOCArNjAsMTUgQEAKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KIH0gR2Fpbl90OwotCi0KKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIE91dHB1dCBnYWluIHNldHRpbmdzLCBHYWluID0gKExvc3MvMzI3NjgpICogMl5TaGlmdCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2hpZnRzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLworfSBHYWluX3Q7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NywxMyArNzgsMTkgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICpwUGFyYW1zKTsKIAotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICp1blByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICp1blByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKaW5kZXggY2U2ZDQxMC4uM2JmNmVjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCkBAIC0xMjAsMTEgKzEyMCwxMyBAQAogICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKIAogICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOwotCi0KKyNlbmRpZgogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47CiAgICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOwogICAgICAgICAgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIExWTV9NQVhJTlRfMTYpOwpAQCAtMTQwLDcgKzE0MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgIEdhaW47CisgICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4pOwogCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBHYWluID0gKEdhaW4gKiBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbik7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgMCwgR2Fpbik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCmluZGV4IDI1YjBkODYuLmVjNTMxMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKQEAgLTUzLDcgKzUzLDcyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBFcXVhbGlzZXJDb2VmVGFibGU7CisKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGNoYW5nZXMgcmUtaW5pdGlhbGlzZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSArIChwUGFyYW1zLT5TcGVha2VyVHlwZSAqICgxICsgTFZNX0ZTXzQ4MDAwKSkpOworICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewpAQCAtMTEyLDcgKzE3Nyw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0VxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzIsNyArMTk3LDM3IEBACiAvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7CisKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGVxdWFsaXNlciBpcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0T3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQpAQCAtMTU3LDQgKzI1Miw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKaW5kZXggY2Y5NmY1Yi4uMGU3NTZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaApAQCAtMzIsOCArMzIsMTEgQEAKIC8qIEVxdWFsaXNlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgdm9pZCAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQorI2Vsc2UKKyAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLCBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworI2VuZGlmCiB9IExWQ1NfRXF1YWxpc2VyX3Q7CiAKIApAQCAtNDUsMTIgKzQ4LDE1IEBACiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQotCisjZWxzZQorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCmluZGV4IDNlNjQwY2IuLjRmNTIyMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMjQsNyArMjQsNDYzIEBACiAvKiBUaGUgU3RlcmVvIEVuaGFuY2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjc3MjAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxNTEyNQorI2RlZmluZSBDU19NSURETEVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MjE4OTkKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MTE0NDEKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0NAorI2RlZmluZSBDU19TSURFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjMxMDk3CisjZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MjI0NzAKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEzMDc1OQorI2RlZmluZSBDU19TSURFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAorLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDgzOAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjIxNTU5CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk0MzA1NgorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1NzM3MgorI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkxNDkwCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjU4ODEKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg4MDYwOAorI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyMzk3CisjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIxOTEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjk5MzIKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE0MzYKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMC45NDc2MTYKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1ODM5OAorI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkyMjExCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjYxODcKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5MjU1MAorI2RlZmluZSBDU19TSURFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyODU2CisjZGVmaW5lIENTX1NJREVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMzcxICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA2MzgKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNDIzMgorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NjA1NTAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDk5Njk1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNTU1NDMKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE0NDE1MgorI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDUwNzg4CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDQxMDQKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIyODc0OQorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MTI4CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MTI2MgorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQwMTEyCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjYxMDk2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTc5MDE2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTE2Nzg2CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgyNTA3CisjZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxODgyICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDM5NQorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjYxMTcKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MzU3MworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDE0NzcwCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4NzE4MgorI2RlZmluZSBDU19TSURFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjc1ODgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjI5NjQ4CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MjE3NworI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDMyMiAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMjUyMTQKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTgwMTI2CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2NDU3OQorI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA3MzU1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNTcyMjQKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDIzMQorI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzEyNDk1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzNTkzCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMxMjI1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg1NTQ1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjg0NTczCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjU4OTEwCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDI1NjYyCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTcyMjQ4CisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTg4Mzk5CisjZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2NDQwMiAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNDQ0NQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzMjI2MQorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk4NjcxMworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNzI2MDYKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjY2OTUyCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwNTY1NAorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS42MTcxNDEKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNjMwNDA1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNpZmRlZiBISUdIRVJfRlMKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCisvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLworI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzNDQzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk5MzMzNAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTY3MjcKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAxNjcyNworI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS43OTMzNzIKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2CisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNDA2NTYKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk5NjY2MQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg5OTEKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA4OTkxCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMS44OTI1MDkKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjg5MzUyNAorI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBSZXZlcmIgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmV2ZXJiIGRlbGF5IHNldHRpbmdzIGluIHNhbXBsZXMgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haICAgICAgICAgICAgICAgICAgICAgOTMgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haICAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haICAgICAgICAgICAgICAgICAgIDEzOSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haICAgICAgICAgICAgICAgICAgIDE4NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haICAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjY3MjcxCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjgxNzkKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgLTAuNjk5NjM4CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgLTAuNzQ5MDk2CisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAwLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAtMC43MDY5MzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMC43MjgyNzIKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjgyMDY3OQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMC41MTYzOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAtMC41MTYzOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAtMC41MTg1MTIKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAtMC4yOTA5OTAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjQ3OTU2NQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuNjM3NzQ1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAtMC4xOTg5MTIKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMzgwMzQ5CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuOTUwODczCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjA0OTEyNworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTczODkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0MjMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU2NTI5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMjc4NjYxCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS4yNTQ5OTMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjMwMzM0NworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjaWZkZWYgSElHSEVSX0ZTCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjU4NTQxMworI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTk5Mzc3CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjA4NzgzNjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS43NzY1NzY0CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzgwNDA3NgorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2VuZGlmCisKKworLyogUmV2ZXJiIEdhaW4gU2V0dGluZ3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOICAgICAgICAgICAgICAgMC44MDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gICAgICAgICAgICAgIDEuMDAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOICAgICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAgICAgICAgICAgICAxLjAwOTM0MyAgICAgICAgIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBFcXVhbGlzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzg0OTcgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzU0ODAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI2MzMxMgorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuNjAxNzQ4CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4yODA2ODEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjQ3NTg2NQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuNDA4MTU0CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuOTQzMzU3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTAuNDQ5MzQ1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgLTAuMjA5NTk0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgLTAuNDA4MTU0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDI3NzYxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzY3NDYzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMS4xMDExNDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAwLjEzOTAyMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTAuODY0NDIzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgMC4wMjQ1NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgIC0wLjkwODkzMAorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMC45NzYwNTgKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgLTAuNjk1MzI2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgIC0wLjA5MDgwOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAtMC42MTA1OTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuMzExMTQ5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDMyNTIxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcxMDE3ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAxLjI3NjY2MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMS4wMTc1MTkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDQ0MTI4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyOTYxNgorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMC4yMDQ1MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgIDEuMDA3MDk1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgIC0wLjg3MTkxMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgMC4wMjMyMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgLTAuNzQ1ODU3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgIC0wLjE4OTE3MQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI4MTYyOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xLjA3NTg3MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjA0MTM2NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjcyNTIzOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjIyNDM1OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMDgxMDkxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAtMC44NjcxODMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgIC0wLjA3MDI0NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNTE1MTIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAtMC40MjU4OTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMzg4NjA1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjMwNTc5OQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4wMzk5MjIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNzE5NDk0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjI0MzI0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjI3MjkxMAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjM0MTAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjE2NzQ2MgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0wLjYxNDIxOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjM0NTM4NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNDA5ODMyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAtMS40NTY1MDYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjE1MTQxMAorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgLTAuODA0MjAxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC4xNjM3ODMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAxLjI5OTE5OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgLTEuNDUyNDQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgMC4yNDA0ODkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjY2OTMwMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMjk0OTg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuNTYwOTg4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuODc3NzI0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMzg5NzQxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTA3NDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMDcwNDg5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgMS43ODUwNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgIC0yLjIzMzQ5NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgIDAuNTI2NDMxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAtMC40NDU5MzkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjUyMjQ0NgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAyMjE3MCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MzI4OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAxLjYyMzk5MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgIC0yLjI3MDc0MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAwLjY4ODgyOQorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgIC0xLjExNzE5MAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAwLjEzMDIwOAorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAyLjAyODMxNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgIC0yLjg4MjQ1OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAwLjkwNDUzNQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjU5MzMwOAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIC0wLjM4NTgxNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAxODYzNSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MDY0OCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNjQxMTc3CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMi4zNjQ2ODcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjc1OTkxMAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuMTY2Nzc0CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC4xNzgwNzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAyLjA5OTY1NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgLTMuMDY1MjIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgMS4wMTA0MTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjYzNDAyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMzQ3MzMyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNzg0NDk3CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy4wMDE0MzUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgLTEuNDc3ODA0CisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC40ODEzNjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAyLjc1NzMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgIC00LjY3MjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAxLjkzMTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjk3MTcxOAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuMDIxMjE2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy40NTYxNDAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS41Njk4NjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS43MDA3OTgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC43MDE4MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgIDMuNDI3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgIC02LjI5MzYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgMi44NzIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgLTEuMzEwNzQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAwLjMxMzEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworI2VuZGlmCisKKworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgICAgIDAuODQ3NzczNSAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgICAwLjIwODc0NjUgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMC41NjkyMjUgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgIDAuMDc3OTQ0MjUgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNlbHNlCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLwogI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI3NzIwICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC03MDQ5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE1MTI1ICovCkBAIC0zOTQsNSArODUwLDYgQEAKICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLwogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAxODYwMCAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgIDUxMDggICAgICAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLwotCiAjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwppbmRleCAxOTA0ZTQ2Li5kNGM3NjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKQEAgLTk4LDcgKzk4LDEzIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLworICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZDU19TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlCiAgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWQ1NfU0NSQVRDSEJVRkZFUlMqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWQ1NfU0NSQVRDSDsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtMTkwLDYgKzE5Niw3IEBACiAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlICAgICAgICAgICAgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgICAgICAgICAgICA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluICAgICAgICA9IDA7CisKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CiAgICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKaW5kZXggZjNhZGI4ZC4uYTk3ZTRmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCkBAIC05NSwxMCArOTUsMTcgQEAKIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICBDb21wRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMTAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBDb21wTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMCUgZWZmZWN0ICovCiAgICAgTFZNX0lOVDE2ICAgR2FpbkZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMTAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBHYWluTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAwJSBlZmZlY3QgKi8KKyNlbmRpZgogfSBMVkNTX1ZvbENvcnJlY3RfdDsKIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCkBAIC0xMTIsOCArMTE5LDEzIEBACiAgICAgLyogUHJpdmF0ZSBwYXJhbWV0ZXJzICovCiAgICAgTFZDU19PdXRwdXREZXZpY2VfZW4gICAgT3V0cHV0RGV2aWNlOyAgICAgICAvKiBTZWxlY3RlZCBvdXRwdXQgZGV2aWNlIHR5cGUgKi8KICAgICBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICBWb2xDb3JyZWN0OyAgICAgICAgIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHNldHRpbmdzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVHJhbnNpdGlvbkdhaW47ICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDb21wcmVzc0dhaW47ICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisjZW5kaWYKIAogICAgIC8qIFN1Yi1ibG9jayBjb25maWd1cmF0aW9ucyAqLwogICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgIFN0ZXJlb0VuaGFuY2VyOyAgICAgLyogU3RlcmVvIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEzNCwyNCArMTQ2LDM1IEBACiAvKiBDb2VmZmljaWVudCBTdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwotCisjZW5kaWYKIH0gTFZDU19Db2VmZmljaWVudF90OwogCiAvKiBEYXRhIFN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IEVxdWFsaXNlckJpcXVhZFRhcHM7CisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgUmV2ZXJiQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNNaWQ7CisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzU2lkZTsKKyNlbHNlCiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOwotCisjZW5kaWYKIH0gTFZDU19EYXRhX3Q7CiAKLQogdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKCAgIHZvaWQqIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKaW5kZXggNWQ5OTQ2MS4uMzk1NmQ0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCkBAIC02Niw3ICs2Niw3NyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3NfQ1MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbnB1dDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CiAKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBwcm9jZXNzaW5nIGlzIGlucGxhY2UKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnVtU2FtcGxlcyk7CisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFByb2Nlc3Npbmcgb3V0cGxhY2UgKi8KKyAgICAgICAgcElucHV0ID0gcEluRGF0YTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCisgICAgICovCisgICAgZXJyID0gTFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisgICAgCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBlcXVhbGlzZXIKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4ZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCAodW5wcm9jZXNzZWQpIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMTMzLDcgKzIwMyw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjAsNyArMjMwLDE3MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKKyAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKKyAgICAgICAgICovCisgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworCisgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpKSk7CisKKyAgICAgICAgICAgIGlmKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgR2FpblN0ZXA7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOworICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBPdXRQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCisKKyAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fRkxPQVQpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NPTVBHQUlORlJBTUUpIC8gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47CisgICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOworICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKKworICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoR2FpbiArIEdhaW5TdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkgJiYgKEZpbmFsR2FpbiA8PSBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA8IDApICYmIChGaW5hbEdhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKFNhbXBsZVRvUHJvY2VzcyA+IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSAoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MgLSBMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIFNhbXBsZVRvUHJvY2VzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdG9yZSBnYWluIHZhbHVlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTMyMSwxMyArNTU0LDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCi0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYwppbmRleCBlZTI1N2I4Li4xMDg1MTAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCkBAIC01Nyw3ICs1Nyw5OCBAQAogLyogIDIuICBUaGUgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlsdGVyIGFyZSBuZWdhdGVkIHRvIGNhdXNlIGFuIGludmVyc2lvbi4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRGVsYXk7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICpwUmV2ZXJiQ29lZlRhYmxlOworCisKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgorICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAorICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBkZWxheQorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVycworICAgICAgICAgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKyAgICAgICAgcFJldmVyYkNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19SZXZlcmJDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlJldmVyYkJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBtaXhlcgorICAgICAgICAgKi8KKyAgICAgICAgcENvbmZpZy0+UHJvY0dhaW4gPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlBST0MpOworICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluICA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgIFJldmVyYlBlcmNlbnRhZ2UgPSA4Mzg4NjsgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKKyAgICB9CisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKIHsKQEAgLTE0MCw3ICsyMzEsNyBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19SZXZlcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTc5LDcgKzI3MCw5MSBAQAogLyogIDIuICBUaGUgR2FpbiBpcyBjb21iaW5lZCB3aXRoIHRoZSBMUEYgYW5kIGluY29ycG9yYXRlZCBpbiB0byB0aGUgY29lZmZpY2llbnRzICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQorewogCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHM7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilcCisgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilcCisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBpbiBvdXRwbGFjZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZXZlcmIgbm90IHJlcXVpcmVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHJldmVyYiBpcyByZXF1aXJlZAorICAgICAqLworICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLworICAgIGlmICgoKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfSEVBRFBIT05FKSB8fCBcCisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19FWF9IRUFEUEhPTkVTKSB8fAorICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVkNTX1NURVJFTykpICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHZhbGlkYXRpb24gdGVzdGluZyAqLworICAgICAgICAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1JFVkVSQlNXSVRDSCkgIT0wKSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIEZpbHRlciB0aGUgZGF0YQorICAgICAgICAgKi8KKyAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIE11bHQzc19GbG9hdCggKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGRlbGF5IG1peAorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXlNaXhfRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPkRlbGF5T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI1Nyw4ICs0MzIsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKaW5kZXggNmUwMjZmZi4uNjk4OTJiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApAQCAtNTgsMTQgKzU4LDIwIEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIERlbGF5T2Zmc2V0OwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBQcm9jR2FpbjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVW5wcm9jR2FpbjsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMipMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKLQogICAgIC8qIFJldmVyYiBMZXZlbCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKLQogICAgIC8qIEZpbHRlciAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQorI2Vsc2UKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisgICAgLyogUmV2ZXJiIExldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOworICAgIC8qIEZpbHRlciAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworI2VuZGlmCiB9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3Q7CiAKIApAQCAtNzcsMTIgKzgzLDE3IEBACiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgKnBQYXJhbXMpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKaW5kZXggYjliOGIwNS4uMjk5MmMzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKQEAgLTQ5LDcgKzQ5LDEwMyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKIAorICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKKyAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOworCisKKyAgICBwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICovCisgICAgICAgIC8qIE1pZCBmaWx0ZXIgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNNaWQuQjEgPSAoTFZNX0ZMT0FUKS1MVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQjE7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLCAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+U0VCaXF1YWRUYXBzTWlkKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisKKyAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNNaWQpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBpZihMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uU2NhbGUgPT0gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQgID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgIH0KKworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7CisgICAgICAgIHBTRVNpZGVDb2VmcyA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19TRVNpZGVDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBTRVNpZGVDb2Vmc1tPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewpAQCAtMTM4LDcgKzIzNCw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzcsNyArMjczLDkwIEBACiAvKiAgMS4gIFRoZSBzaWRlIGZpbHRlciBpcyBub3QgdXNlZCBpbiBNb2JpbGUgU3BlYWtlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfU1RFUkVPRU5IQU5DRVNXSVRDSCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gc3RlcmVvIHRvIG1pZGRsZSBhbmQgc2lkZQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9NU19GbG9hdChwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KilcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwQ29uZmlnLT5NaWRHYWluLCAgICAgIC8qIEdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyIHRoZSBzaWRlIHNpZ25hbCBvbmx5IGluIHN0ZXJlbyBtb2RlIGZvciBoZWFkcGhvbmVzCisgICAgICAgICAqIGFuZCBpbiBhbGwgbW9kZXMgZm9yIG1vYmlsZSBzcGVha2VycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVkNTX1NURVJFTykKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBtaWRkbGUgYW5kIHNpZGUgdG8gc3RlcmVvCisgICAgICAgICAqLworICAgICAgICBNU1RvMmlfU2F0X0Zsb2F0KHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjU0LDcgKzQzMyw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCmluZGV4IDE1YmM0MDcuLjQxMjVmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCkBAIC00MywxOCArNDMsMzEgQEAKIC8qIFN0ZXJlbyBlbmhhbmNlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAvKgogICAgICAqIE1pZGRsZSBmaWx0ZXIKICAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKLQogICAgIC8qCiAgICAgICogU2lkZSBmaWx0ZXIKICAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisjZWxzZQorICAgIC8qCisgICAgICogTWlkZGxlIGZpbHRlcgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKIAotICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCi0KKyAgICAvKgorICAgICAqIFNpZGUgZmlsdGVyCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfU2lkZSkoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLworI2VuZGlmCiB9IExWQ1NfU3RlcmVvRW5oYW5jZXJfdDsKIAogCkBAIC02NywxMiArODAsMTcgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpOwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQotCisjZWxzZQorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggOTc0ZGUyMS4uZTE1NGUyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzEsNyArNzEsMTkgQEAKICAgICB7Q1NfTUlERExFXzQ4MDAwX0EwLCAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfNDgwMDBfQTEsCiAgICAgIENTX01JRERMRV80ODAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80ODAwMF9TQ0FMRX19OworICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfOTYwMDBfQTEsCisgICAgIENTX01JRERMRV85NjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xOTIwMDBfQTAsICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTkyMDAwX0ExLAorICAgICBDU19NSURETEVfMTkyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgorICAgIH07CiAKIC8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgc2lkZSBmaWx0ZXIgKi8KIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXSA9IHsKQEAgLTEzMCw2ICsxNDIsMjEgQEAKICAgICAgQ1NfU0lERV80ODAwMF9CMSwKICAgICAgQ1NfU0lERV80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgICwKKyAgICAge0NTX1NJREVfOTYwMDBfQTAsICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV85NjAwMF9BMSwKKyAgICAgQ1NfU0lERV85NjAwMF9BMiwKKyAgICAgQ1NfU0lERV85NjAwMF9CMSwKKyAgICAgQ1NfU0lERV85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfOTYwMDBfU0NBTEV9LAorICAgICB7Q1NfU0lERV8xOTIwMDBfQTAsICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTkyMDAwX0ExLAorICAgICBDU19TSURFXzE5MjAwMF9BMiwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjEsCisgICAgIENTX1NJREVfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMTk1LDYgKzIyMiwyMCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjEsCiAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKKyNlbmRpZgogCiAgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCiAgICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjUxLDYgKzI5MiwyMSBAQAogICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCisgICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTMzNCw2ICszOTAsMjEgQEAKICAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IxLAogICAgICBDU19SRVZFUkJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCisgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAorICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0zODUsNiArNDU2LDI0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW10gPSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9CisjZWxzZQogICAgIHsxNDIwMCwgICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwogICAgICAwLAogICAgICA0MDk2LApAQCAtNDAxLDYgKzQ5MCw3IEBACiAgICAgIDAsCiAgICAgIDQwOTYsCiAgICAgIDU3ODZ9CisjZW5kaWYKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MTgsOCArNTA4LDI1IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNlbmRpZgogCi0KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCit9OworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbOV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKQEAgLTQyOCwxNSArNTM1LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMAorfTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorCQkJCQkJCQkJCQkgIDEyMDAwLAorCQkJCQkJCQkJCQkgIDE2MDAwLAorCQkJCQkJCQkJCQkgIDIyMDUwLAorCQkJCQkJCQkJCQkgIDI0MDAwLAorCQkJCQkJCQkJCQkgIDMyMDAwLAorCQkJCQkJCQkJCQkgIDQ0MTAwLAorCQkJCQkJCQkJCQkgIDQ4MDAwLAorCQkJCQkJCQkJCQkgIDk2MDAwLAorCQkJCQkJCQkJCQkgIDE5MjAwMAorfTsKKyNlbHNlCitjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLApAQCAtNDQ0LDUgKzU2Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCmluZGV4IGVmZDMwZmIuLmYxMDZhYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTEwLDcgKzEwLDcgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlCdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gbGliYnVuZGxld3JhcHBlcgpAQCAtNDMsNyArNDMsNyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogICAgIFJldmVyYi9FZmZlY3RSZXZlcmIuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJyZXZlcmJ3cmFwcGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCAxZmRkZjljLi5hYWU4MGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE0LDcgKzE0LDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KKyNpZm5kZWYgTFZNX0ZMT0FUCit0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKKyNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJCdW5kbGUiCiAjZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMjk3LDcgKzI5OSwxMCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKKyNlbmRpZgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgICAgIH0KQEAgLTQ2NSw2ICs0NzAsMTQgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgfQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBkZWxldGUgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwogICAgIH0KQEAgLTcyMSw3ICs3MzQsNDcgQEAKICAgICByZXR1cm4gMDsKIH0gICAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIExWTV9JTlQzMiB0ZW1wOwogCisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgoKnNyYykgKiAzMjc2OC4wZik7CisgICAgICAgIGlmICh0ZW1wID49IDMyNzY3KSB7CisgICAgICAgICAgICAqZHN0ID0gMzI3Njc7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8PSAtMzI3NjgpIHsKKyAgICAgICAgICAgICpkc3QgPSAtMzI3Njg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9wcm9jZXNzKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzM5LDcgKzc5Miw5OSBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgQlVJTERfRkxPQVQKK2ludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewogCisKKyAgICAvL0xWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0VG1wOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9IChMVk1fRkxPQVQgKiltYWxsb2MoZnJhbWVDb3VudCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgfQorCisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwpKSB7CisgICAgICAgIEFMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZmxvYXQgYnVmZmVyJ3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7CisgICAgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOworCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpeworICAgICAgICBwT3V0VG1wID0gcE91dDsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICE9IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBwT3V0VG1wID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgaW52YWxpZCBhY2Nlc3MgbW9kZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgI2VuZGlmCisKKyAgICAvKiBDb252ZXJ0aW5nIGlucHV0IGRhdGEgZnJvbSBmaXhlZCBwb2ludCB0byBmbG9hdCBwb2ludCAqLworICAgIEludDE2VG9GbG9hdChwSW4sIHBJbnB1dEJ1ZmYsIGZyYW1lQ291bnQgKiAyKTsKKworICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLworICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIHBPdXRUbXAsIChMVk1fVUlOVDE2KWZyYW1lQ291bnQgKiAyKTsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgI2VuZGlmCisKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKXsKKyAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLworI2Vsc2UKIGludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCkBAIC03OTcsNyArOTQyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwotCisjZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoKQpAQCAtODY2LDggKzEwMTEsMTIgQEAKICAgICBmbG9hdCBlbmVyZ3lCYXNzQm9vc3QgPSAwOwogICAgIGZsb2F0IGNyb3NzQ29ycmVjdGlvbiA9IDA7CiAKKyAgICBib29sIGVxRW5hYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFOworICAgIGJvb2wgYmJFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFOworICAgIGJvb2wgdmlFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRTsKKwogICAgIC8vRVEgY29udHJpYnV0aW9uCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CiAgICAgICAgICAgICBmbG9hdCBiYW5kQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtpXTsKQEAgLTg5MywzNSArMTA0MiwzNyBAQAogICAgICAgICB9CiAgICAgICAgIGJhbmRGYWN0b3JTdW0gLT0gMS4wOwogICAgICAgICBpZiAoYmFuZEZhY3RvclN1bSA+IDApCi0gICAgICAgICAgICBjcm9zc0NvcnJlY3Rpb24gPSBiYW5kRmFjdG9yU3VtICogMC43OworICAgICAgICAgIGNyb3NzQ29ycmVjdGlvbiA9IGJhbmRGYWN0b3JTdW0gKiAwLjc7CiAgICAgfQogCiAgICAgLy9CYXNzQm9vc3QgY29udHJpYnV0aW9uCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgIGlmIChiYkVuYWJsZWQpIHsKICAgICAgICAgZmxvYXQgYm9vc3RGYWN0b3IgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpLzEwMDAuMDsKICAgICAgICAgZmxvYXQgYm9vc3RDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQ7CiAKICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJvb3N0RmFjdG9yICogYm9vc3RDb2VmZmljaWVudCAqIGJvb3N0Q29lZmZpY2llbnQ7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOwotICAgICAgICAgICAgZmxvYXQgYmFuZENyb3NzQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbaV07Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYm9vc3RGYWN0b3IgKiBiYW5kRmFjdG9yICoKKyAgICAgICAgaWYgKGVxRW5hYmxlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kQ3Jvc3NDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYm9vc3RGYWN0b3IgKiBiYW5kRmFjdG9yICoKICAgICAgICAgICAgICAgICAgICAgYmFuZENyb3NzQ29lZmZpY2llbnQ7Ci0gICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApCi0gICAgICAgICAgICAgICAgZW5lcmd5QmFzc0Jvb3N0ICs9IGJhbmRFbmVyZ3k7CisgICAgICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQorICAgICAgICAgICAgICAgICAgZW5lcmd5QmFzc0Jvb3N0ICs9IGJhbmRFbmVyZ3k7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvL1ZpcnR1YWxpemVyIGNvbnRyaWJ1dGlvbgotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgaWYgKHZpRW5hYmxlZCkgewogICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiAqCiAgICAgICAgICAgICAgICAgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKICAgICB9CiAKICAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0gc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLQogICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uOwotICAgIEFMT0dWKCIgVE9UQUwgZW5lcmd5IGVzdGltYXRpb246ICUwLjJmIiwgdG90YWxFbmVyZ3lFc3RpbWF0aW9uKTsKKyAgICBBTE9HVigiIFRPVEFMIGVuZXJneSBlc3RpbWF0aW9uOiAlMC4yZiBkQiIsIHRvdGFsRW5lcmd5RXN0aW1hdGlvbik7CiAKICAgICAvL3JvdW5kb2ZmCiAgICAgaW50IG1heExldmVsUm91bmQgPSAoaW50KSh0b3RhbEVuZXJneUVzdGltYXRpb24gKyAwLjk5KTsKQEAgLTkzOSw2ICsxMDkwLDggQEAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2xpbWl0TGV2ZWwiKQorCisgICAgQUxPR1YoIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyByZXR1cm46JWQiLCAoaW50KUx2bVN0YXR1cyk7CiAgICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKQEAgLTExNTIsNiArMTMwNSwxNiBAQAogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gNDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbwogICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDk2MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gOTYwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTc5LDYgKzEzNDIsOCBAQAogICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CisKICAgICB9ZWxzZXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOwogICAgIH0KQEAgLTM2NjksMTAgKzM4MzQsMTAgQEAKICAgICAgICAgICAgIGlmKHJpZ2h0ZEIgPiBtYXhkQil7CiAgICAgICAgICAgICAgICAgbWF4ZEIgPSByaWdodGRCOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgU2Vzc2lvbjogJWQsIFNlc3Npb25JRDogJWQgVk9MVU1FIGlzICVkIGRCICglZCksICIKKyAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FIFNlc3Npb246ICVkLCBTZXNzaW9uSUQ6ICVkIFZPTFVNRSBpcyAlZCBkQiwgIgogICAgICAgICAgICAgLy8gICAgICAiZWZmZWN0IGlzICVkIiwKICAgICAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQsCi0gICAgICAgICAgICAvLyhpbnQzMl90KW1heGRCLCBtYXhWb2w8PDcsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgICAgIC8vKGludDMyX3QpbWF4ZEIsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0IGlzICVkLCBSaWdodCBpcyAlZCIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0ICVkZEIsIFJpZ2h0ICVkZEIsIFBvc2l0aW9uICVkZEIiLAogICAgICAgICAgICAgLy8gICAgICAgIGxlZnRkQiwgcmlnaHRkQiwgcGFuZEIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCBlZTYwNGViLi4yOTEzODNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMTAzLDYgKzEwMywxMCBAQAogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOwogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKICAgICAjZW5kaWYKKyAgICAjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRCdWZmZXI7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmZlcjsKKyAgICAjZW5kaWYKIH07CiAKIC8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KQEAgLTIwOSw3ICsyMTMsNyBAQAogc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7CiAgICAgICAgIDIyMS4yMSwgMjA4LjEwLCAyOC4xNiwgMC4wLCAwLjAgfTsKIAotc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQgPSA3LjEyOworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQgPSA5LjAwOwogCiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiA9IDEuOTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggZWM2MjQzYS4uM2Q4ZTk4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0xNCw3ICsxNCw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIExWTV9GTE9BVAordHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7CisjZW5kaWYKICNkZWZpbmUgTE9HX1RBRyAiUmV2ZXJiIgogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIChhcnJheSkgLyBzaXplb2YgKGFycmF5KVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTE1Miw2ICsxNTQsOCBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpJbkZyYW1lczMyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgKk91dEZyYW1lczMyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZU91dDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldDsKICAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIGN1clByZXNldDsKQEAgLTE3Miw4ICsxNzYsMTEgQEAKIAogI2RlZmluZSBSRVZFUkJfREVGQVVMVF9QUkVTRVQgUkVWRVJCX1BSRVNFVF9OT05FCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFJFVkVSQl9TRU5EX0xFVkVMICAgMC43NWYgLy8gMC43NSBpbiA0LjEyIGZvcm1hdAorI2Vsc2UKICNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAoMHgwQzAwKSAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZW5kaWYKICNkZWZpbmUgUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKIAogLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwpAQCAtMjcwLDggKzI3NywxNSBAQAogCiAKICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJldmVyYiBwcm9jZXNzICgqMiBpcyBmb3IgU1RFUkVPKQotICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwotICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOworI2Vsc2UKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDI7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBwQ29udGV4dC0+YnVmZmVyU2l6ZUluOworI2VuZGlmCisgICAgcENvbnRleHQtPkluRnJhbWVzMzIgID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlenUiLCBwQ29udGV4dCwgc2l6ZW9mKFJldmVyYkNvbnRleHQpKTsKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kXG4iKTsKQEAgLTI5Myw2ICszMDcsOCBAQAogICAgICNlbmRpZgogICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOwogICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gMDsKKyAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IDA7CiAgICAgUmV2ZXJiX2ZyZWUocENvbnRleHQpOwogICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICByZXR1cm4gMDsKQEAgLTM4OSw2ICs0MDUsNDYgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQxNkxUT0ZMT0FUCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRvZG86IG5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgSW50MTZUb0Zsb2F0KGNvbnN0IExWTV9JTlQxNiAqc3JjLCBMVk1fRkxPQVQgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICpkc3QgPSAoKExWTV9GTE9BVCkoKExWTV9JTlQxNikqc3JjKSkgLyAzMjc2OC4wZjsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRkxPQVRUT0lOVDE2X1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvIDogTmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCitzdGF0aWMgdm9pZCBGbG9hdFRvSW50MTZfU0FUKGNvbnN0IExWTV9GTE9BVCAqc3JjLCBMVk1fSU5UMTYgKmRzdCwgc2l6ZV90IG4pIHsKKyAgICBzaXplX3QgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBuOyBpaSsrKSB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgoKnNyYykgKiAzMjc2OC4wZik7CisgICAgICAgIGlmICh0ZW1wID49IDMyNzY3KSB7CisgICAgICAgICAgICAqZHN0ID0gMzI3Njc7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8PSAtMzI3NjgpIHsKKyAgICAgICAgICAgICpkc3QgPSAtMzI3Njg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIHNyYysrOworICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQogewogICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCkBAIC00MjIsOCArNDc4LDMxIEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTsKICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBMVk1fSU5UMTYgKk91dEZyYW1lczE2OworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmOworI2VuZGlmCiAKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMikgeworICAgICAgICBpZiAocENvbnRleHQtPk91dEZyYW1lczMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMjsKKyAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CisgICAgfQorICAgIHBJbnB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+SW5GcmFtZXMzMjsKKyAgICBwT3V0cHV0QnVmZiA9IChmbG9hdCAqKXBDb250ZXh0LT5PdXRGcmFtZXMzMjsKKyNlbmRpZgogICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewogICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAyOwpAQCAtNDQ5LDQ5ICs1MjgsODQgQEAKICAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOwogICAgIH0KIAotCi0KICAgICAvLyBDb252ZXJ0IHRvIElucHV0IDMyIGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEludDE2VG9GbG9hdChwSW4sIHBJbnB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBzYW1wbGVzUGVyRnJhbWUpOworI2Vsc2UKICAgICAgICAgZm9yKGludCBpPTA7IGk8ZnJhbWVDb3VudCpzYW1wbGVzUGVyRnJhbWU7IGkrKyl7CiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMltpXSA9IChMVk1fSU5UMzIpcEluW2ldPDw4OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaV0gPSAocEluWzIqaV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgorI2Vsc2UKKyAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGldID0gKExWTV9GTE9BVClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGkgKyAxXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnByZXNldCAmJiBwQ29udGV4dC0+Y3VyUHJlc2V0ID09IFJFVkVSQl9QUkVTRVRfTk9ORSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIG1lbXNldChwT3V0cHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisjZWxzZQogICAgICAgICBtZW1zZXQocENvbnRleHQtPk91dEZyYW1lczMyLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UgJiYgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgbWVtc2V0KHBJbnB1dEJ1ZmYsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZWxzZQogICAgICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5JbkZyYW1lczMyLDAsZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbmRpZgogICAgICAgICAgICAgQUxPR1YoIlx0WmVyb2luZyAlZCBzYW1wbGVzIHBlciBmcmFtZSBhdCB0aGUgZW5kIG9mIGNhbGwiLCBzYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICB9CiAKICAgICAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcywgcHJvZHVjaW5nIGEgc3RlcmVvIG91dHB1dCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmLCAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyNlbHNlCiAgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiwgICAgIC8qIElucHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgIH0KKyNlbmRpZgorICAgICAgICB9CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfUHJvY2VzcyIsICJwcm9jZXNzIikKICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIE91dEZyYW1lczE2LCAoc2l6ZV90KWZyYW1lQ291bnQgKiAyKTsKKyNlbHNlCiAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCiAgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCkgKyAoTFZNX0lOVDMyKXBJbltpXSk7Ci0gICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspIHsvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgICAgIC8vcE91dHB1dEJ1ZmYgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlciwgc28gYmV0dGVyIHRvCisgICAgICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIHBJbnB1dEJ1ZmYsIHdoaWNoIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZbaV0gPSBwT3V0cHV0QnVmZltpXSArIChMVk1fRkxPQVQpcEluW2ldIC8gMzI3NjguMGY7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEZsb2F0VG9JbnQxNl9TQVQocElucHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOworI2Vsc2UKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGZyYW1lQ291bnQqMjsgaSsrKSB7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOworICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCkBAIC02NDQsNiArNzU4LDE0IEBACiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA5NjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOworICAgICAgICBicmVhazsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dWKCJcclJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDExLDcgKzExMzMsNyBAQAogICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKICAgICAvLyAgICAgImNvbnZlcnRlZCBsZXZlbDogJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwsIGxldmVsKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpeworICAgIGlmKChpbnQxNl90KUFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icCBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDVhNGViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliaGVpZiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJIZWlmRGVjb2RlckltcGwuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFtdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyMDllMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtMCwwICsxLDQ0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSGVpZkRlY29kZXJJbXBsIgorCisjaW5jbHVkZSAiSGVpZkRlY29kZXJJbXBsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitIZWlmRGVjb2RlciogY3JlYXRlSGVpZkRlY29kZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpIZWlmRGVjb2RlckltcGwoKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogSGVpZkRhdGFTb3VyY2UKKyAqCisgKiBQcm94aWVzIGRhdGEgcmVxdWVzdHMgb3ZlciBJRGF0YVNvdXJjZSBpbnRlcmZhY2UgZnJvbSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyCisgKiB0byB0aGUgSGVpZlN0cmVhbSBpbnRlcmZhY2Ugd2UgcmVjZWl2ZWQgZnJvbSB0aGUgaGVpZiBkZWNvZGVyIGNsaWVudC4KKyAqLworY2xhc3MgSGVpZkRhdGFTb3VyY2UgOiBwdWJsaWMgQm5EYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICAvKgorICAgICAqIENvbnN0cnVjdHMgSGVpZkRhdGFTb3VyY2U7IHdpbGwgdGFrZSBvd25lcnNoaXAgb2YgfHN0cmVhbXwuCisgICAgICovCisgICAgSGVpZkRhdGFTb3VyY2UoSGVpZlN0cmVhbSogc3RyZWFtKQorICAgICAgICA6IG1TdHJlYW0oc3RyZWFtKSwgbUVPUyhmYWxzZSksCisgICAgICAgICAgbUNhY2hlZE9mZnNldCgwKSwgbUNhY2hlZFNpemUoMCksIG1DYWNoZUJ1ZmZlclNpemUoMCkge30KKworICAgIH5IZWlmRGF0YVNvdXJjZSgpIG92ZXJyaWRlIHt9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemVzIGludGVybmFsIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBib29sIGluaXQoKTsKKworICAgIHNwPElNZW1vcnk+IGdldElNZW1vcnkoKSBvdmVycmlkZSB7IHJldHVybiBtTWVtb3J5OyB9CisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QqIHNpemUpIG92ZXJyaWRlIDsKKyAgICB2b2lkIGNsb3NlKCkge30KKyAgICB1aW50MzJfdCBnZXRGbGFncygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgiSGVpZkRhdGFTb3VyY2UiKTsgfQorICAgIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQnVmZmVyIHNpemUgZm9yIHBhc3NpbmcgdGhlIHJlYWQgZGF0YSB0byBtZWRpYXNlcnZlci4gU2V0IHRvIDY0SworICAgICAgICAgKiAod2hpY2ggaXMgd2hhdCBNZWRpYURhdGFTb3VyY2UgSmF2YSBBUEkncyBqbmkgaW1wbGVtZW50YXRpb24gdXNlcykuCisgICAgICAgICAqLworICAgICAgICBrQnVmZmVyU2l6ZSA9IDY0ICogMTAyNCwKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdGlhbCBhbmQgbWF4IGNhY2hlIGJ1ZmZlciBzaXplLgorICAgICAgICAgKi8KKyAgICAgICAga0luaXRpYWxDYWNoZUJ1ZmZlclNpemUgPSA0ICogMTAyNCAqIDEwMjQsCisgICAgICAgIGtNYXhDYWNoZUJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAorICAgIH07CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SGVpZlN0cmVhbT4gbVN0cmVhbTsKKyAgICBib29sIG1FT1M7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1DYWNoZTsKKyAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CisgICAgc2l6ZV90IG1DYWNoZWRTaXplOworICAgIHNpemVfdCBtQ2FjaGVCdWZmZXJTaXplOworfTsKKworYm9vbCBIZWlmRGF0YVNvdXJjZTo6aW5pdCgpIHsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9CisgICAgICAgICAgICBuZXcgTWVtb3J5RGVhbGVyKGtCdWZmZXJTaXplLCAiSGVpZkRhdGFTb3VyY2UiKTsKKyAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShrQnVmZmVyU2l6ZSk7CisgICAgaWYgKG1NZW1vcnkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUNhY2hlLnJlc2V0KG5ldyB1aW50OF90W2tJbml0aWFsQ2FjaGVCdWZmZXJTaXplXSk7CisgICAgaWYgKG1DYWNoZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJtRmFpbGVkIHRvIGFsbG9jYXRlIGNhY2hlISIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1DYWNoZUJ1ZmZlclNpemUgPSBrSW5pdGlhbENhY2hlQnVmZmVyU2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3NpemVfdCBIZWlmRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJyZWFkQXQ6IG9mZnNldD0lbGxkLCBzaXplPSV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIGlmIChvZmZzZXQgPCBtQ2FjaGVkT2Zmc2V0KSB7CisgICAgICAgIC8vIHRyeSBzZWVrLCB0aGVuIHJld2luZC9za2lwLCBmYWlsIGlmIG5vbmUgd29ya2VkCisgICAgICAgIGlmIChtU3RyZWFtLT5zZWVrKG9mZnNldCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkQXQ6IHNlZWsgdG8gb2Zmc2V0PSVsbGQiLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgICAgICBtQ2FjaGVkT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgbUNhY2hlZFNpemUgPSAwOworICAgICAgICAgICAgbUVPUyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TdHJlYW0tPnJld2luZCgpKSB7CisgICAgICAgICAgICBBTE9HVigicmVhZEF0OiByZXdpbmQgdG8gb2Zmc2V0PTAiKTsKKyAgICAgICAgICAgIG1DYWNoZWRPZmZzZXQgPSAwOworICAgICAgICAgICAgbUNhY2hlZFNpemUgPSAwOworICAgICAgICAgICAgbUVPUyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoInJlYWRBdDogY291bGRuJ3Qgc2VlayBvciByZXdpbmQhIik7CisgICAgICAgICAgICBtRU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRU9TICYmIChvZmZzZXQgPCBtQ2FjaGVkT2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgIG9mZnNldCA+PSAob2ZmNjRfdCkobUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSkpIHsKKyAgICAgICAgQUxPR1YoInJlYWRBdDogRU9TIik7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIC8vIGF0IHRoaXMgcG9pbnQsIG9mZnNldCBtdXN0IGJlID49IG1DYWNoZWRPZmZzZXQsIG90aGVyIGNhc2VzIHNob3VsZAorICAgIC8vIGhhdmUgYmVlbiBjYXVnaHQgYWJvdmUuCisgICAgQ0hFQ0sob2Zmc2V0ID49IG1DYWNoZWRPZmZzZXQpOworCisgICAgb2ZmNjRfdCByZXN1bHRPZmZzZXQ7CisgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cob2Zmc2V0LCBzaXplLCAmcmVzdWx0T2Zmc2V0KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBDYW4gb25seSByZWFkIG1heCBvZiBrQnVmZmVyU2l6ZQorICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGtCdWZmZXJTaXplOworICAgIH0KKworICAgIC8vIGNvcHkgZnJvbSBjYWNoZSBpZiB0aGUgcmVxdWVzdCBmYWxscyBlbnRpcmVseSBpbiBjYWNoZQorICAgIGlmIChvZmZzZXQgKyBzaXplIDw9IG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkgeworICAgICAgICBtZW1jcHkobU1lbW9yeS0+cG9pbnRlcigpLCBtQ2FjaGUuZ2V0KCkgKyBvZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLy8gbmVlZCB0byBmZXRjaCBtb3JlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgorICAgIGlmICgob2ZmNjRfdCkob2Zmc2V0ICsgc2l6ZSkgPiBtQ2FjaGVkT2Zmc2V0ICsga01heENhY2hlQnVmZmVyU2l6ZSkgeworICAgICAgICAvLyBpdCdzIHJlYWNoaW5nIG1heCBjYWNoZSBidWZmZXIgc2l6ZSwgbmVlZCB0byByb2xsIHdpbmRvdywgYW5kIHBvc3NpYmx5CisgICAgICAgIC8vIGV4cGFuZCB0aGUgY2FjaGUgYnVmZmVyLgorICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG5ld0NhY2hlOworICAgICAgICB1aW50OF90KiBkc3QgPSBtQ2FjaGUuZ2V0KCk7CisgICAgICAgIGlmIChuZXdDYWNoZUJ1ZmZlclNpemUgPCBrTWF4Q2FjaGVCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBuZXdDYWNoZUJ1ZmZlclNpemUgPSBrTWF4Q2FjaGVCdWZmZXJTaXplOworICAgICAgICAgICAgbmV3Q2FjaGUucmVzZXQobmV3IHVpbnQ4X3RbbmV3Q2FjaGVCdWZmZXJTaXplXSk7CisgICAgICAgICAgICBkc3QgPSBuZXdDYWNoZS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdoZW4gcm9sbGluZyB0aGUgY2FjaGUgd2luZG93LCB0cnkgdG8ga2VlcCBhYm91dCBoYWxmIHRoZSBvbGQgYnl0ZXMKKyAgICAgICAgLy8gaW4gY2FzZSB0aGF0IHRoZSBjbGllbnQgZ29lcyBiYWNrLgorICAgICAgICBvZmY2NF90IG5ld0NhY2hlZE9mZnNldCA9IG9mZnNldCAtIChvZmY2NF90KShuZXdDYWNoZUJ1ZmZlclNpemUgLyAyKTsKKyAgICAgICAgaWYgKG5ld0NhY2hlZE9mZnNldCA8IG1DYWNoZWRPZmZzZXQpIHsKKyAgICAgICAgICAgIG5ld0NhY2hlZE9mZnNldCA9IG1DYWNoZWRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IG5ld0NhY2hlZFNpemUgPSAoaW50NjRfdCkobUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSAtIG5ld0NhY2hlZE9mZnNldDsKKyAgICAgICAgaWYgKG5ld0NhY2hlZFNpemUgPiAwKSB7CisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHRoZSBuZXcgY2FjaGUgcmVnaW9uIHBhcnRpYWxseSBvdmVybG9wIHRoZSBvbGQgY2FjaGUsCisgICAgICAgICAgICAvLyBtb3ZlIHRoZSBwb3J0aW9uIG9mIHRoZSBjYWNoZSB3ZSB3YW50IHRvIHNhdmUgdG8gdGhlIGJlZ2lubmluZyBvZgorICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGJ1ZmZlci4KKyAgICAgICAgICAgIG1lbWNweShkc3QsIG1DYWNoZS5nZXQoKSArIG5ld0NhY2hlZE9mZnNldCAtIG1DYWNoZWRPZmZzZXQsIG5ld0NhY2hlZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG5ld0NhY2hlZFNpemUgPCAwKXsKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgdGhlIG5ldyBjYWNoZSByZWdpb24gaXMgZW50aXJlbHkgb3V0IG9mIHRoZSBvbGQgY2FjaGUsCisgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgc2VxdWVudGlhbCByZWFkLCB3ZSBuZWVkIHRvIHNraXAgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIGJ5dGVzIGJlZm9yZSByZWFkaW5nLgorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzVG9Ta2lwID0gLW5ld0NhY2hlZFNpemU7CisgICAgICAgICAgICBzaXplX3QgYnl0ZXNTa2lwcGVkID0gbVN0cmVhbS0+cmVhZChudWxscHRyLCBieXRlc1RvU2tpcCk7CisgICAgICAgICAgICBpZiAoYnl0ZXNTa2lwcGVkICE9IGJ5dGVzVG9Ta2lwKSB7CisgICAgICAgICAgICAgICAgLy8gYnl0ZXNTa2lwcGVkIGlzIGludmFsaWQsIHRoZXJlIGlzIG5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhY2gKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdGVkIG9mZnNldC4KKyAgICAgICAgICAgICAgICBBTE9HRSgicmVhZEF0OiBza2lwIGZhaWxlZCwgRU9TIik7CisKKyAgICAgICAgICAgICAgICBtRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVkT2Zmc2V0ID0gbmV3Q2FjaGVkT2Zmc2V0OworICAgICAgICAgICAgICAgIG1DYWNoZWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNldCBjYWNoZSBzaXplIHRvIDAsIHNpbmNlIHdlJ3JlIG5vdCBrZWVwaW5nIGFueSBvbGQgY2FjaGUKKyAgICAgICAgICAgIG5ld0NhY2hlZFNpemUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0NhY2hlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYWNoZS5yZXNldChuZXdDYWNoZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgbUNhY2hlQnVmZmVyU2l6ZSA9IG5ld0NhY2hlQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGVkT2Zmc2V0ID0gbmV3Q2FjaGVkT2Zmc2V0OworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG5ld0NhY2hlZFNpemU7CisKKyAgICAgICAgQUxPR1YoInJlYWRBdDogcm9sbGluZyBjYWNoZSB3aW5kb3cgdG8gKCVsbGQsICV6dSksIGNhY2hlIGJ1ZmZlciBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ2FjaGVkT2Zmc2V0LCBtQ2FjaGVkU2l6ZSwgbUNhY2hlQnVmZmVyU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZXhwYW5kIGNhY2hlIGJ1ZmZlciwgYnV0IG5vIG5lZWQgdG8gcm9sbCB0aGUgd2luZG93CisgICAgICAgIHNpemVfdCBuZXdDYWNoZUJ1ZmZlclNpemUgPSBtQ2FjaGVCdWZmZXJTaXplOworICAgICAgICB3aGlsZSAob2Zmc2V0ICsgc2l6ZSA+IG1DYWNoZWRPZmZzZXQgKyBuZXdDYWNoZUJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG5ld0NhY2hlQnVmZmVyU2l6ZSAqPSAyOworICAgICAgICB9CisgICAgICAgIENIRUNLKG5ld0NhY2hlQnVmZmVyU2l6ZSA8PSBrTWF4Q2FjaGVCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKG1DYWNoZUJ1ZmZlclNpemUgPCBuZXdDYWNoZUJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIG5ld0NhY2hlID0gbmV3IHVpbnQ4X3RbbmV3Q2FjaGVCdWZmZXJTaXplXTsKKyAgICAgICAgICAgIG1lbWNweShuZXdDYWNoZSwgbUNhY2hlLmdldCgpLCBtQ2FjaGVkU2l6ZSk7CisgICAgICAgICAgICBtQ2FjaGUucmVzZXQobmV3Q2FjaGUpOworICAgICAgICAgICAgbUNhY2hlQnVmZmVyU2l6ZSA9IG5ld0NhY2hlQnVmZmVyU2l6ZTsKKworICAgICAgICAgICAgQUxPR1YoInJlYWRBdDogY3VycmVudCBjYWNoZSB3aW5kb3cgKCVsbGQsICV6dSksIG5ldyBjYWNoZSBidWZmZXIgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtQ2FjaGVkT2Zmc2V0LCBtQ2FjaGVkU2l6ZSwgbUNhY2hlQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2l6ZV90IGJ5dGVzVG9SZWFkID0gb2Zmc2V0ICsgc2l6ZSAtIG1DYWNoZWRPZmZzZXQgLSBtQ2FjaGVkU2l6ZTsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gbVN0cmVhbS0+cmVhZChtQ2FjaGUuZ2V0KCkgKyBtQ2FjaGVkU2l6ZSwgYnl0ZXNUb1JlYWQpOworICAgIGlmIChieXRlc1JlYWQgPiBieXRlc1RvUmVhZCB8fCBieXRlc1JlYWQgPT0gMCkgeworICAgICAgICAvLyBieXRlc1JlYWQgaXMgaW52YWxpZAorICAgICAgICBtRU9TID0gdHJ1ZTsKKyAgICAgICAgYnl0ZXNSZWFkID0gMDsKKyAgICB9IGVsc2UgaWYgKGJ5dGVzUmVhZCA8IGJ5dGVzVG9SZWFkKSB7CisgICAgICAgIC8vIHJlYWQgc29tZSBieXRlcyBidXQgbm90IGFsbCwgc2V0IEVPUworICAgICAgICBtRU9TID0gdHJ1ZTsKKyAgICB9CisgICAgbUNhY2hlZFNpemUgKz0gYnl0ZXNSZWFkOworICAgIEFMT0dWKCJyZWFkQXQ6IGN1cnJlbnQgY2FjaGUgd2luZG93ICglbGxkLCAlenUpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1DYWNoZWRPZmZzZXQsIG1DYWNoZWRTaXplKTsKKworICAgIC8vIGhlcmUgYnl0ZXNBdmFpbGFibGUgY291bGQgYmUgbmVnYXRpdmUgaWYgb2Zmc2V0IGp1bXBlZCBwYXN0IEVPUy4KKyAgICBpbnQ2NF90IGJ5dGVzQXZhaWxhYmxlID0gbUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplIC0gb2Zmc2V0OworICAgIGlmIChieXRlc0F2YWlsYWJsZSA8PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBpZiAoYnl0ZXNBdmFpbGFibGUgPCAoaW50NjRfdClzaXplKSB7CisgICAgICAgIHNpemUgPSBieXRlc0F2YWlsYWJsZTsKKyAgICB9CisgICAgbWVtY3B5KG1NZW1vcnktPnBvaW50ZXIoKSwgbUNhY2hlLmdldCgpICsgb2Zmc2V0IC0gbUNhY2hlZE9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXR1c190IEhlaWZEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QqIHNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0tPmhhc0xlbmd0aCgpKSB7CisgICAgICAgICpzaXplID0gLTE7CisgICAgICAgIEFMT0dFKCJnZXRTaXplOiBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgICpzaXplID0gbVN0cmVhbS0+Z2V0TGVuZ3RoKCk7CisgICAgQUxPR1YoImdldFNpemU6IHNpemU9JWxsZCIsIChsb25nIGxvbmcpKnNpemUpOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitIZWlmRGVjb2RlckltcGw6OkhlaWZEZWNvZGVySW1wbCgpIDoKKyAgICAvLyBvdXRwdXQgY29sb3IgZm9ybWF0IHNob3VsZCBhbHdheXMgYmUgc2V0IHZpYSBzZXRPdXRwdXRDb2xvcigpLCBpbiBjYXNlCisgICAgLy8gaXQncyBub3QsIGRlZmF1bHQgdG8gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LgorICAgIG1PdXRwdXRDb2xvcihIQUxfUElYRUxfRk9STUFUX1JHQl81NjUpLAorICAgIG1DdXJTY2FubGluZSgwKSwKKyAgICBtRnJhbWVEZWNvZGVkKGZhbHNlKSB7Cit9CisKK0hlaWZEZWNvZGVySW1wbDo6fkhlaWZEZWNvZGVySW1wbCgpIHsKK30KKworYm9vbCBIZWlmRGVjb2RlckltcGw6OmluaXQoSGVpZlN0cmVhbSogc3RyZWFtLCBIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIHsKKyAgICBtRnJhbWVEZWNvZGVkID0gZmFsc2U7CisgICAgc3A8SGVpZkRhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgSGVpZkRhdGFTb3VyY2Uoc3RyZWFtKTsKKyAgICBpZiAoIWRhdGFTb3VyY2UtPmluaXQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKworICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOworICAgIHN0YXR1c190IGVyciA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2UsICJ2aWRlby9tcDQiKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworCisgICAgICAgIG1SZXRyaWV2ZXIuY2xlYXIoKTsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IHNldCBkYXRhIHNvdXJjZS4iKTsKKworICAgIGNvbnN0IGNoYXIqIGhhc1ZpZGVvID0gbVJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKE1FVEFEQVRBX0tFWV9IQVNfVklERU8pOworICAgIGlmICghaGFzVmlkZW8gfHwgc3RyY2FzZWNtcChoYXNWaWRlbywgInllcyIpKSB7CisgICAgICAgIEFMT0dFKCJubyB2aWRlbzogJXMiLCBoYXNWaWRlbyA/IGhhc1ZpZGVvIDogIm51bGwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1GcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKDAsCisgICAgICAgICAgICBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBtT3V0cHV0Q29sb3IsIHRydWUgLyptZXRhT25seSovKTsKKyAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVBdFRpbWU6IHZpZGVvRnJhbWUgaXMgYSBudWxscHRyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKworICAgIEFMT0dWKCJNZXRhIGRpbWVuc2lvbiAlZHglZCwgZGlzcGxheSAlZHglZCwgYW5nbGUgJWQsIGljY1NpemUgJWQiLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVdpZHRoLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5V2lkdGgsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUljY1NpemUpOworCisgICAgaWYgKGZyYW1lSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGZyYW1lSW5mby0+c2V0KAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6Z2V0RW5jb2RlZENvbG9yKEhlaWZFbmNvZGVkQ29sb3IqIC8qb3V0Q29sb3IqLykgY29uc3QgeworICAgIEFMT0dXKCJnZXRFbmNvZGVkQ29sb3I6IG5vdCBpbXBsZW1lbnRlZCEiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjpzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSB7CisgICAgc3dpdGNoKGhlaWZDb2xvcikgeworICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfUkdCNTY1OgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV84ODg4OgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2Uga0hlaWZDb2xvckZvcm1hdF9CR1JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1PdXRwdXRDb2xvciA9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIGZvcm1hdCAlZCIsIGhlaWZDb2xvcik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6ZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgeworICAgIC8vIHJlc2V0IHNjYW5saW5lIHBvaW50ZXIKKyAgICBtQ3VyU2NhbmxpbmUgPSAwOworCisgICAgaWYgKG1GcmFtZURlY29kZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKKyAgICAgICAgICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywgbU91dHB1dENvbG9yKTsKKyAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVBdFRpbWU6IHZpZGVvRnJhbWUgaXMgYSBudWxscHRyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBpZiAodmlkZW9GcmFtZS0+bVNpemUgPT0gMCB8fAorICAgICAgICAgICAgbUZyYW1lTWVtb3J5LT5zaXplKCkgPCB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCkpIHsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIHNpemUgaXMgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIkRlY29kZWQgZGltZW5zaW9uICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBhbmdsZSAlZCwgcm93Ynl0ZXMgJWQsIHNpemUgJWQiLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVdpZHRoLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5V2lkdGgsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVJvd0J5dGVzLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVNpemUpOworCisgICAgaWYgKGZyYW1lSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGZyYW1lSW5mby0+c2V0KAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSk7CisgICAgfQorICAgIG1GcmFtZURlY29kZWQgPSB0cnVlOworCisgICAgLy8gQWdncmVzc2l2ZSBjbGVhciB0byBhdm9pZCBob2xkaW5nIG9uIHRvIHJlc291cmNlcworICAgIG1SZXRyaWV2ZXIuY2xlYXIoKTsKKyAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6Z2V0U2NhbmxpbmUodWludDhfdCogZHN0KSB7CisgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBpZiAobUN1clNjYW5saW5lID49IHZpZGVvRnJhbWUtPm1IZWlnaHQpIHsKKyAgICAgICAgQUxPR0UoIm5vIG1vcmUgc2NhbmxpbmUgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDhfdCogc3JjID0gdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpICsgdmlkZW9GcmFtZS0+bVJvd0J5dGVzICogbUN1clNjYW5saW5lKys7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbCAqIHZpZGVvRnJhbWUtPm1XaWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NpemVfdCBIZWlmRGVjb2RlckltcGw6OnNraXBTY2FubGluZXMoc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4obUZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOworCisgICAgdWludDMyX3Qgb2xkU2NhbmxpbmUgPSBtQ3VyU2NhbmxpbmU7CisgICAgbUN1clNjYW5saW5lICs9IGNvdW50OworICAgIGlmIChtQ3VyU2NhbmxpbmUgPiB2aWRlb0ZyYW1lLT5tSGVpZ2h0KSB7CisgICAgICAgIG1DdXJTY2FubGluZSA9IHZpZGVvRnJhbWUtPm1IZWlnaHQ7CisgICAgfQorICAgIHJldHVybiAobUN1clNjYW5saW5lID4gb2xkU2NhbmxpbmUpID8gKG1DdXJTY2FubGluZSAtIG9sZFNjYW5saW5lKSA6IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmggYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTRmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9IRUlGX0RFQ09ERVJfSU1QTF8KKyNkZWZpbmUgX0hFSUZfREVDT0RFUl9JTVBMXworCisjaW5jbHVkZSAiaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOworCisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgSGVpZkRlY29kZXIgYmFzZWQgb24gQW5kcm9pZCdzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuCisgKi8KK2NsYXNzIEhlaWZEZWNvZGVySW1wbCA6IHB1YmxpYyBIZWlmRGVjb2RlciB7CitwdWJsaWM6CisKKyAgICBIZWlmRGVjb2RlckltcGwoKTsKKyAgICB+SGVpZkRlY29kZXJJbXBsKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGluaXQoSGVpZlN0cmVhbSogc3RyZWFtLCBIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIG92ZXJyaWRlOworCisgICAgYm9vbCBnZXRFbmNvZGVkQ29sb3IoSGVpZkVuY29kZWRDb2xvciogb3V0Q29sb3IpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYm9vbCBzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSBvdmVycmlkZTsKKworICAgIGJvb2wgZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgb3ZlcnJpZGU7CisKKyAgICBib29sIGdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgb3ZlcnJpZGU7CisKKyAgICBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHNwPElEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBtUmV0cmlldmVyOworICAgIHNwPElNZW1vcnk+IG1GcmFtZU1lbW9yeTsKKyAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IG1PdXRwdXRDb2xvcjsKKyAgICBzaXplX3QgbUN1clNjYW5saW5lOworICAgIGJvb2wgbUZyYW1lRGVjb2RlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9IRUlGX0RFQ09ERVJfSU1QTF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4M2MzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSEVJRl9ERUNPREVSX0FQSV8KKyNkZWZpbmUgX0hFSUZfREVDT0RFUl9BUElfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qCisgKiBUaGUgb3V0cHV0IGNvbG9yIHBpeGVsIGZvcm1hdCBvZiBoZWlmIGRlY29kZXIuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAga0hlaWZDb2xvckZvcm1hdF9SR0I1NjUgICAgID0gMCwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfODg4OCAgPSAxLAorICAgIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4ICA9IDIsCit9IEhlaWZDb2xvckZvcm1hdDsKKworLyoKKyAqIFRoZSBjb2xvciBzcGFjZXMgZW5jb2RlZCBpbiB0aGUgaGVpZiBpbWFnZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBrSGVpZkVuY29kZWRDb2xvcl9SR0IgPSAwLAorICAgIGtIZWlmRW5jb2RlZENvbG9yX1lVViA9IDEsCisgICAga0hlaWZFbmNvZGVkQ29sb3JfQ01ZSyA9IDIsCit9IEhlaWZFbmNvZGVkQ29sb3I7CisKKy8qCisgKiBSZXByZXNlbnRzIGEgY29sb3IgY29udmVydGVkIChSR0ItYmFzZWQpIHZpZGVvIGZyYW1lCisgKi8KK3N0cnVjdCBIZWlmRnJhbWVJbmZvCit7CisgICAgSGVpZkZyYW1lSW5mbygpIDoKKyAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtUm90YXRpb25BbmdsZSgwKSwgbUJ5dGVzUGVyUGl4ZWwoMCksCisgICAgICAgIG1JY2NTaXplKDApLCBtSWNjRGF0YShudWxscHRyKSB7fQorCisgICAgLy8gdXBkYXRlIHRoZSBmcmFtZSBpbmZvLCB3aWxsIG1ha2UgYSBjb3B5IG9mIHxpY2NEYXRhfCBpbnRlcm5hbGx5CisgICAgdm9pZCBzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50MzJfdCByb3RhdGlvbiwgdWludDMyX3QgYnBwLAorICAgICAgICAgICAgdWludDMyX3QgaWNjU2l6ZSwgdWludDhfdCogaWNjRGF0YSkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uQW5nbGUgPSByb3RhdGlvbjsKKyAgICAgICAgbUJ5dGVzUGVyUGl4ZWwgPSBicHA7CisKKyAgICAgICAgaWYgKG1JY2NEYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1JY2NEYXRhLnJlc2V0KG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIG1JY2NTaXplID0gaWNjU2l6ZTsKKyAgICAgICAgaWYgKGljY1NpemUgPiAwKSB7CisgICAgICAgICAgICBtSWNjRGF0YS5yZXNldChuZXcgdWludDhfdFtpY2NTaXplXSk7CisgICAgICAgICAgICBpZiAobUljY0RhdGEuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1lbWNweShtSWNjRGF0YS5nZXQoKSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEludGVudGlvbmFsIHB1YmxpYyBhY2Nlc3MgbW9kaWZpZXJzOgorICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCisgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAorICAgIHVpbnQzMl90IG1JY2NTaXplOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQorfTsKKworLyoKKyAqIEFic3RyYWN0IGludGVyZmFjZSB0byBwcm92aWRlIGRhdGEgdG8gSGVpZkRlY29kZXIuCisgKi8KK3N0cnVjdCBIZWlmU3RyZWFtIHsKKyAgICBIZWlmU3RyZWFtKCkge30KKworICAgIHZpcnR1YWwgfkhlaWZTdHJlYW0oKSB7fQorCisgICAgLyoKKyAgICAgKiBSZWFkcyBvciBza2lwcyBzaXplIG51bWJlciBvZiBieXRlcy4gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkKKyAgICAgKiByZWFkIG9yIHNraXBwZWQuCisgICAgICogSWYgfGJ1ZmZlcnwgPT0gTlVMTCwgc2tpcCBzaXplIGJ5dGVzLCByZXR1cm4gaG93IG1hbnkgd2VyZSBza2lwcGVkLgorICAgICAqIElmIHxidWZmZXJ8ICE9IE5VTEwsIGNvcHkgc2l6ZSBieXRlcyBpbnRvIGJ1ZmZlciwgcmV0dXJuIGhvdyBtYW55IHdlcmUgY29waWVkLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoKKyAgICAgKiBSZXdpbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMga25vd24KKyAgICAgKiB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXdpbmQoKSA9IDA7CisKKyAgICAvKgorICAgICAqIFNlZWtzIHRvIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoaXMgY2Fubm90IGJlIGRvbmUsIHJldHVybnMgZmFsc2UuCisgICAgICogSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIHRoZSBwb3NpdGlvbiB3aWxsIGJlIHNldAorICAgICAqIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2VlayhzaXplX3QgLypwb3NpdGlvbiovKSA9IDA7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyZWFtIGNhbiByZXBvcnQgaXRzIHRvdGFsIGxlbmd0aC4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgaGFzTGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgLyoqIFJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc3RyZWFtLiBJZiB0aGlzIGNhbm5vdCBiZSBkb25lLCByZXR1cm5zIDAuICovCisgICAgdmlydHVhbCBzaXplX3QgZ2V0TGVuZ3RoKCkgY29uc3QgPSAwOworCitwcml2YXRlOgorICAgIEhlaWZTdHJlYW0oY29uc3QgSGVpZkZyYW1lSW5mbyYpID0gZGVsZXRlOworICAgIEhlaWZTdHJlYW0mIG9wZXJhdG9yPShjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7Cit9OworCisvKgorICogQWJzdHJhY3QgaW50ZXJmYWNlIHRvIGRlY29kZSBoZWlmIGltYWdlcyBmcm9tIGEgSGVpZlN0cmVhbSBkYXRhIHNvdXJjZS4KKyAqLworc3RydWN0IEhlaWZEZWNvZGVyIHsKKyAgICBIZWlmRGVjb2RlcigpIHt9CisKKyAgICB2aXJ0dWFsIH5IZWlmRGVjb2RlcigpIHt9CisKKyAgICAvKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZXNzZnVsbHkgc2V0cyBvdXRDb2xvciB0byB0aGUgZW5jb2RlZCBjb2xvciwKKyAgICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBnZXRFbmNvZGVkQ29sb3IoSGVpZkVuY29kZWRDb2xvciogb3V0Q29sb3IpIGNvbnN0ID0gMDsKKworICAgIC8qCisgICAgICogUmV0dXJucyB0cnVlIGlmIGl0IHN1Y2Nlc3NmdWxseSBzZXRzIHRoZSBvdXRwdXQgY29sb3IgZm9ybWF0IHRvIGNvbG9yLAorICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldE91dHB1dENvbG9yKEhlaWZDb2xvckZvcm1hdCBjb2xvcikgPSAwOworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemUgaGVpZiBkZWNvZGVyIHdpdGggc291cmNlLAorICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuIHxmcmFtZUluZm98IHdpbGwgYmUgZmlsbGVkIHdpdGggaW5mb3JtYXRpb24gb2YKKyAgICAgKiB0aGUgcHJpbWFyeSBwaWN0dXJlIHVwb24gc3VjY2VzcyBhbmQgdW5tb2RpZmllZCB1cG9uIGZhaWx1cmUuCisgICAgICogVGFrZXMgb3duZXJzaGlwIG9mIHxzdHJlYW18IHJlZ2FyZGxlc3Mgb2YgcmVzdWx0LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpbml0KEhlaWZTdHJlYW0qIHN0cmVhbSwgSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSA9IDA7CisKKyAgICAvKgorICAgICAqIERlY29kZSB0aGUgcGljdHVyZSBpbnRlcm5hbGx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuIHxmcmFtZUluZm98CisgICAgICogd2lsbCBiZSBmaWxsZWQgd2l0aCBpbmZvcm1hdGlvbiBvZiB0aGUgcHJpbWFyeSBwaWN0dXJlIHVwb24gc3VjY2VzcyBhbmQKKyAgICAgKiB1bm1vZGlmaWVkIHVwb24gZmFpbHVyZS4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgc3VjY2VlZGVkLCBnZXRTY2FubGluZSBjYW4gYmUgY2FsbGVkIHRvIHJlYWQgdGhlIHNjYW5saW5lcworICAgICAqIHRoYXQgd2VyZSBkZWNvZGVkLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBkZWNvZGUoSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSA9IDA7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIG5leHQgc2NhbmxpbmUgKGluIHRvcC1kb3duIG9yZGVyKSwgcmV0dXJucyB0cnVlIHVwb24gc3VjY2VzcworICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgPSAwOworCisgICAgLyoKKyAgICAgKiBTa2lwIHRoZSBuZXh0IHxjb3VudHwgc2NhbmxpbmVzLCByZXR1cm5zIHRydWUgdXBvbiBzdWNjZXNzIGFuZAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgPSAwOworCitwcml2YXRlOgorICAgIEhlaWZEZWNvZGVyKGNvbnN0IEhlaWZGcmFtZUluZm8mKSA9IGRlbGV0ZTsKKyAgICBIZWlmRGVjb2RlciYgb3BlcmF0b3I9KGNvbnN0IEhlaWZGcmFtZUluZm8mKSA9IGRlbGV0ZTsKK307CisKKy8qCisgKiBDcmVhdGVzIGEgSGVpZkRlY29kZXIuIFJldHVybnMgYSBIZWlmRGVjb2RlciBpbnN0YW5jZSB1cG9uIHN1Y2Nlc3MsIG9yIE5VTEwKKyAqIGlmIHRoZSBjcmVhdGlvbiBoYXMgZmFpbGVkLgorICovCitIZWlmRGVjb2RlciogY3JlYXRlSGVpZkRlY29kZXIoKTsKKworI2VuZGlmIC8vIF9IRUlGX0RFQ09ERVJfQVBJXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggYmJlOTdlZS4uYTQ2MmYzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0yLDExICsyLDIyIEBACiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAogfQogCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVscGVyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTM0LDYgKzQ1LDcgQEAKICAgICAgICAgIklNZWRpYUNvZGVjTGlzdC5jcHAiLAogICAgICAgICAiSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJJT01YLmNwcCIsCisgICAgICAgICJJT01YU3RvcmUuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNJbmZvLmNwcCIsCiAgICAgICAgICJNZWRpYURlZnMuY3BwIiwKQEAgLTY5LDE0ICs4MSw2IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsIC8vIGZvciBtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKQEAgLTEyMCw2ICsxMjQsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXgiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBkZWZhdWx0czogWyJsaWJtZWRpYV9vbXhfZGVmYXVsdHMiXSwKIH0KQEAgLTIwMiw2ICsyMDksNyBAQAogICAgICAgICAibGliaWN1aTE4biIsCiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgXSwKIApAQCAtMjEwLDE1ICsyMTgsMTAgQEAKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8iLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCmluZGV4IDMwMjAxMzYuLjk5MGQyNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCkBAIC0xOCwxNSArMTgsMTUgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaCIKIAotI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgotI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvU3RyaW5nQXJyYXkuaD4KIAotI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgotI2luY2x1ZGUgInVuaWNvZGUvdWNzZGV0LmgiCi0jaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSA8dW5pY29kZS91Y252Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y3NkZXQuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3VzdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04NSw2ICs4NSw4IEBACiAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgICAgICBVQ2hhcnNldERldGVjdG9yICpjc2QgPSB1Y3NkZXRfb3Blbigmc3RhdHVzKTsKICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCAqdWNtOworICAgICAgICBib29sIGdvb2RtYXRjaCA9IHRydWU7CisgICAgICAgIGludCBoaWdoZXN0ID0gMDsKIAogICAgICAgICAvLyB0cnkgY29tYmluZWQgZGV0ZWN0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCiAgICAgICAgIGNoYXIgYnVmWzEwMjRdOwpAQCAtMTE2LDggKzExOCw2IEBACiAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIGJ1Ziwgc3RybGVuKGJ1ZiksICZzdGF0dXMpOwogICAgICAgICAgICAgaW50MzJfdCBtYXRjaGVzOwogICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOwotICAgICAgICAgICAgYm9vbCBnb29kbWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgaW50IGhpZ2hlc3QgPSAwOwogICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCogYmVzdENvbWJpbmVkTWF0Y2ggPSBnZXRQcmVmZXJyZWQoYnVmLCBzdHJsZW4oYnVmKSwKICAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaCwgJmhpZ2hlc3QpOwogCkBAIC0xODAsOCArMTgwLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImdlbnJlIikgfHwKICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW0iKSB8fAogICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBlbmNvZGluZyBkZXRlcm1pbmVkIGZyb20gdGhlIGNvbWJpbmF0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCi0gICAgICAgICAgICAgICAgZW5jID0gY29tYmluZWRlbmM7CisgICAgICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2ggJiYgaGlnaGVzdCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR2l2ZSBpdCBvbmUgbW9yZSBjaGFuY2UgaWYgdGhlcmUgaXMgbm8gZ29vZCBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyeWluZyB0byBkZXRlY3QgJXMgc2VwYXJhdGVseSIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdGNoZXM7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZ29vZG1hdGNoU2luZ2xlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hlc3RTaW5nbGUgPSAwOworICAgICAgICAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIHMsIGlucHV0TGVuZ3RoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiBiZXN0U2luZ2xlTWF0Y2ggPSBnZXRQcmVmZXJyZWQocywgaW5wdXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaFNpbmdsZSwgJmhpZ2hlc3RTaW5nbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ29vZG1hdGNoU2luZ2xlIHx8IGhpZ2hlc3RTaW5nbGUgPiBoaWdoZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgZW5jID0gdWNzZGV0X2dldE5hbWUoYmVzdFNpbmdsZU1hdGNoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZW5jID0gY29tYmluZWRlbmM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGVuY29kaW5nIGRldGVybWluZWQgZnJvbSB0aGUgY29tYmluYXRpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgICAgICAgICAgICAgZW5jID0gY29tYmluZWRlbmM7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNQcmludGFibGVBc2NpaShzLCBpbnB1dExlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgZW5jID0gIlVURi04IjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwCmluZGV4IDJkNjI0MTkuLmFkZmE5M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcApAQCAtMjcsNyArMjcsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKLSAgICBHRVRfT01YID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTgorICAgIEdFVF9PTVggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIEdFVF9PTVhfU1RPUkUKIH07CiAKIGNsYXNzIEJwTWVkaWFDb2RlY1NlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhQ29kZWNTZXJ2aWNlPgpAQCAtNDUsNiArNDYsMTMgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElPTVg+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCisgICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFDb2RlY1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT01YX1NUT1JFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU9NWFN0b3JlPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhQ29kZWNTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFDb2RlY1NlcnZpY2UiKTsKQEAgLTYyLDYgKzcwLDEyIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfT01YX1NUT1JFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJT01YU3RvcmU+IG9teFN0b3JlID0gZ2V0T01YU3RvcmUoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXhTdG9yZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDRjYWE3OWUuLmE4YTdiODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KQEAgLTQwLDcgKzM5LDggQEAKICAgICBTRVRNRURJQUNBUywKICAgICBTRVRVSUQsCiAgICAgTkFNRSwKLSAgICBHRVRNRVRSSUNTCisgICAgR0VUTUVUUklDUywKKyAgICBSRUxFQVNFLAogfTsKIAogY2xhc3MgQnBNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3I+IHsKQEAgLTExOCwxMiArMTE4LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJiBjYXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYXMpKTsKKyAgICAgICAgZGF0YS53cml0ZUJ5dGVWZWN0b3IoY2FzVG9rZW4pOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRNRURJQUNBUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtMTQwLDYgKzE0MCwxMyBAQAogICAgICAgICBBTE9HVigibmFtZSBOT1QgSU1QTEVNRU5URUQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFFeHRyYWN0b3I6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFLCBkYXRhLCAmcmVwbHkpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUV4dHJhY3RvciwgImFuZHJvaWQubWVkaWEuSU1lZGlhRXh0cmFjdG9yIik7CkBAIC0yMDcsMTUgKzIxNCwyMCBAQAogICAgICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGNhc0JpbmRlcjsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZjYXNCaW5kZXIpOworICAgICAgICAgICAgSEludGVyZmFjZVRva2VuIGNhc1Rva2VuOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkQnl0ZVZlY3RvcigmY2FzVG9rZW4pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhcyBmcm9tIHBhcmNlbCIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGNhc1Rva2VuIGZyb20gcGFyY2VsIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPElDYXM+IGNhcyA9IGludGVyZmFjZV9jYXN0PElDYXM+KGNhc0JpbmRlcik7CiAKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhcykpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TWVkaWFDYXMoY2FzVG9rZW4pKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFJFTEVBU0U6IHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA3MDU4ZWU4Li41ZWEyZThiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xMjcsMjIgKzEyNywzMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc291cmNlKSk7CisKKyAgICAgICAgaWYgKG1pbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobWltZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpCiAgICAgewotICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSwgb3B0aW9uKCVkKSwgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZVVzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG9wdGlvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb2xvckZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtZXRhT25seSk7CiAjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSwogICAgICAgICBzZW5kU2NoZWRQb2xpY3koZGF0YSk7CiAjZW5kaWYKQEAgLTI1OCw3ICsyNjgsMTIgQEAKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2Uoc291cmNlKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNNaW1lID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoaGFzTWltZSkgeworICAgICAgICAgICAgICAgICAgICBtaW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSwgbWltZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjY2LDExICsyODEsMTQgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50IG9wdGlvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBtZXRhT25seSA9IChkYXRhLnJlYWRJbnQzMigpICE9IDApOworICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpLCBvcHRpb24oJWQpLCBjb2xvckZvcm1hdCglZCksIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKICAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOwogI2VuZGlmCi0gICAgICAgICAgICBzcDxJTWVtb3J5PiBiaXRtYXAgPSBnZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBiaXRtYXAgPSBnZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYml0bWFwKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDQzMTMwZWIuLmEwNzMwODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAotI2luY2x1ZGUgPG9teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ4ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJT01YU3RvcmUiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitlbnVtIHsKKyAgICBDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUywKKyAgICBHRVRfTk9ERV9QUkVGSVgsCisgICAgTElTVF9ST0xFUywKKyAgICBHRVRfT01YLAorfTsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RkOjp2ZWN0b3I8VD4gPC0+IFBhcmNlbCBjb252ZXJzaW9uIGZ1bmNpdG9ucyB0aGF0CisvLyBkZXBlbmQgb24gd3JpdGVUb1BhcmNlbCgpIGFuZCByZWFkVG9QYXJjZWwoKSBmb3IgVCA8LT4gUGFyY2VsLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIFBhcmNlbCogcCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjp2ZWN0b3I8VD4qIHYsIGNvbnN0IFBhcmNlbCYgcCk7CisKKy8vIHN0ZDo6c3RyaW5nIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnN0cmluZyYgcywgUGFyY2VsKiBwKSB7CisgICAgaWYgKHMuc2l6ZSgpID4gSU5UMzJfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBwLT53cml0ZUJ5dGVBcnJheSgKKyAgICAgICAgICAgIHMuc2l6ZSgpLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzLmNfc3RyKCkpKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjpzdHJpbmcqIHMsIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIGludDMyX3QgbGVuOworICAgIHN0YXR1c190IHN0YXR1cyA9IHAucmVhZEludDMyKCZsZW4pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgaWYgKChsZW4gPCAwKSB8fCAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxlbikgPiBTSVpFX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcy0+cmVzaXplKGxlbik7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHAucmVhZChzdGF0aWNfY2FzdDx2b2lkKj4oJnMtPmZyb250KCkpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikpOworfQorCisvLyBJT01YU3RvcmU6OkF0dHJpYnV0ZSA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpBdHRyaWJ1dGUmIGEsIFBhcmNlbCogcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoYS5rZXksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwoYS52YWx1ZSwgcCk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6QXR0cmlidXRlKiBhLCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKGEtPmtleSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYoYS0+dmFsdWUpLCBwKTsKK30KKworLy8gSU9NWFN0b3JlOjpOb2RlSW5mbyA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpOb2RlSW5mbyYgbiwgUGFyY2VsKiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuLm5hbWUsIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuLm93bmVyLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKG4uYXR0cmlidXRlcywgcCk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6Tm9kZUluZm8qIG4sIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYobi0+bmFtZSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihuLT5vd25lciksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYobi0+YXR0cmlidXRlcyksIHApOworfQorCisvLyBJT01YU3RvcmU6OlJvbGVJbmZvIDwtPiBQYXJjZWwKKworc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6OlJvbGVJbmZvJiByLCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHIucm9sZSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHIudHlwZSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSBwLT53cml0ZUJvb2woci5pc0VuY29kZXIpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcC0+d3JpdGVCb29sKHIucHJlZmVyUGxhdGZvcm1Ob2Rlcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChyLm5vZGVzLCBwKTsKK30KKworc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpSb2xlSW5mbyogciwgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihyLT5yb2xlKSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKHItPnR5cGUpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAucmVhZEJvb2woJihyLT5pc0VuY29kZXIpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAucmVhZEJvb2woJihyLT5wcmVmZXJQbGF0Zm9ybU5vZGVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihyLT5ub2RlcyksIHApOworfQorCisvLyBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4gPC0+IFBhcmNlbAorLy8gc3RkOjp2ZWN0b3I8Um9sZUluZm8+IDwtPiBQYXJjZWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLT53cml0ZVZlY3RvclNpemUodik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IFQmIHggOiB2KSB7CisgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoeCwgcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6dmVjdG9yPFQ+KiB2LCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLnJlc2l6ZU91dFZlY3Rvcih2KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGZvciAoVCYgeCA6ICp2KSB7CisgICAgICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCZ4LCBwKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgQnBPTVhTdG9yZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YU3RvcmU+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCcE9NWFN0b3JlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElPTVhTdG9yZT4oaW1wbCkgeworICAgIH0KKworICAgIHN0YXR1c190IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfU0VSVklDRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChhdHRyaWJ1dGVzLCByZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTk9ERV9QUkVGSVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKHByZWZpeCwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX1JPTEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChyb2xlTGlzdCwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG5hbWUsICZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09NWCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcihvbXgpOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE9NWFN0b3JlLCAiYW5kcm9pZC5oYXJkd2FyZS5JT01YU3RvcmUiKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBDSEVDS19PTVhfSU5URVJGQUNFKGludGVyZmFjZSwgZGF0YSwgcmVwbHkpIFwKKyAgICAgICAgZG8geyBpZiAoIShkYXRhKS5lbmZvcmNlSW50ZXJmYWNlKGludGVyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKSkgeyBcCisgICAgICAgICAgICBBTE9HVygiQ2FsbCBpbmNvcnJlY3RseSByb3V0ZWQgdG8gIiAjaW50ZXJmYWNlKTsgXAorICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOyBcCisgICAgICAgIH0gfSB3aGlsZSAoMCkKKworc3RhdHVzX3QgQm5PTVhTdG9yZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgTElTVF9TRVJWSUNFX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygmYXR0cmlidXRlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RTZXJ2aWNlQXR0cmlidXRlcygpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChhdHRyaWJ1dGVzLCByZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RTZXJ2aWNlQXR0cmlidXRlcygpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTk9ERV9QUkVGSVg6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE5vZGVQcmVmaXgoJnByZWZpeCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE5vZGVQcmVmaXgoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwocHJlZml4LCByZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE5vZGVQcmVmaXgoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgTElTVF9ST0xFUzogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiByb2xlTGlzdDsKKworICAgICAgICAgICAgc3RhdHVzID0gbGlzdFJvbGVzKCZyb2xlTGlzdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImxpc3RSb2xlcygpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyb2xlTGlzdCwgcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0Um9sZXMoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX09NWDogeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgICAgICBzcDxJT01YPiBvbXg7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCZuYW1lLCBkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgdG8gcmV0cmlldmUgbmFtZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE9teChuYW1lLCAmb214KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDk1ZjdkMmUuLjk3MjRmYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiSVJlc291cmNlTWFuYWdlclNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAppbmRleCAxZjE4OGYzLi5hNTcwZmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCkBAIC0xMDEsMzYgKzEwMSw0NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzQnVpbGRlcjo6YWRkUHJvZmlsZUxldmVsKHVpbnQzMl90IHByb2ZpbGUsIHVpbnQzMl90IGxldmVsKSB7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZERldGFpbCgKKyAgICAgICAgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIG1DYXAtPm1EZXRhaWxzLT5zZXRTdHJpbmcoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkRGV0YWlsKAorICAgICAgICBjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpIHsKKyAgICBtQ2FwLT5tRGV0YWlscy0+c2V0SW50MzIoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkUHJvZmlsZUxldmVsKAorICAgICAgICB1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewogICAgIFByb2ZpbGVMZXZlbCBwcm9maWxlTGV2ZWw7CiAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gcHJvZmlsZTsKICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gbGV2ZWw7Ci0gICAgbVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgaWYgKG1DYXAtPm1Qcm9maWxlTGV2ZWxzU29ydGVkLmluZGV4T2YocHJvZmlsZUxldmVsKSA8IDApIHsKKyAgICAgICAgbUNhcC0+bVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgICAgIG1DYXAtPm1Qcm9maWxlTGV2ZWxzU29ydGVkLmFkZChwcm9maWxlTGV2ZWwpOworICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzQnVpbGRlcjo6YWRkQ29sb3JGb3JtYXQodWludDMyX3QgZm9ybWF0KSB7Ci0gICAgbUNvbG9yRm9ybWF0cy5wdXNoKGZvcm1hdCk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkgeworICAgIGlmIChtQ2FwLT5tQ29sb3JGb3JtYXRzU29ydGVkLmluZGV4T2YoZm9ybWF0KSA8IDApIHsKKyAgICAgICAgbUNhcC0+bUNvbG9yRm9ybWF0cy5wdXNoKGZvcm1hdCk7CisgICAgICAgIG1DYXAtPm1Db2xvckZvcm1hdHNTb3J0ZWQuYWRkKGZvcm1hdCk7CisgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyOjphZGRGbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIG1GbGFncyB8PSBmbGFnczsKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKKyAgICBtQ2FwLT5tRmxhZ3MgfD0gZmxhZ3M7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OkNhcGFiaWxpdGllc1dyaXRlcigKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcyogY2FwKSA6IG1DYXAoY2FwKSB7CiB9CiAKIGJvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUlzRW5jb2RlcjsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mbzo6aGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtUXVpcmtzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgaWYgKG1RdWlya3MuaXRlbUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7CiAgICAgbWltZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewpAQCAtMTUxLDIwICsxNjEsMjEgQEAKICAgICByZXR1cm4gbU5hbWUuY19zdHIoKTsKIH0KIAorY29uc3QgY2hhciAqTWVkaWFDb2RlY0luZm86OmdldE93bmVyTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU93bmVyLmNfc3RyKCk7Cit9CisKIC8vIHN0YXRpYwogc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgIEFTdHJpbmcgb3duZXIgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOwotICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGlzRW5jb2RlciwgTlVMTCk7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CisgICAgaW5mby0+bU5hbWUgPSBuYW1lOworICAgIGluZm8tPm1Pd25lciA9IG93bmVyOworICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQVN0cmluZyBxdWlyayA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bVF1aXJrcy5wdXNoX2JhY2socXVpcmspOwotICAgICAgICB9Ci0gICAgfQotICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkKQEAgLTE3OCwxMSArMTg5LDggQEAKIAogc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKICAgICBtTmFtZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgbU93bmVyLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1RdWlya3Muc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RdWlya3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVF1aXJrcy5pdGVtQXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIH0KICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKQEAgLTIwMiw4NiArMjEwLDQ2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpCi0gICAgOiBtTmFtZShuYW1lKSwKLSAgICAgIG1Jc0VuY29kZXIoZW5jb2RlciksCi0gICAgICBtSGFzU29sZU1pbWUoZmFsc2UpIHsKLSAgICBpZiAobWltZSAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZE1pbWUobWltZSk7Ci0gICAgICAgIG1IYXNTb2xlTWltZSA9IHRydWU7Ci0gICAgfQorTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkgewogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgaWYgKG1IYXNTb2xlTWltZSkgewotICAgICAgICBBTE9HRSgiQ29kZWMgJyVzJyBhbHJlYWR5IGhhZCBpdHMgdHlwZSBzcGVjaWZpZWQiLCBtTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBtSW5mby0+bU5hbWUgPSBuYW1lOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcikgeworICAgIG1JbmZvLT5tT3duZXIgPSBvd25lcjsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0RW5jb2Rlcihib29sIGlzRW5jb2RlcikgeworICAgIG1JbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwogICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgIG1DdXJyZW50Q2FwcyA9IG1DYXBzLnZhbHVlQXQoaXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DdXJyZW50Q2FwcyA9IG5ldyBDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgbUNhcHMuYWRkKEFTdHJpbmcobWltZSksIG1DdXJyZW50Q2Fwcyk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCisgICAgICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoCisgICAgICAgICAgICAgICAgbUluZm8tPm1DYXBzLnZhbHVlQXQoaXgpLmdldCgpKSk7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMoKTsKKyAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWltZSksIGNhcHMpOworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCisgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcihjYXBzLmdldCgpKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp1cGRhdGVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwotICAgIGlmIChpeCA8IDApIHsKLSAgICAgICAgQUxPR0UoInVwZGF0ZU1pbWUgbWltZSBub3QgZm91bmQgJXMiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRDYXBzID0gbUNhcHMudmFsdWVBdChpeCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CiAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgbUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7Ci0gICAgICAgIC8vIG1DdXJyZW50Q2FwcyB3aWxsIGJlIHJlbW92ZWQgd2hlbiBjb21wbGV0ZWQKKyAgICAgICAgbUluZm8tPm1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBzcDxDYXBhYmlsaXRpZXM+ICZjYXBzKSB7Ci0gICAgLy8gVFJJQ0tZOiBjb3B5IGRhdGEgdG8gbUN1cnJlbnRDYXBzIGFzIGl0IGlzIGEgcmVmZXJlbmNlIHRvCi0gICAgLy8gYW4gZWxlbWVudCBvZiB0aGUgY2FwYWJpbGl0ZXMgbWFwLgotICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5jbGVhcigpOwotICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5hcHBlbmRWZWN0b3IoY2Fwcy0+bUNvbG9yRm9ybWF0cyk7Ci0gICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5jbGVhcigpOwotICAgIG1DdXJyZW50Q2Fwcy0+bVByb2ZpbGVMZXZlbHMuYXBwZW5kVmVjdG9yKGNhcHMtPm1Qcm9maWxlTGV2ZWxzKTsKLSAgICBtQ3VycmVudENhcHMtPm1GbGFncyA9IGNhcHMtPm1GbGFnczsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzID0gY2Fwcy0+bURldGFpbHM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgaWYgKCFoYXNRdWlyayhuYW1lKSkgewotICAgICAgICBtUXVpcmtzLnB1c2gobmFtZSk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpjb21wbGV0ZSgpIHsKLSAgICBtQ3VycmVudENhcHMgPSBOVUxMOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgewotICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyhrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0luZm86OmFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOwotICAgIHRhZy5hcHBlbmQoa2V5KTsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRJbnQzMih0YWcuY19zdHIoKSwgdmFsdWUpOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKLSAgICBBU3RyaW5nIHRhZyA9ICJmZWF0dXJlLSI7Ci0gICAgdGFnLmFwcGVuZChrZXkpOwotICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyh0YWcuY19zdHIoKSwgdmFsdWUpOworTWVkaWFDb2RlY0luZm9Xcml0ZXI6Ok1lZGlhQ29kZWNJbmZvV3JpdGVyKE1lZGlhQ29kZWNJbmZvKiBpbmZvKSA6CisgICAgbUluZm8oaW5mbykgewogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggOWY4MDNjYi4uMDI4NjE2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAotI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCIKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9TdHJpbmdBcnJheS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKaW5kZXggZGMyYmM4Mi4uYmNkYzNiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKQEAgLTI0LDYgKzI0LDggQEAKIAogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKIAorZXh0ZXJuICJDIiBzaXplX3QgX19jZmlfc2hhZG93X3NpemUoKTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB2b2lkIGxpbWl0UHJvY2Vzc01lbW9yeSgKQEAgLTYyLDYgKzY0LDE5IEBACiAgICAgaWYgKHByb3BWYWwgPiAwICYmIHVpbnQ2NF90KHByb3BWYWwpIDw9IFNJWkVfTUFYKSB7CiAgICAgICAgIG1heE1lbSA9IHByb3BWYWw7CiAgICAgfQorCisgICAgLy8gSW5jcmVhc2UgYnkgdGhlIHNpemUgb2YgdGhlIENGSSBzaGFkb3cgbWFwcGluZy4gTW9zdCBvZiB0aGUgc2hhZG93IGlzIG5vdAorICAgIC8vIGJhY2tlZCB3aXRoIHBoeXNpY2FsIHBhZ2VzLCBhbmQgaXQgaXMgcG9zc2libGUgZm9yIHRoZSByZXN1bHQgdG8gYmUKKyAgICAvLyBoaWdoZXIgdGhhbiB0b3RhbCBwaHlzaWNhbCBtZW1vcnkuIFRoaXMgaXMgZmluZSBmb3IgUkxJTUlUX0FTLgorICAgIHNpemVfdCBjZmlfc2l6ZSA9IF9fY2ZpX3NoYWRvd19zaXplKCk7CisgICAgaWYgKGNmaV9zaXplKSB7CisgICAgICBBTE9HVigiY2ZpIHNoYWRvdyBzaXplOiAlenUiLCBjZmlfc2l6ZSk7CisgICAgICBpZiAobWF4TWVtIDw9IFNJWkVfTUFYIC0gY2ZpX3NpemUpIHsKKyAgICAgICAgbWF4TWVtICs9IGNmaV9zaXplOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF4TWVtID0gU0laRV9NQVg7CisgICAgICB9CisgICAgfQogICAgIEFMT0dWKCJhY3R1YWwgbGltaXQ6ICV6dSIsIG1heE1lbSk7CiAKICAgICBzdHJ1Y3QgcmxpbWl0IGxpbWl0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwCmluZGV4IDAyZWZjNWYuLjc1ODhlMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJNaWRpRGV2aWNlSW5mbyIKIAotI2luY2x1ZGUgIk1pZGlEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSA8bWVkaWEvTWlkaURldmljZUluZm8uaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IGZhYWU5NTQuLjRlNWQ2N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCi0jaW5jbHVkZSAibWVkaWEvTWlkaUlvV3JhcHBlci5oIgorI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KIAogc3RhdGljIGludCByZWFkQXQodm9pZCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIGludCBwb3MsIGludCBzaXplKSB7CiAgICAgcmV0dXJuICgoYW5kcm9pZDo6TWlkaUlvV3JhcHBlciopaGFuZGxlKS0+cmVhZEF0KGJ1ZmZlciwgcG9zLCBzaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcCBiL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcAppbmRleCBiMmU1OTA3Li43ODY4Yjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJTdHJpbmdBcnJheS5oIgorI2luY2x1ZGUgPG1lZGlhL1N0cmluZ0FycmF5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAppbmRleCBhNmViYTg2Li5lNmM4ZjljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcApAQCAtMzc1LDcgKzM3NSw3IEBACiBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxDaGFubmVscykKIHsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsczsKLSAgICBpZiAoIU91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykgfHwKKyAgICBpZiAoIU91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykgJiYKICAgICAgICAgICAgICFJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBlMDMxNzY1Li41ZDI1ZTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTM5LDYgKzM5LDExIEBACiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwogCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7CisgICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Cit9CisKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAogICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgewpAQCAtMTYxLDYgKzE2Niw5IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogCisgICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90Pj4gbU9wZW5TZXNzaW9uczsKKyAgICB2b2lkIGNsb3NlT3BlblNlc3Npb25zKCk7CisKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgogICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldApAQCAtMTc1LDYgKzE4MywxMSBAQAogCiAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGFycmF5KTsKIAorICAgIHZvaWQgcmVwb3J0TWV0cmljcygpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaAppbmRleCA2NTVmMzM3Li4zODU4Zjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRGF0YVNvdXJjZS5oCkBAIC0zNSw3ICszNSw5IEBACiAgICAgLy8gR2V0IHRoZSBtZW1vcnkgdGhhdCByZWFkQXQgd3JpdGVzIGludG8uCiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgPSAwOwogICAgIC8vIFJlYWQgdXAgdG8gfHNpemV8IGJ5dGVzIGludG8gdGhlIG1lbW9yeSByZXR1cm5lZCBieSBnZXRJTWVtb3J5KCkuIFJldHVybnMKLSAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGVycm9yLiB8c2l6ZXwgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4KKyAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIChlZy4KKyAgICAvLyBFUlJPUl9FTkRfT0ZfU1RSRUFNIGluZGljYXRpbmcgRU9TLiBUaGlzIGlzIG5lZWRlZCBieSBDYWxsYmFja0RhdGFTb3VyY2UKKyAgICAvLyB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGluZyBvZiBsYXN0IGNodW5rKS4gfHNpemV8IG11c3Qgbm90IGJlIGxhcmdlciB0aGFuCiAgICAgLy8gdGhlIGJ1ZmZlci4KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwogICAgIC8vIEdldCB0aGUgc2l6ZSwgb3IgLTEgaWYgdGhlIHNpemUgaXMgdW5rbm93bi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCmluZGV4IGRhM2M1YTAzLi41OWZiMWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsNiArMzIsNyBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY1NlcnZpY2UpOwogCiAgICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSA9IDA7CisgICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUNvZGVjU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGFiNDBmNTMuLjBhYzc2NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsMTQgKzIwLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1ldGFEYXRhOwotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBISW50ZXJmYWNlVG9rZW47CiAKIGNsYXNzIElNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKIHB1YmxpYzoKQEAgLTY1LDExICs2MywxMyBAQAogICAgIC8vIGZvciBEUk0KICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pICA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKSAgPSAwOwogCiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggYzkwZjI1NC4uZWE5NTE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMTksMTMgKzE5LDEyIEBACiAjZGVmaW5lIEFORFJPSURfSU1FRElBTUVUQURBVEFSRVRSSUVWRVJfSAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCitjbGFzcyBQYXJjZWw7CiBjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIApAQCAtNDEsOCArNDAsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0RnJhbWVBdFRpbWUoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggOWEwYWRhMS4uZTY5YzAyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTI5LDggKzI5LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KIAotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhkYjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YU3RvcmUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lPTVhTVE9SRV9IXworCisjZGVmaW5lIEFORFJPSURfSU9NWFNUT1JFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SU9teFN0b3JlOworCitjbGFzcyBJT01YU3RvcmUgOiBwdWJsaWMgSUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVhTdG9yZSk7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5OworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5vZGVJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3duZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKKyAgICB9OworCisgICAgc3RydWN0IFJvbGVJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcm9sZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7CisgICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Tm9kZUluZm8+IG5vZGVzOworICAgIH07CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RTZXJ2aWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4qIGF0dHJpYnV0ZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgPSAwOworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBCbk9NWFN0b3JlIDogcHVibGljIEJuSW50ZXJmYWNlPElPTVhTdG9yZT4geworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSU9NWF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmluZGV4IDZiNTBmMjIuLmFiMmNkMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2RlZmluZSBNRURJQV9DT0RFQ19JTkZPX0hfCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTM2LDEyICszNywyMCBAQAogCiB0eXBlZGVmIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IENvZGVjU2V0dGluZ3M7CiAKK3N0cnVjdCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKKwogc3RydWN0IE1lZGlhQ29kZWNJbmZvIDogcHVibGljIFJlZkJhc2UgewogICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgewogICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKICAgICAgICAgdWludDMyX3QgbUxldmVsOworICAgICAgICBib29sIG9wZXJhdG9yIDwoY29uc3QgUHJvZmlsZUxldmVsICZvKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVByb2ZpbGUgPCBvLm1Qcm9maWxlIHx8IChtUHJvZmlsZSA9PSBvLm1Qcm9maWxlICYmIG1MZXZlbCA8IG8ubUxldmVsKTsKKyAgICAgICAgfQogICAgIH07CiAKKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOworCiAgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICAgICAgZW51bSB7CiAgICAgICAgICAgICAvLyBkZWNvZGVyIGZsYWdzCkBAIC02MSw3ICs3MCw5IEBACiAKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOworICAgICAgICBTb3J0ZWRWZWN0b3I8UHJvZmlsZUxldmVsPiBtUHJvZmlsZUxldmVsc1NvcnRlZDsKICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzOworICAgICAgICBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHNTb3J0ZWQ7CiAgICAgICAgIHVpbnQzMl90IG1GbGFnczsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1EZXRhaWxzOwogCkBAIC03Miw3MiArODMsMTkxIEBACiAgICAgICAgIHN0YXRpYyBzcDxDYXBhYmlsaXRpZXM+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKIAotICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXBhYmlsaXRpZXMpOworICAgICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2FwYWJpbGl0aWVzKTsKIAogICAgICAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNJbmZvOworICAgICAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNJbmZvV3JpdGVyOworICAgICAgICBmcmllbmQgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlcjsKICAgICB9OwogCi0gICAgLy8gVXNlIGEgc3ViY2xhc3MgdG8gYWxsb3cgc2V0dGluZyBmaWVsZHMgb24gY29uc3RydWN0aW9uIHdpdGhvdXQgYWxsb3dpbmcKLSAgICAvLyB0byBkbyB0aGUgc2FtZSB0aHJvdWdob3V0IHRoZSBmcmFtZXdvcmsuCi0gICAgc3RydWN0IENhcGFiaWxpdGllc0J1aWxkZXIgOiBwdWJsaWMgQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIG1vZGlmeWluZyBpbmZvcm1hdGlvbiBpbnNpZGUgYSBgQ2FwYWJpbGl0aWVzYAorICAgICAqIG9iamVjdC4gQW4gb2JqZWN0IG9mIHR5cGUgYENhcGFiaWxpdGllc1dyaXRlcmAgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoKWAgb3IKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnVwZGF0ZU1pbWUoKWAuCisgICAgICovCisgICAgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBrZXktdmFsdWUgcGFpciB0byB0aGUgbGlzdCBvZiBkZXRhaWxzLiBJZiB0aGUga2V5IGFscmVhZHkKKyAgICAgICAgICogZXhpc3RzLCB0aGUgb2xkIHZhbHVlIHdpbGwgYmUgcmVwbGFjZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEEgcGFpciBhZGRlZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYWNjZXNzaWJsZSBieQorICAgICAgICAgKiBgQ2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKClgLiBDYWxsIGBBTWVzc2FnZTo6Z2V0U3RyaW5nKClgIHdpdGggdGhlCisgICAgICAgICAqIHNhbWUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBhbHJlYWR5CisgICAgICAgICAqIGV4aXN0cywgdGhlIG9sZCB2YWx1ZSB3aWxsIGJlIHJlcGxhY2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBBIHBhaXIgYWRkZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGFjY2Vzc2libGUgYnkKKyAgICAgICAgICogYENhcGFiaWxpdGllczo6Z2V0RGV0YWlscygpYC4gQ2FsbCBgQU1lc3NhZ2U6OmdldEludDMyKClgIHdpdGggdGhlCisgICAgICAgICAqIHNhbWUga2V5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGBpbnQzMl90YCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBwcm9maWxlLWxldmVsIHBhaXIuIElmIHRoaXMgcHJvZmlsZS1sZXZlbCBwYWlyIGFscmVhZHkgZXhpc3RzLAorICAgICAgICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9maWxlIFRoZSAicHJvZmlsZSIgY29tcG9uZW50LgorICAgICAgICAgKiBAcGFyYW0gbGV2ZWwgVGhlICJsZXZlbCIgY29tcG9uZW50LgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRQcm9maWxlTGV2ZWwodWludDMyX3QgcHJvZmlsZSwgdWludDMyX3QgbGV2ZWwpOworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY29sb3IgZm9ybWF0LiBJZiB0aGlzIGNvbG9yIGZvcm1hdCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZQorICAgICAgICAgKiBpZ25vcmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBjb2xvciBmb3JtYXQuCisgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgZmxhZ3MuIFRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiBpcyBiaXR3aXNlLW9yLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICogYml0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBUaGUgYWRkaXRpb25hbCBmbGFncy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpOworICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBDYXBhYmlsaXRpZXMqIG1DYXA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgZm9yIHRoZSBnaXZlbiBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYXAgVGhlIGBDYXBhYmlsaXRpZXNgIG9iamVjdCB0byBiZSB3cml0dGVuIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgQ2FwYWJpbGl0aWVzV3JpdGVyKENhcGFiaWxpdGllcyogY2FwKTsKKworICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAogICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNRdWlyayhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKICAgICB2b2lkIGdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0OwogICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAorICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCisgICAgICoKKyAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgogICAgICAqLwogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjSW5mbz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgLy8gdmFyaWFibGUgc2V0IG9ubHkgaW4gY29uc3RydWN0b3IgLSB0aGVzZSBhcmUgYWNjZXNzZWQgYnkgTWVkaWFDb2RlY0xpc3QKLSAgICAvLyB0byBhdm9pZCBkdXBsaWNhdGlvbiBvZiBzYW1lIHZhcmlhYmxlcwogICAgIEFTdHJpbmcgbU5hbWU7CisgICAgQVN0cmluZyBtT3duZXI7CiAgICAgYm9vbCBtSXNFbmNvZGVyOwotICAgIGJvb2wgbUhhc1NvbGVNaW1lOyAvLyB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBtaW1lCi0KLSAgICBWZWN0b3I8QVN0cmluZz4gbVF1aXJrczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CiAKLSAgICBzcDxDYXBhYmlsaXRpZXM+IG1DdXJyZW50Q2FwczsgLy8gY3VycmVudGx5IGluaXRhbGl6ZWQgY2FwYWJpbGl0aWVzCi0KICAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdDsKIAotICAgIC8qIE1ldGhvZHMgdXNlZCBieSBNZWRpYUNvZGVjTGlzdCB0byBjb25zdHJ1Y3QgdGhlIGluZm8KLSAgICAgKiBvYmplY3QgZnJvbSBYTUwuCi0gICAgICoKLSAgICAgKiBBZnRlciBpbmZvIG9iamVjdCBpcyBjcmVhdGVkOgotICAgICAqIC0gYWRkaXRpb25hbCBxdWlya3MgY2FuIGJlIGFkZGVkCi0gICAgICogLSBhZGRpdGlvbmFsIG1pbWVzIGNhbiBiZSBhZGRlZAotICAgICAqICAgLSBPTVggY29kZWMgY2FwYWJpbGl0aWVzIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQotICAgICAqICAgLSBhIGNhcGFiaWxpdHkgZGV0YWlsIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQotICAgICAqICAgLSBhIGZlYXR1cmUgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCi0gICAgICogICAtIGluZm8gb2JqZWN0IGNhbiBiZSBjb21wbGV0ZWQgd2hlbiBwYXJzaW5nIG9mIGEgbWltZS10eXBlIGlzIGRvbmUKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuIEFmdGVyIHRoZSBjb25zdHJ1Y3Rpb24sIGl0cworICAgICAqIGluZm9ybWF0aW9uIGNhbiBiZSBzZXQgdmlhIGFuIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IG9idGFpbmVkIGZyb20KKyAgICAgKiBgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKClgLgogICAgICAqLwotICAgIE1lZGlhQ29kZWNJbmZvKEFTdHJpbmcgbmFtZSwgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKLSAgICB2b2lkIGFkZFF1aXJrKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHN0YXR1c190IGFkZE1pbWUoY29uc3QgY2hhciAqbWltZSk7Ci0gICAgc3RhdHVzX3QgdXBkYXRlTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBNZWRpYUNvZGVjSW5mbygpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBzcDxDYXBhYmlsaXRpZXM+ICZjYXBzKTsKLSAgICB2b2lkIGFkZERldGFpbChjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IEFTdHJpbmcgJnZhbHVlKTsKLSAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKTsKLSAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0gICAgdm9pZCByZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOwotICAgIHZvaWQgY29tcGxldGUoKTsKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFDb2RlY0luZm8pOwogCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlY0luZm8pOwotCi0gICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0OworICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CisgICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKK307CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvCisgKiBwb3B1bGF0ZSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCisgKgorICogVGhlIG9ubHkgcGxhY2Ugd2hlcmUgYW4gaW5zdGFuY2Ugb2YgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBjYW4gYmUgY29uc3RydWN0ZWQKKyAqIGlzIGBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkTWVkaWFDb2RlY0luZm8oKWAuIEEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgCisgKiBpbnN0YW5jZSBzaG91bGQgY2FsbCBgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKClgIG9uIHRoZSBnaXZlbgorICogYE1lZGlhQ29kZWNMaXN0V3JpdGVyYCBvYmplY3QgZ2l2ZW4gYXMgYW4gaW5wdXQgdG8KKyAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpidWlsZE1lZGlhQ29kZWNMaXN0KClgLgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0luZm9Xcml0ZXIgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUuCisgICAgICovCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3duZXIgbmFtZSBvZiB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBUaGlzICJvd25lciBuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgYElPbXhgIGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhpcworICAgICAqIGNvZGVjLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIFRoZSBuZXcgb3duZXIgbmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKTsKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlzRW5jb2RlciBXaGV0aGVyIHRoaXMgY29kZWMgaXMgYW4gZW5jb2RlciBvciBhIGRlY29kZXIuCisgICAgICovCisgICAgdm9pZCBzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyID0gdHJ1ZSk7CisgICAgLyoqCisgICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGlmeWluZyB0aGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYC4KKyAgICAgKgorICAgICAqIElmIHRoZSBtaW1lIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQorICAgICAqIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbWltZSBUaGUgbmFtZSBvZiBhIG5ldyBtaW1lIHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIHdyaXRlciBUaGUgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0IGZvciBtb2RpZnlpbmcgdGhlCisgICAgICogYENhcGFiaWxpdGllc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW1lLiBgd3JpdGVyYCB3aWxsIGJlIHZhbGlkCisgICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBtaW1lYCBhbHJlYWR5IGV4aXN0cyBvciBub3QuCisgICAgICovCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1pbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtaW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0luZm9gLgorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvKiBtSW5mbzsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvIFRoZSB1bmRlcmx5aW5nIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKE1lZGlhQ29kZWNJbmZvKiBpbmZvKTsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZWRpYUNvZGVjSW5mb1dyaXRlcik7CisKKyAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0V3JpdGVyOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggYTVlMTM1MC4uMjU3MDAyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTQxLDggKzQxLDkgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKLSAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKKyAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgPSAwOwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCogZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSA9IDA7CiB9OwpAQCAtNTQsNyArNTUsOSBAQAogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UoKSB7fQogCiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IC8qdGltZVVzKi8sIGludCAvKm9wdGlvbiovKSB7IHJldHVybiBOVUxMOyB9CisgICAgdmlydHVhbCBWaWRlb0ZyYW1lKiBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgLyp0aW1lVXMqLywgaW50IC8qb3B0aW9uKi8sIGludCAvKmNvbG9yRm9ybWF0Ki8sIGJvb2wgLyptZXRhT25seSovKQorICAgIHsgcmV0dXJuIE5VTEw7IH0KICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQqIGV4dHJhY3RBbGJ1bUFydCgpIHsgcmV0dXJuIE5VTEw7IH0KICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQgLyprZXlDb2RlKi8pIHsgcmV0dXJuIE5VTEw7IH0KIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWEzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2RlZmluZSBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHZlbmRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQTFVHSU5fTUVUUklDU19SRVBPUlRJTkdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggOGVkMDdlZS4uNjVjMjY2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTc2LDggKzc2LDEwIEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwotICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sCisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsIGJvb2wgbWV0YU9ubHkgPSBmYWxzZSk7CiAgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKaW5kZXggODYzMjJkYS4uMDg2ZjY0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxPTVhGZW5jZVBhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214QnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9Cbk9NWEJ1ZmZlclNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDA4YTllNmEuLjdkMjdkNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC0xMzAsNyArMTMwLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpCisgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBkYXRhU291cmNlLCBjb25zdCBjaGFyICptaW1lKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKElEYXRhU291cmNlKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMzgsMTggKzEzOCwyMCBAQAogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1pbWUpOwogfQogCi1zcDxJTWVtb3J5PiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKK3NwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIG9wdGlvbiglZCkgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogfQogCiBjb25zdCBjaGFyKiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNjhiYWZlMS4uMjhhNzc0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQW5hbHl0aWNzU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFTkVSQVRFX1VOSVFVRV9TRVNTSU9OSUQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCJiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIik7CisgICAgICAgICAgICBBTE9HVygiYmFkIHJlc3BvbnNlIGZyb20gc2VydmljZSBmb3IgZ2VuZXJhdGVTZXNzaW9uSWQsIGVycj0lZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOwogICAgICAgICB9CiAgICAgICAgIHNlc3Npb25pZCA9IHJlcGx5LnJlYWRJbnQ2NCgpOwpAQCAtOTQsNiArOTQsNyBAQAogCiAgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTVUJNSVRfSVRFTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coImJhZCByZXNwb25zZSBmcm9tIHNlcnZpY2UgZm9yIHN1Ym1pdCwgZXJyPSVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JREludmFsaWQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCA0Mzg4MWIzLi5mOTY4YzA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNTksNiArNTksNyBAQAogTWVkaWFBbmFseXRpY3NJdGVtOjpNZWRpYUFuYWx5dGljc0l0ZW0oKQogICAgIDogbVBpZCgtMSksCiAgICAgICBtVWlkKC0xKSwKKyAgICAgIG1Qa2dWZXJzaW9uQ29kZSgwKSwKICAgICAgIG1TZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSUROb25lKSwKICAgICAgIG1UaW1lc3RhbXAoMCksCiAgICAgICBtRmluYWxpemVkKDApLApAQCAtNzAsNiArNzEsNyBAQAogTWVkaWFBbmFseXRpY3NJdGVtOjpNZWRpYUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpLZXkga2V5KQogICAgIDogbVBpZCgtMSksCiAgICAgICBtVWlkKC0xKSwKKyAgICAgIG1Qa2dWZXJzaW9uQ29kZSgwKSwKICAgICAgIG1TZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSUROb25lKSwKICAgICAgIG1UaW1lc3RhbXAoMCksCiAgICAgICBtRmluYWxpemVkKDApLApAQCAtOTgsNyArMTAwLDcgQEAKIAogICAgIC8vIGNsZWFuIGF0dHJpYnV0ZXMKICAgICAvLyBjb250ZW50cyBvZiB0aGUgYXR0cmlidXRlcwotICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1Qcm9wU2l6ZTsgaSsrICkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1Qcm9wQ291bnQ7IGkrKyApIHsKICAgICAgICAgY2xlYXJQcm9wKCZtUHJvcHNbaV0pOwogICAgIH0KICAgICAvLyB0aGUgYXR0cmlidXRlIHJlY29yZHMgdGhlbXNlbHZlcwpAQCAtMTIwLDYgKzEyMiw4IEBACiAgICAgICAgIC8vIGtleSBhcyBwYXJ0IG9mIGNvbnN0cnVjdG9yCiAgICAgICAgIGRzdC0+bVBpZCA9IHRoaXMtPm1QaWQ7CiAgICAgICAgIGRzdC0+bVVpZCA9IHRoaXMtPm1VaWQ7CisgICAgICAgIGRzdC0+bVBrZ05hbWUgPSB0aGlzLT5tUGtnTmFtZTsKKyAgICAgICAgZHN0LT5tUGtnVmVyc2lvbkNvZGUgPSB0aGlzLT5tUGtnVmVyc2lvbkNvZGU7CiAgICAgICAgIGRzdC0+bVNlc3Npb25JRCA9IHRoaXMtPm1TZXNzaW9uSUQ7CiAgICAgICAgIGRzdC0+bVRpbWVzdGFtcCA9IHRoaXMtPm1UaW1lc3RhbXA7CiAgICAgICAgIGRzdC0+bUZpbmFsaXplZCA9IHRoaXMtPm1GaW5hbGl6ZWQ7CkBAIC0yMDEsNiArMjA1LDI0IEBACiAgICAgcmV0dXJuIG1VaWQ7CiB9CiAKK01lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRQa2dOYW1lKEFTdHJpbmcgcGtnTmFtZSkgeworICAgIG1Qa2dOYW1lID0gcGtnTmFtZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0FTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtUGtnTmFtZTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFBrZ1ZlcnNpb25Db2RlKGludDMyX3QgcGtnVmVyc2lvbkNvZGUpIHsKKyAgICBtUGtnVmVyc2lvbkNvZGUgPSBwa2dWZXJzaW9uQ29kZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBrZ1ZlcnNpb25Db2RlOworfQorCiAvLyB0aGlzIGtleSBpcyBmb3IgdGhlIG92ZXJhbGwgcmVjb3JkIC0tICJjb2RlYyIsICJwbGF5ZXIiLCAiZHJtIiwgZXRjCiBNZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0S2V5KE1lZGlhQW5hbHl0aWNzSXRlbTo6S2V5IGtleSkgewogICAgIG1LZXkgPSBrZXk7CkBAIC0yNjMsMTEgKzI4NSwzMCBAQAogICAgICAgICBpID0gbVByb3BDb3VudCsrOwogICAgICAgICBwcm9wID0gJm1Qcm9wc1tpXTsKICAgICAgICAgcHJvcC0+c2V0TmFtZShuYW1lLCBsZW4pOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlTm9uZTsgICAgICAgIC8vIG1ha2UgY2FsbGVyIHNldCB0eXBlIGluZm8KICAgICB9CiAKICAgICByZXR1cm4gcHJvcDsKIH0KIAorLy8gdXNlZCB3aXRoaW4gdGhlIHN1bW1hcml6ZXJzOyByZXR1cm4gd2hldGhlciBwcm9wZXJ0eSBleGlzdGVkCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6cmVtb3ZlUHJvcChjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzaXplX3QgaSA9IGZpbmRQcm9wSW5kZXgobmFtZSwgbGVuKTsKKyAgICBpZiAoaSA8IG1Qcm9wQ291bnQpIHsKKyAgICAgICAgUHJvcCAqcHJvcCA9ICZtUHJvcHNbaV07CisgICAgICAgIGNsZWFyUHJvcChwcm9wKTsKKyAgICAgICAgaWYgKGkgIT0gbVByb3BDb3VudC0xKSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgbWlkZGxlLCBicmluZyBsYXN0IG9uZSBkb3duIHRvIGZpbGwgZ2FwCisgICAgICAgICAgICBjb3B5UHJvcChwcm9wLCAmbVByb3BzW21Qcm9wQ291bnQtMV0pOworICAgICAgICAgICAgY2xlYXJQcm9wKCZtUHJvcHNbbVByb3BDb3VudC0xXSk7CisgICAgICAgIH0KKyAgICAgICAgbVByb3BDb3VudC0tOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBzZXQgdGhlIHZhbHVlcwogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OnNldEludDMyKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBpbnQzMl90IHZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKQEAgLTU2OCw2ICs2MDksMTAgQEAKICAgICAvLyBpbnRvICd0aGlzJyBvYmplY3QKICAgICAvLyAuLiB3ZSBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nIHRvIHB1dCBhd2F5LgogICAgIG1LZXkgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgbVBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbVVpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbVBrZ05hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgbVBrZ1ZlcnNpb25Db2RlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICBtU2Vzc2lvbklEID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICBtRmluYWxpemVkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICBtVGltZXN0YW1wID0gZGF0YS5yZWFkSW50NjQoKTsKQEAgLTYxMSw2ICs2NTYsMTAgQEAKIAogCiAgICAgZGF0YS0+d3JpdGVDU3RyaW5nKG1LZXkuY19zdHIoKSk7CisgICAgZGF0YS0+d3JpdGVJbnQzMihtUGlkKTsKKyAgICBkYXRhLT53cml0ZUludDMyKG1VaWQpOworICAgIGRhdGEtPndyaXRlQ1N0cmluZyhtUGtnTmFtZS5jX3N0cigpKTsKKyAgICBkYXRhLT53cml0ZUludDMyKG1Qa2dWZXJzaW9uQ29kZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQ2NChtU2Vzc2lvbklEKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1GaW5hbGl6ZWQpOwogICAgIGRhdGEtPndyaXRlSW50NjQobVRpbWVzdGFtcCk7CkBAIC02NTEsMjEgKzcwMCw1NCBAQAogCiAKIEFTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZygpIHsKKyAgIHJldHVybiB0b1N0cmluZygtMSk7Cit9CiAKLSAgICBBU3RyaW5nIHJlc3VsdCA9ICIoIjsKK0FTdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZyhpbnQgdmVyc2lvbikgeworCisgICAgLy8gdjAgOiByZWxlYXNlZCB3aXRoICdvJworICAgIC8vIHYxIDogYnVnIGZpeCAobWlzc2luZyBwaWQvZmluYWxpemVkIHNlcGFyYXRvciksCisgICAgLy8gICAgICBhZGRzIGFwayBuYW1lLCBhcGsgdmVyc2lvbiBjb2RlCisKKyAgICBpZiAodmVyc2lvbiA8PSBQUk9UT19GSVJTVCkgeworICAgICAgICAvLyBkZWZhdWx0IHRvIG9yaWdpbmFsIHYwIGZvcm1hdCwgdW50aWwgcHJvcGVyIHBhcnNlcnMgYXJlIGluIHBsYWNlCisgICAgICAgIHZlcnNpb24gPSBQUk9UT19WMDsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPiBQUk9UT19MQVNUKSB7CisgICAgICAgIHZlcnNpb24gPSBQUk9UT19MQVNUOworICAgIH0KKworICAgIEFTdHJpbmcgcmVzdWx0OwogICAgIGNoYXIgYnVmZmVyWzUxMl07CiAKKyAgICBpZiAodmVyc2lvbiA9PSBQUk9UT19WMCkgeworICAgICAgICByZXN1bHQgPSAiKCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlslZDoiLCB2ZXJzaW9uKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKwogICAgIC8vIHNhbWUgb3JkZXIgYXMgd2Ugc3BpbGwgaW50byB0aGUgcGFyY2VsLCBhbHRob3VnaCBub3QgcmVxdWlyZWQKICAgICAvLyBrZXkrc2Vzc2lvbiBhcmUgb3VyIHByaW1hcnkgbWF0Y2hpbmcgY3JpdGVyaWEKLSAgICAvL1JCRSBBTE9HRCgibUtleS5jX3N0ciIpOwogICAgIHJlc3VsdC5hcHBlbmQobUtleS5jX3N0cigpKTsKLSAgICAvL1JCRSBBTE9HRCgicG9zdC1tS2V5LmNfc3RyIik7CiAgICAgcmVzdWx0LmFwcGVuZCgiOiIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlIiBQUklkNjQgIjoiLCBtU2Vzc2lvbklEKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICAvLyB3ZSBuZWVkIHRoZXNlIGludGVybmFsbHksIGJ1dCBkb24ndCB3YW50IHRvIHVwbG9hZCB0aGVtCi0gICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiVkIiwgbVVpZCwgbVBpZCk7CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIGlmICh2ZXJzaW9uID49IFBST1RPX1YxKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobVBrZ05hbWUpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiOiVkOiIsIG1Qa2dWZXJzaW9uQ29kZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICAvLyBpbiAnbycgKHYxKSAsIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBwaWQgYW5kIGZpbmFsaXplZCB3YXMgb21pdHRlZAorICAgIGlmICh2ZXJzaW9uIDw9IFBST1RPX1YwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIG1QaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZDoiLCBtUGlkKTsKKyAgICB9CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiIsIG1GaW5hbGl6ZWQpOwpAQCAtNzEzLDcgKzc5NSwxMSBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKKyAgICBpZiAodmVyc2lvbiA9PSBQUk9UT19WMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC03MzQsMTEgKzgyMCwxNiBAQAogICAgIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IHN2YyA9IGdldEluc3RhbmNlKCk7CiAKICAgICBpZiAoc3ZjICE9IE5VTEwpIHsKLSAgICAgICAgc3ZjLT5zdWJtaXQodGhpcywgZm9yY2VuZXcpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IG5ld2lkID0gc3ZjLT5zdWJtaXQodGhpcywgZm9yY2VuZXcpOworICAgICAgICBpZiAobmV3aWQgPT0gU2Vzc2lvbklESW52YWxpZCkgeworICAgICAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKLSAgICAgICAgQUxPR0QoIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKKyAgICAgICAgQUxPR1coIlVuYWJsZSB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KQEAgLTc0Nyw2ICs4MzgsNyBAQAogLy8gc3RhdGljCiBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBNZWRpYUFuYWx5dGljc0l0ZW06OnNBbmFseXRpY3NTZXJ2aWNlOwogc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CitzdGF0aWMgaW50IHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA9IFNWQ19UUklFUzsKIAogLy9zdGF0aWMKIGJvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKSB7CkBAIC03NjQsMTAgKzg1NiwyOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisKKy8vIG1vbml0b3IgaGVhbHRoIG9mIG91ciBjb25uZWN0aW9uIHRvIHRoZSBtZXRyaWNzIHNlcnZpY2UKK2NsYXNzIE1lZGlhTWV0cmljc0RlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmKSB7CisgICAgICAgICAgICBBTE9HVygiUmVhY3F1aXJlIHNlcnZpY2UgY29ubmVjdGlvbiBvbiBuZXh0IHJlcXVlc3QiKTsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6ZHJvcEluc3RhbmNlKCk7CisgICAgICAgIH0KK307CisKK3N0YXRpYyBzcDxNZWRpYU1ldHJpY3NEZWF0aE5vdGlmaWVyPiBzTm90aWZpZXIgPSBOVUxMOworCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpkcm9wSW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNJbml0TXV0ZXgpOworICAgIHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA9IFNWQ19UUklFUzsKKyAgICBzQW5hbHl0aWNzU2VydmljZSA9IE5VTEw7Cit9CisKIC8vc3RhdGljCiBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBNZWRpYUFuYWx5dGljc0l0ZW06OmdldEluc3RhbmNlKCkgeworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlcnZpY2VuYW1lID0gIm1lZGlhLm1ldHJpY3MiOwotICAgIHN0YXRpYyBpbnQgdHJpZXNfcmVtYWluaW5nID0gU1ZDX1RSSUVTOwogICAgIGludCBlbmFibGVkID0gaXNFbmFibGVkKCk7CiAKICAgICBpZiAoZW5hYmxlZCA9PSBmYWxzZSkgewpAQCAtNzk5LDE1ICs5MDksMjAgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNJbml0TXV0ZXgpOwogICAgICAgICBjb25zdCBjaGFyICpiYWRuZXNzID0gIiI7CiAKLSAgICAgICAgLy8gdGhpbmsgb2YgdHJpZXNfcmVtYWluaW5nIGFzIHRlbGxpbmcgdXMgd2hldGhlciBzZXJ2aWNlPT1OVUxMIGJlY2F1c2UKKyAgICAgICAgLy8gdGhpbmsgb2YgcmVtYWluaW5nQmluZEF0dGVtcHRzIGFzIHRlbGxpbmcgdXMgd2hldGhlciBzZXJ2aWNlPT1OVUxMIGJlY2F1c2UKICAgICAgICAgLy8gKDEpIHdlIGhhdmVuJ3QgdHJpZWQgdG8gaW5pdGlhbGl6ZSBpdCB5ZXQKICAgICAgICAgLy8gKDIpIHdlJ3ZlIHRyaWVkIHRvIGluaXRpYWxpemUgaXQsIGJ1dCBmYWlsZWQuCi0gICAgICAgIGlmIChzQW5hbHl0aWNzU2VydmljZSA9PSBOVUxMICYmIHRyaWVzX3JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgaWYgKHNBbmFseXRpY3NTZXJ2aWNlID09IE5VTEwgJiYgcmVtYWluaW5nQmluZEF0dGVtcHRzID4gMCkgewogICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHNtICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihzZXJ2aWNlbmFtZSkpOwogICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBzQW5hbHl0aWNzU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUFuYWx5dGljc1NlcnZpY2U+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzTm90aWZpZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc05vdGlmaWVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzTm90aWZpZXIgPSBuZXcgTWVkaWFNZXRyaWNzRGVhdGhOb3RpZmllcigpOworICAgICAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNOb3RpZmllcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYmFkbmVzcyA9ICJkaWQgbm90IGZpbmQgc2VydmljZSI7CiAgICAgICAgICAgICAgICAgfQpAQCAtODE2LDggKzkzMSw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzQW5hbHl0aWNzU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyaWVzX3JlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJpZXNfcmVtYWluaW5nLS07CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ0JpbmRBdHRlbXB0cyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQmluZEF0dGVtcHRzLS07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChERUJVR19TRVJWSUNFQUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmFibGUgdG8gYmluZCB0byBzZXJ2aWNlICVzOiAlcyIsIHNlcnZpY2VuYW1lLCBiYWRuZXNzKTsKQEAgLTgyOSw3ICs5NDQsNiBAQAogICAgIH0KIH0KIAotCiAvLyBtZXJnZSB0aGUgaW5mbyBmcm9tICdpbmNvbWluZycgaW50byB0aGlzIHJlY29yZC4KIC8vIHdlIGZpbmlzaCB3aXRoIGEgdW5pb24gb2YgdGhpcytpbmNvbWluZyBhbmQgc3BlY2lhbCBoYW5kbGluZyBmb3IgY29sbGlzaW9ucwogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06Om1lcmdlKE1lZGlhQW5hbHl0aWNzSXRlbSAqaW5jb21pbmcpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggZGM1MDFiMi4uZGQ3NDUyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTQyLDYgKzQyLDcgQEAKICAgICBmcmllbmQgY2xhc3MgSU1lZGlhQW5hbHl0aWNzU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFNZXRyaWNzSk5JOwogICAgIGZyaWVuZCBjbGFzcyBNZXRyaWNzU3VtbWFyaXplcjsKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFNZXRyaWNzRGVhdGhOb3RpZmllcjsKIAogICAgIHB1YmxpYzoKIApAQCAtNzUsNiArNzYsMTQgQEAKICAgICAgICAgdHlwZWRlZiBjb25zdCBjaGFyICpBdHRyOwogCiAKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBQUk9UT19WMCA9IDAsCisgICAgICAgICAgICBQUk9UT19GSVJTVCA9IFBST1RPX1YwLAorICAgICAgICAgICAgUFJPVE9fVjEgPSAxLAorICAgICAgICAgICAgUFJPVE9fTEFTVCA9IFBST1RPX1YxLAorICAgICAgICB9OworCisKICAgICBwdWJsaWM6CiAKICAgICAgICAgLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCkBAIC0xNjEsMTEgKzE3MCwxOCBAQAogICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldFVpZCh1aWRfdCk7CiAgICAgICAgIHVpZF90IGdldFVpZCgpIGNvbnN0OwogCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0UGtnTmFtZShBU3RyaW5nKTsKKyAgICAgICAgQVN0cmluZyBnZXRQa2dOYW1lKCkgY29uc3Q7CisKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dWZXJzaW9uQ29kZShpbnQzMl90KTsKKyAgICAgICAgaW50MzJfdCBnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0OworCiAgICAgICAgIC8vIG91ciBzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGJpbmRlciBjYWxscwogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCiAgICAgICAgIEFTdHJpbmcgdG9TdHJpbmcoKTsKKyAgICAgICAgQVN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CiAKICAgICAgICAgLy8gYXJlIHdlIGNvbGxlY3RpbmcgYW5hbHl0aWNzIGRhdGEKICAgICAgICAgc3RhdGljIGJvb2wgaXNFbmFibGVkKCk7CkBAIC0xODgsMTAgKzIwNCwxMyBAQAogICAgICAgICAvLyB0byBoZWxwIHZhbGlkYXRlIHRoYXQgQSBkb2Vzbid0IG1lc3Mgd2l0aCBCJ3MgcmVjb3JkcwogICAgICAgICBwaWRfdCAgICAgbVBpZDsKICAgICAgICAgdWlkX3QgICAgIG1VaWQ7CisgICAgICAgIEFTdHJpbmcgICBtUGtnTmFtZTsKKyAgICAgICAgaW50MzJfdCAgIG1Qa2dWZXJzaW9uQ29kZTsKIAogICAgICAgICAvLyBsZXQncyByZXVzZSBhIGJpbmRlciBjb25uZWN0aW9uCiAgICAgICAgIHN0YXRpYyBzcDxJTWVkaWFBbmFseXRpY3NTZXJ2aWNlPiBzQW5hbHl0aWNzU2VydmljZTsKICAgICAgICAgc3RhdGljIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IGdldEluc3RhbmNlKCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGRyb3BJbnN0YW5jZSgpOwogCiAgICAgICAgIC8vIHRyYWNraW5nIGluZm9ybWF0aW9uCiAgICAgICAgIFNlc3Npb25JRF90IG1TZXNzaW9uSUQ7ICAgICAgICAgLy8gZ3JvdXBpbmcgc2ltaWxhciByZWNvcmRzCkBAIC0yMjgsNiArMjQ3LDcgQEAKICAgICAgICAgc2l6ZV90IGZpbmRQcm9wSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgICAgIFByb3AgKmZpbmRQcm9wKGNvbnN0IGNoYXIgKm5hbWUpOwogICAgICAgICBQcm9wICphbGxvY2F0ZVByb3AoY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgIGJvb2wgcmVtb3ZlUHJvcChjb25zdCBjaGFyICpuYW1lKTsKIAogICAgICAgICBzaXplX3QgbVByb3BDb3VudDsKICAgICAgICAgc2l6ZV90IG1Qcm9wU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggNTRkNjAxNC4uNjg2YzA1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTI0NCw4ICsyNDQsMTIgQEAKICAgICBpZiAoc0luaXRDb21wbGV0ZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgcmVnaXN0ZXJGYWN0b3J5X2wobmV3IE51UGxheWVyRmFjdG9yeSgpLCBOVV9QTEFZRVIpOwotICAgIHJlZ2lzdGVyRmFjdG9yeV9sKG5ldyBUZXN0UGxheWVyRmFjdG9yeSgpLCBURVNUX1BMQVlFUik7CisgICAgSUZhY3RvcnkqIGZhY3RvcnkgPSBuZXcgTnVQbGF5ZXJGYWN0b3J5KCk7CisgICAgaWYgKHJlZ2lzdGVyRmFjdG9yeV9sKGZhY3RvcnksIE5VX1BMQVlFUikgIT0gT0spCisgICAgICAgIGRlbGV0ZSBmYWN0b3J5OworICAgIGZhY3RvcnkgPSBuZXcgVGVzdFBsYXllckZhY3RvcnkoKTsKKyAgICBpZiAocmVnaXN0ZXJGYWN0b3J5X2woZmFjdG9yeSwgVEVTVF9QTEFZRVIpICE9IE9LKQorICAgICAgICBkZWxldGUgZmFjdG9yeTsKIAogICAgIHNJbml0Q29tcGxldGUgPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5MTg4N2ExLi4zNDQ1NDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKIAotI2luY2x1ZGUgPE9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KIAogI2luY2x1ZGUgIkhEQ1AuaCIKICNpbmNsdWRlICJIVFRQQmFzZS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNzkzZjQ3Ni4uNWE0NjhmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0xNzUsNyArMTc1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKQorICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xODYsMTYgKzE4NiwxOCBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1pbWUpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOwogICAgIHJldHVybiByZXQ7CiB9CiAKIE11dGV4IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzTG9jazsKIAotc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglbGxkIHVzKSBvcHRpb24oJWQpIiwgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKICAgICBtVGh1bWJuYWlsLmNsZWFyKCk7CkBAIC0yMDMsMTIgKzIwNSwxMyBAQAogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FwdHVyZSBhIHZpZGVvIGZyYW1lIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihWaWRlb0ZyYW1lKSArIGZyYW1lLT5tU2l6ZTsKKyAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCk7CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIiKTsKQEAgLTIyMiwxNiArMjI1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFZpZGVvRnJhbWUgKmZyYW1lQ29weSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUgKj4obVRodW1ibmFpbC0+cG9pbnRlcigpKTsKLSAgICBmcmFtZUNvcHktPm1XaWR0aCA9IGZyYW1lLT5tV2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tSGVpZ2h0ID0gZnJhbWUtPm1IZWlnaHQ7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheVdpZHRoID0gZnJhbWUtPm1EaXNwbGF5V2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheUhlaWdodCA9IGZyYW1lLT5tRGlzcGxheUhlaWdodDsKLSAgICBmcmFtZUNvcHktPm1TaXplID0gZnJhbWUtPm1TaXplOwotICAgIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUgPSBmcmFtZS0+bVJvdGF0aW9uQW5nbGU7Ci0gICAgQUxPR1YoInJvdGF0aW9uOiAlZCIsIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAodWludDhfdCAqKWZyYW1lQ29weSArIHNpemVvZihWaWRlb0ZyYW1lKTsKLSAgICBtZW1jcHkoZnJhbWVDb3B5LT5tRGF0YSwgZnJhbWUtPm1EYXRhLCBmcmFtZS0+bVNpemUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAwOworICAgIGZyYW1lQ29weS0+Y29weUZsYXR0ZW5lZCgqZnJhbWUpOwogICAgIGRlbGV0ZSBmcmFtZTsgIC8vIEZpeCBtZW1vcnkgbGVha2FnZQogICAgIHJldHVybiBtVGh1bWJuYWlsOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBmZTc1NDdjLi5jNzhjZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtNDksOCArNDksOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCA2YTA5MjI3Li5kZjM2MDQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN1cmZhY2UgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggOGZlMjU1Yi4uYWMxODdjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgICAgICAgICAgZm9ybWF0LCBtU3VyZmFjZSwgY3J5cHRvLCAwIC8qIGZsYWdzICovKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIFslc10gZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwogICAgICAgICBtQ29kZWMuY2xlYXIoKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgbUNvZGVjLmNsZWFyKCk7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CkBAIC00NjAsNiArNDYwLDEyIEBACiAgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CiAgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKICAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gb25SZXN1bWUgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Db2RlYy0+c3RhcnQoKTsKIH0KIApAQCAtNDgxLDcgKzQ4Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCBbJXNdIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgogICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KQEAgLTUzMCw3ICs1MzYsNyBAQAogICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KICAgICB9CkBAIC02MzEsMTAgKzYzNywxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXIpOwogCiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIsIGZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjk3LDExICs3MTAsMTggQEAKICAgICAgICAgc2l6ZV90IHNpemUsCiAgICAgICAgIGludDY0X3QgdGltZVVzLAogICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuT3V0cHV0QnVmZmVyIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogLy8gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyKTsKIAogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTQ5LDYgKzk2OSwxMiBAQAogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBvbklucHV0QnVmZmVyRmV0Y2hlZCB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgYnVmZmVySXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CiAgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKQEAgLTk3OSw3ICsxMDA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgJXMgKGVycj0lZCksIEVPUyAlcyBxdWV1ZWQiLAorICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgWyVzXSAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKICAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKQEAgLTEwNzMsNyArMTA5OSw3IEBACiAgICAgICAgIH0gLy8gbm8gY3J5cHRJbmZvCiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciAlcyAoZXJyPSVkLCAlcykiLAorICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciBbJXNdIChlcnI9JWQsICVzKSIsCiAgICAgICAgICAgICAgICAgICAgIChjcnlwdEluZm8gIT0gTlVMTCA/ICJTZWN1cmUiIDogIiIpLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIsIGVycm9yRGV0YWlsTXNnLmNfc3RyKCkpOwogICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTExMDIsNyArMTEyOCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBOT19JTklUOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgewogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOwogICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CkBAIC0xMTExLDcgKzExMzksNyBAQAogICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgpOwogICAgIH0KICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciBbJXNdIChlcnI9JWQpIiwKICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IDI1ZTJkNzMuLmE1MTJhMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIocGlkKSksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCiAgICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKKyAgICAgIG1DbGllbnRVaWQoLTEpLAogICAgICAgbUF0RU9TKGZhbHNlKSwKICAgICAgIG1Mb29waW5nKGZhbHNlKSwKICAgICAgIG1BdXRvTG9vcChmYWxzZSkgewpAQCAtMTEwLDYgKzExMSwxMCBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VUlEKHVpZF90IHVpZCkgewogICAgIG1QbGF5ZXItPnNldFVJRCh1aWQpOworICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjE2LDYgKzYyMSw3IEBACiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOwpAQCAtNjU0LDExICs2NjAsNiBAQAogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOwogICAgIH0KIAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewotICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgIGR1bXAoLTEsIGFyZ3MpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtOTUzLDcgKzk1NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IGFiMTk1NWUuLjMyN2YyMWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0xMzIsMTIgKzEzMiwxNCBAQAogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAogICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgdWlkX3QgbUNsaWVudFVpZDsKICAgICBtdXRhYmxlIE11dGV4IG1NZXRyaWNzTG9jazsKIAogICAgIGJvb2wgbUF0RU9TOwogICAgIGJvb2wgbUxvb3Bpbmc7CiAgICAgYm9vbCBtQXV0b0xvb3A7CiAKKwogICAgIHZvaWQgdXBkYXRlTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSk7CiAgICAgdm9pZCBsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDc1OGRiMWYuLmJkODY2Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewpAQCAtOTE3LDEwICs5MTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CiAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCiAgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOwotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKQEAgLTExNTIsNyArMTE1MiwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisKKyAgICBjb25zdCBpbnQ2NF90IGF1ZGlvU2lua1BsYXllZFVzID0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgaW50NjRfdCBwZW5kaW5nVXMgPSB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gYXVkaW9TaW5rUGxheWVkVXM7CisgICAgaWYgKHBlbmRpbmdVcyA8IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdGltZXN0YW1wIGlzIHN0YWxlLgorICAgICAgICBBTE9HVygiJXM6IHBlbmRpbmdVcyAlbGxkIDwgMCwgY2xhbXBpbmcgdG8gemVybywgcG90ZW50aWFsIHJlc3VtZSBhZnRlciBwYXVzZSAiCisgICAgICAgICAgICAgICAgIndyaXR0ZW5BdWRpb0R1cmF0aW9uVXM6ICVsbGQsIGF1ZGlvU2lua1BsYXllZFVzOiAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGxvbmcgbG9uZylwZW5kaW5nVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl3cml0dGVuQXVkaW9EdXJhdGlvblVzLCAobG9uZyBsb25nKWF1ZGlvU2lua1BsYXllZFVzKTsKKyAgICAgICAgcGVuZGluZ1VzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHBlbmRpbmdVczsKIH0KIAogaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgewpAQCAtMTQwOCw2ICsxNDE5LDExIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5RU9TX2woYXVkaW8sIGZpbmFsUmVzdWx0LCBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOwpAQCAtMTQyMCw2ICsxNDM2LDExIEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwogICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICAvLyBWaWRlbyBtaWdodCBvdXRsaXZlIGF1ZGlvLiBDbGVhciBhbmNob3IgdG8gZW5hYmxlIHZpZGVvIG9ubHkgY2FzZS4KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggZTY4NTBiNS4uZjU4Yjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yNzUsNiArMjc1LDcgQEAKICAgICB2b2lkIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKICAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgdm9pZCBub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKaW5kZXggZjUxMTg3Ni4uNDIyMGI3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCkBAIC0xLDE1ICsxLDUxIEBACisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibmJhaW9fbW9ub19kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAiTW9ub1BpcGUuY3BwIiwKKyAgICAgICAgIk1vbm9QaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJOQkFJTy5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfbW9ubyJdLAorfQorCisvLyBsaWJuYmFpb19tb25vIGlzIHRoZSBwYXJ0IG9mIGxpYm5iYWlvIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB2ZW5kb3JzIHRvIHVzZS4gVmVuZG9yIG1vZHVsZXMgY2FuJ3QKKy8vIGxpbmsgYWdhaW5zdCBsaWJuYmFpbyBhbmQgc3lzdGVtIG1vZHVsZXMgY2FuJ3QgbGluayBhZ2FpbnN0IGxpYm5iYWlvX21vbm8uIFRoZSByZXN0IG9mIGxpYm5iYWlvCisvLyBwdWxscyBpbiB0b28gbWFueSBvdGhlciBkZXBlbmRlbmNpZXMuCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm8iLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibmJhaW8iLAorICAgIGRlZmF1bHRzOiBbImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbUluU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbU91dFNpbmsuY3BwIiwKLSAgICAgICAgIk1vbm9QaXBlLmNwcCIsCi0gICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAotICAgICAgICAiTkJBSU8uY3BwIiwKICAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCiAgICAgICAgICJQaXBlLmNwcCIsCiAgICAgICAgICJQaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLAogICAgIF0sCiAKQEAgLTI0LDggKzYwLDggQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTM1LDcgKzcxLDUgQEAKIAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggY2JmZjg3ZC4uODU2NDg5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogCkBAIC04Miw4ICs4Myw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uNjQ7Ci0gICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0aW1lLnR2X25zZWM7CisgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCBlYmI5MGM4Li4yZjYzOWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0xOCwxNCArMTgsMTQgQEAKICogRG9jdW1lbnRhdGlvbjogV29ya2Zsb3cgc3VtbWFyeSBmb3IgaGlzdG9ncmFtIGRhdGEgcHJvY2Vzc2luZzoKICogRm9yIG1vcmUgZGV0YWlscyBvbiBGSUZPLCBwbGVhc2Ugc2VlIHN5c3RlbS9tZWRpYS9hdWRpb191dGlsczsgZG94eWdlbgogKiBUT0RPOiBhZGQgdGhpcyBkb2N1bWVudGF0aW9uIHRvIGRveHlnZW4gb25jZSBpdCBpcyBmdXJ0aGVyIGRldmVsb3BlZAotKiAxKSB3cml0aW5nIHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0qIG9uV29yaworKiAxKSBXcml0aW5nIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKyogb25Xb3JrKCkKICogICAgIENhbGxlZCBldmVyeSBwZXJpb2QgbGVuZ3RoIChlLmcuLCA0bXMpCiAqICAgICBDYWxscyBMT0dfSElTVF9UUwogKiBMT0dfSElTVF9UUwotKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUyBvbmNlCi0qIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUworKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKKyogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTIG9uY2UKKyogTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMKICogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyBvbiBoYXNoIGFuZCBjdXJyZW50IHRpbWVzdGFtcAogKiAgICAgdGltZSBpcyBpbiBDTE9DS19NT05PVE9OSUMgY29udmVydGVkIHRvIG5zCiAqIE5CTE9HOjpXcml0ZXI6OmxvZyhFdmVudCwgY29uc3Qgdm9pZCosIHNpemVfdCkKQEAgLTQ0LDYgKzQ0LDggQEAKICogc3NpemVfdCBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluCiAqICAgICBEZXRlcm1pbmVzIHJlYWRhYmxlIGJ1ZmZlciBzZWN0aW9uIHZpYSBwb2ludGVyIGFyaXRobWV0aWMgb24gcmVhZGVyCiAqICAgICBhbmQgd3JpdGVyIHBvaW50ZXJzCisqIFNpbWlsYXJseSwgTE9HX0FVRElPX1NUQVRFKCkgaXMgY2FsbGVkIGJ5IG9uU3RhdGVDaGFuZ2Ugd2hlbmV2ZXIgYXVkaW8gaXMKKyogdHVybmVkIG9uIG9yIG9mZiwgYW5kIHdyaXRlcyB0aGlzIG5vdGlmaWNhdGlvbiB0byB0aGUgRklGTy4KICoKICogMikgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkKICogVGhyZWFkOjp0aHJlYWRsb29wKCkKQEAgLTUxLDYgKzUzLDcgQEAKICogTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKICogICAgIGNhbGxzIE5CTG9nOjpNZXJnZXI6Om1lcmdlCiAqIE5CTG9nOjpNZXJnZXI6Om1lcmdlCisqICAgICBNZXJnZXMgc25hcHNob3RzIHNvcnRlZCBieSB0aW1lc3RhbXAKICogICAgIGZvciBlYWNoIHJlYWRlciBpbiB2ZWN0b3Igb2YgY2xhc3MgTmFtZWRSZWFkZXIsCiAqICAgICBjYWxsc05hbWVkUmVhZGVyOjpyZWFkZXIoKS0+Z2V0U25hcHNob3QKICogICAgIFRPRE86IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudApAQCAtNTksMTEgKzYyLDEyIEBACiAqICAgICBjYWxscyBtRmlmb1JlYWRlci0+b2J0YWluIHRvIGZpbmQgcmVhZGFibGUgZGF0YQogKiAgICAgc2V0cyBzbmFwc2hvdC5iZWdpbigpIGFuZCAuZW5kKCkgaXRlcmF0b3JzIHRvIGJvdW5kYXJpZXMgb2YgdmFsaWQgZW50cmllcwogKiAgICAgbW92ZXMgdGhlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIHRoZSBsYXN0IGVudHJ5IHJlYWQKLSogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoMyksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQorKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICg0KSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCiAqCiAqIDMpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBwcml2YXRlIGJ1ZmZlcgogKiBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAKLSogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KSBvbiBpbnN0YW5jZSBvZiBzdWJjbGFzcyBtZXJnZVJlYWRlcgorKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChDT05TT0xFKQorKiAgICAgVGhlIHByaXZhdGUgYnVmZmVyIGNvbnRhaW5zIGFsbCBsb2dzIGZvciBhbGwgcmVhZGVycyBpbiBzaGFyZWQgbWVtb3J5CiAqIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KQogKiAgICAgY2FsbHMgZ2V0U25hcHNob3Qgb24gdGhlIGN1cnJlbnQgcmVhZGVyCiAqICAgICBjYWxscyBkdW1wKGludCwgc2l6ZV90LCBTbmFwc2hvdCkKQEAgLTcyLDkgKzc2LDEwIEBACiAqICAgICAoc3RyaW5nLCB0aW1lc3RhbXAsIGV0Yy4uLikKICogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgYWRkcyBhIGxpc3Qgb2YgdGltZXN0YW1wIHNlcXVlbmNlcwogKiAgICAgKGhpc3RvZ3JhbSBlbnRyeSkgdG8gTkJMb2c6Om1IaXN0cwotKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0ZMVVNILCBjYWxscyBkcmF3SGlzdG9ncmFtIG9uIGVhY2ggZWxlbWVudCBpbgotKiAgICAgdGhlIGxpc3QgYW5kIGVyYXNlcyBpdAotKiAgICAgVE9ETzogd2hlbiBkbyB0aGVzZSBldmVudHMgb2NjdXI/CisqICAgICBUT0RPOiBhZGQgZXZlcnkgSElTVE9HUkFNX0VOVFJZX1RTIHRvIHR3bworKiAgICAgY2lyY3VsYXIgYnVmZmVyczogb25lIHNob3J0LXRlcm0gYW5kIG9uZSBsb25nLXRlcm0gKGNhbiBhZGQgZXZlbiBsb25nZXItdGVybQorKiAgICAgc3RydWN0dXJlcyBpbiB0aGUgZnV0dXJlKS4gV2hlbiBkdW1wIGlzIGNhbGxlZCwgcHJpbnQgZXZlcnl0aGluZyBjdXJyZW50bHkKKyogICAgIGluIHRoZSBidWZmZXIuCiAqIE5CTG9nOjpkcmF3SGlzdG9ncmFtCiAqICAgICBpbnB1dDogdGltZXN0YW1wIGFycmF5CiAqICAgICBidWNrZXRzIHRoaXMgdG8gYSBoaXN0b2dyYW0gYW5kIHByaW50cwpAQCAtODIsNyArODcsNyBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KQEAgLTEwMiw2ICsxMDcsOCBAQAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KIC8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMzQsNyArMTQxLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOgorICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTEzLDcgKzUyMCw3IEBACiAgICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwogfQogCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCiB7CiAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMjIgKzUyOSw3IEBACiAgICAgZGF0YS5oYXNoID0gaGFzaDsKICAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwogICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwogICAgIH0KQEAgLTc3MSwxNSArNzYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKIGNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRkxVU0h9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzg3LDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05MTEsNjEgKzg3MCwxNyBAQAogCiB9CiAKLS8vIHdyaXRlcyBzYW1wbGUgZGVsdGFzIHRvIGZpbGUsIGVpdGhlciB0cnVuY2F0aW5nIG9yIGFwcGVuZGluZwotaW5saW5lIHZvaWQgd3JpdGVIaXN0VG9GaWxlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLCBib29sIGFwcGVuZCkgewotICAgIC8vIG5hbWUgb2YgZmlsZSBvbiBhdWRpb3NlcnZlcgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTmFtZSA9IChjaGFyICopIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvc2FtcGxlX3Jlc3VsdHMudHh0IjsKLSAgICAvLyBzdG9yZXMgZGVsdGFzIGJldHdlZW4gdGhlIHNhbXBsZXMKLSAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnRlcnZhbHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludGVydmFscy5wdXNoX2JhY2soZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOwotICAgIH0KLSAgICBpZiAoaW50ZXJ2YWxzLmVtcHR5KCkpIHJldHVybjsKLSAgICAvLyBEZWxldGVzIG1heGltdW0gdmFsdWUgaW4gYSBoaXN0b2dyYW0uIFRlbXAgcXVpY2sgZml4LgotICAgIC8vIEZJWE1FOiBuZWVkIHRvIGZpbmQgcm9vdCBjYXVzZSBvZiBhcHByb3guIDM1dGggZWxlbWVudCBmcm9tIHRoZSBlbmQKLSAgICAvLyBjb25zaXN0ZW50bHkgYmVpbmcgYW4gb3V0bGllciBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIG9mIGEgZmx1c2gKLSAgICAvLyBBTE9HVygiJSIgUFJJZDY0ICJiZWZvcmUiLCAoaW50NjRfdCkgKihzdGQ6Om1heF9lbGVtZW50KGludGVydmFscy5iZWdpbigpLCBpbnRlcnZhbHMuZW5kKCkpKSk7Ci0gICAgaW50ZXJ2YWxzLmVyYXNlKHN0ZDo6bWF4X2VsZW1lbnQoaW50ZXJ2YWxzLmJlZ2luKCksIGludGVydmFscy5lbmQoKSkpOwotICAgIC8vIEFMT0dXKCIlIiBQUklkNjQgImFmdGVyIiwgKGludDY0X3QpICooc3RkOjptYXhfZWxlbWVudChpbnRlcnZhbHMuYmVnaW4oKSwgaW50ZXJ2YWxzLmVuZCgpKSkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzOwotICAgIG9mcy5vcGVuKGtOYW1lLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKLSAgICBpZiAoIW9mcykgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG9mcyA8PCBpbnRlcnZhbHNbaV0gPDwgIlxuIjsKLSAgICB9Ci0gICAgb2ZzLmNsb3NlKCk7Ci19Ci0KKy8vIFRPRE86IG1vdmUgdGhpcyB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisvLyBUT0RPOiBtYWtlIGNhbGwgdG8gZHVtcCBwZXJpb2RpYyBzbyB0aGF0IGRhdGEgaW4gc2hhcmVkIEZJRk8gZG9lcyBub3QgZ2V0IG92ZXJ3cml0dGVuCiB2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCiB7Ci0gIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7Ci0jaWYgMAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0aW1lX3QgbWF4U2VjID0gLTE7Ci0gICAgd2hpbGUgKGVudHJ5IC0gc3RhcnQgPj0gKGludCkgRW50cnk6OmtPdmVyaGVhZCkgewotICAgICAgICBpZiAocHJldkVudHJ5IC0gc3RhcnQgPCAwIHx8ICFwcmV2RW50cnkuaGFzQ29uc2lzdGVudExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldkVudHJ5LT50eXBlID09IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgaWYgKHByZXZFbnRyeS0+bGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29ycnVwdAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkVudHJ5LmNvcHlEYXRhKCh1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGlmICh0cy50dl9zZWMgPiBtYXhTZWMpIHsKLSAgICAgICAgICAgICAgICBtYXhTZWMgPSB0cy50dl9zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLS1lbnRyeTsKLSAgICAgICAgLS1wcmV2RW50cnk7Ci0gICAgfQotI2VuZGlmCiAgICAgbUZkID0gZmQ7CiAgICAgbUluZGVudCA9IGluZGVudDsKICAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhyZWFkIHNhZmUKKyAgICAvLyBUT0RPOiBuZWVkIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgcGVyZm9ybWFuY2VBbmFseXNpcyBmb3IgZWFjaCB0aHJlYWQKKyAgICAvLyB1c2VkIHRvIHN0b3JlIGRhdGEgYW5kIHRvIGNhbGwgYW5hbHlzaXMgZnVuY3Rpb25zCisgICAgc3RhdGljIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHlzaXM7CiAgICAgc2l6ZV90IGxvc3QgPSBzbmFwc2hvdC5sb3N0KCkgKyAoc25hcHNob3QuYmVnaW4oKSAtIEVudHJ5SXRlcmF0b3Ioc25hcHNob3QuZGF0YSgpKSk7CiAgICAgaWYgKGxvc3QgPiAwKSB7CiAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKQEAgLTk3Myw4NSArODg4LDkgQEAKICAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIGNvcHlFbnRyeURhdGFBdCgpLgogICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KLSNpZiAwCi0gICAgc2l6ZV90IHdpZHRoID0gMTsKLSAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIG1heFNlYyAvPSAxMDsKLSAgICB9Ci0gICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslKnNdIiwgKGludCkgd2lkdGggKyA0LCAiIik7Ci0gICAgfQotICAgIGJvb2wgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSNlbmRpZgogCiAgICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7CiAgICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSNpZiAwCi0gICAgICAgIGNhc2UgRVZFTlRfU1RSSU5HOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBlbnRyeS5sZW5ndGgoKSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RJTUVTVEFNUDogewotICAgICAgICAgICAgLy8gYWxyZWFkeSBjaGVja2VkIHRoYXQgbGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpOwotICAgICAgICAgICAgZW50cnkuY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHMpOwotICAgICAgICAgICAgbG9uZyBwcmV2TnNlYyA9IHRzLnR2X25zZWM7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWluID0gTE9OR19NQVg7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWF4ID0gLTE7Ci0gICAgICAgICAgICBsb25nIGRlbHRhVG90YWwgPSAwOwotICAgICAgICAgICAgYXV0byBhdXgoZW50cnkpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICsrYXV4OwotICAgICAgICAgICAgICAgIGlmIChlbmQgLSBhdXggPj0gMCB8fCBhdXgudHlwZSgpICE9IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzTmV4dDsKLSAgICAgICAgICAgICAgICBhdXguY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHNOZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAodHNOZXh0LnR2X3NlYyAhPSB0cy50dl9zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSB0c05leHQudHZfbnNlYyAtIHByZXZOc2VjOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IGRlbHRhTWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWluID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IGRlbHRhTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWF4ID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbHRhVG90YWwgKz0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBuID0gKGF1eCAtIGVudHJ5KSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMgLypFbnRyeTo6a092ZXJoZWFkPyovKTsKLSAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGF1eDsKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9JTlRFR0VSOgotICAgICAgICAgICAgYXBwZW5kSW50KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfRkxPQVQ6Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdCgmYm9keSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1BJRDoKLSAgICAgICAgICAgIGFwcGVuZFBJRCgmYm9keSwgZW50cnkuZGF0YSgpLCBlbnRyeS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgogICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDYzLDQwICs5MDIsMTIgQEAKICAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKICAgICAgICAgICAgIGludDY0X3QgdHM7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGxvZ19oYXNoX3QsIGludD4ga2V5KGhhc2gsIGRhdGEtPmF1dGhvcik7Ci0gICAgICAgICAgICAvLyBUT0RPIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIGV4Y2Vzc2l2ZWx5IGhpZ2ggb3V0bGllcnMsIHdoaWNoIGFyZSB1c3VhbGx5IGNhdXNlZAotICAgICAgICAgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KLSAgICAgICAgICAgIG1IaXN0c1trZXldLnB1c2hfYmFjayh0cyk7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmxvZ1RzRW50cnkodHMpOwogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRyYXdzIGhpc3RvZ3JhbXMgc3RvcmVkIGluIGdsb2JhbCBSZWFkZXI6Om1IaXN0cyBhbmQgZXJhc2VzIHRoZW0KLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6IHsKLSAgICAgICAgICAgIEhpc3RvZ3JhbUVudHJ5IGhpc3RFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAvLyBMb2cgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgY2FsbCB0byBkcmF3SGlzdG9ncmFtLCBub3Qgd2hlbiBhdWRpbyB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaGlzdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotICAgICAgICAgICAgLy8gTG9nIGhpc3RvZ3JhbXMKLSAgICAgICAgICAgIHNldEZpbmRHbGl0Y2godHJ1ZSk7Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiSGlzdG9ncmFtIGZsdXNoIC0gIik7Ci0gICAgICAgICAgICBoYW5kbGVBdXRob3IoaGlzdEVudHJ5LCAmYm9keSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaGlzdCA9IG1IaXN0cy5iZWdpbigpOyBoaXN0ICE9IG1IaXN0cy5lbmQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoaGlzdC0+Zmlyc3Quc2Vjb25kID09IGhpc3RFbnRyeS5hdXRob3IoKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJVgiLCAoaW50KWhpc3QtPmZpcnN0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRHbGl0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWZHbGl0Y2goaGlzdC0+c2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlsZSB0byBlbXB0eSBhbmQgd3JpdGUgZGF0YSBmb3IgYWxsIGhpc3RvZ3JhbXMgaW4gdGhpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVIaXN0VG9GaWxlKGhpc3QtPnNlY29uZCwgaGlzdCAhPSBtSGlzdHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdIaXN0b2dyYW0oJmJvZHksIGhpc3QtPnNlY29uZCwgdHJ1ZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGlzdCA9IG1IaXN0cy5lcmFzZShoaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2hpc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTAsMTAgKzkyMSwxMCBAQAogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgfQorICAgIH0KKyAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5KTsKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogfQogCkBAIC0xMTM5LDE2ICs5NTAsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMDg0LDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9PV05FUlMgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmRkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KKy8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKK1BlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7CisgICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKKyAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCisgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKKyAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Cit9CisKKy8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50CitzdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgeworICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07CisgICAgfQorICAgIHJldHVybiBidWNrZXRzOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisvLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCisvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCkgeworICAgIC8vIDEpIGFuYWx5emUgdGhlIHNlcmllcyB0byBzdG9yZSBhbGwgb3V0bGllcnMgYW5kIHRoZWlyIGV4YWN0IHRpbWVzdGFtcHM6CisgICAgc3RvcmVPdXRsaWVyRGF0YShtVGltZVN0YW1wU2VyaWVzKTsKKworICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKKyAgICBkZXRlY3RQZWFrcygpOworCisgICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdG8gbVJlY2VudEhpc3RzIGFuZCBjbGVhciB0aGUgdGltZSBzZXJpZXMKKyAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHRpbWVzdGFtcD4obVRpbWVTdGFtcFNlcmllc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllcykpOworICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQorICAgIC8vIEFMT0dEKCJtUmVjZW50SGlzdHMgc2l6ZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA+PSBrUmVjZW50SGlzdHNDYXBhY2l0eSkgeworICAgICAgICAvLyAgQUxPR0QoInBvcHBlZCBiYWNrIG1SZWNlbnRIaXN0cyIpOworICAgICAgICBtUmVjZW50SGlzdHMucG9wX2Zyb250KCk7CisgICAgfQorICAgIG1UaW1lU3RhbXBTZXJpZXMuY2xlYXIoKTsKK30KKworLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgeworICAgIEFMT0dEKCJoYW5kbGVTdGF0ZUNoYW5nZSIpOworICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIHJldHVybjsKK30KKworLy8gVGFrZXMgYSBzaW5nbGUgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgZW50cnkgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyBpdCBpbiBhCisvLyB0ZW1wb3Jhcnkgc2VyaWVzIG9mIHRpbWVzdGFtcHMuIE9uY2UgdGhlIHNlcmllcyBpcyBmdWxsLCB0aGUgZGF0YSBpcyBhbmFseXplZCwKKy8vIHN0b3JlZCwgYW5kIGVtcHRpZWQuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmxvZ1RzRW50cnkoaW50NjRfdCB0cykgeworICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCisgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KKyAgICAvLyBTdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQorICAgIC8vIGlzIGVub3VnaCBkYXRhLiBUaGVuLCB3cml0ZSB0byByZWNlbnRIaXN0cyBhcyBhIGhpc3RvZ3JhbS4KKyAgICBtVGltZVN0YW1wU2VyaWVzLnB1c2hfYmFjayh0cyk7CisgICAgLy8gaWYgbGVuZ3RoIG9mIHRoZSB0aW1lIHNlcmllcyBoYXMgcmVhY2hlZCBrU2hvcnRIaXN0U2l6ZSBzYW1wbGVzLAorICAgIC8vIGFuYWx5emUgdGhlIGRhdGEgYW5kIGZsdXNoIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5CisgICAgaWYgKG1UaW1lU3RhbXBTZXJpZXMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIH0KK30KKworLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAorLy8gbWVyZ2UgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmUgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cworLy8gY2xlYXJzIG1SZWNlbnRIaXN0cworLy8gVE9ETzogaGF2ZSBsb2dUc0VudHJ5IHdyaXRlIGRpcmVjdGx5IHRvIG1Mb25nVGVybUhpc3RzLCBkaXNjYXJkIG1SZWNlbnRIaXN0cywKKy8vIHN0YXJ0IGEgbmV3IGhpc3RvZ3JhbSB3aGVuIGEgcGVhayBvY2N1cnMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKSB7CisKKyAgICAvLyBCdWNrZXRzIGlzIHVzZWQgdG8gYWdncmVnYXRlIHNob3J0LXRlcm0gaGlzdG9ncmFtcy4KKyAgICBIaXN0b2dyYW0gYnVja2V0czsKKyAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1SZWNlbnRIaXN0c1swXS5maXJzdDsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRpbWUgYmV0d2VlbiBzdGFydGluZyBhbmQgZW5kaW5nIHRpbWVzdGFtcHMgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0sCisgICAgICAgIC8vIGFkZCB0aGUgY3VycmVudCBoaXN0b2dyYW0gKGJ1Y2tldHMpIHRvIHRoZSBsb25nLXRlcm0gaGlzdG9ncmFtIGJ1ZmZlciwKKyAgICAgICAgLy8gY2xlYXIgYnVja2V0cywgYW5kIHN0YXJ0IGEgbmV3IGxvbmctdGVybSBoaXN0b2dyYW0gYWdncmVnYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGRlbHRhTXMoc3RhcnRpbmdUcywgc2hvcnRIaXN0LmZpcnN0KSA+PSBrTWF4SGlzdFRpbWVzcGFuTXMpIHsKKyAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLmVtcGxhY2VfYmFjayhzdGFydGluZ1RzLCBzdGQ6Om1vdmUoYnVja2V0cykpOworICAgICAgICAgICAgYnVja2V0cy5jbGVhcigpOworICAgICAgICAgICAgc3RhcnRpbmdUcyA9IHNob3J0SGlzdC5maXJzdDsKKyAgICAgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCisgICAgICAgICAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKG1Mb25nVGVybUhpc3RzLnNpemUoKSA+PSBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgY3VycmVudCBoaXN0b2dyYW0gdG8gYnVja2V0cworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIG1SZWNlbnRIaXN0cy5jbGVhcigpOworICAgIC8vIFRPRE86IGRlY2lkZSB3aGVuL3doZXJlIHRvIGNhbGwgd3JpdGVUb0ZpbGUKKyAgICAvLyBUT0RPOiBhZGQgYSB0aHJlYWQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlIG5hbWUKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY29uc3QgY2hhciAqKSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci9zYW1wbGVfcmVzdWx0cy50eHQiOworICAgIHdyaXRlVG9GaWxlKG1PdXRsaWVyRGF0YSwgbUxvbmdUZXJtSGlzdHMsIGtOYW1lLCBmYWxzZSk7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIG91dGxpZXIgaW50ZXJ2YWxzIChtT3V0bGllciBkYXRhKSwKKy8vIGxvb2tzIGZvciBjaGFuZ2VzIGluIGRpc3RyaWJ1dGlvbiAocGVha3MpLCB3aGljaCBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcworLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKKy8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKKy8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmRldGVjdFBlYWtzKCkgeworICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCisgICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKKyAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKyAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOworCisgICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7CisgICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAorICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCisgICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgeworICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKKyAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICB9CisgICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07CisgICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKKyAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgorICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKKyAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCisgICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgorICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKKyAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7CisgICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047CisgICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCisgICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKKyAgICAgICAgfQorICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtQZWFrU2VyaWVzU2l6ZSkgeworICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ID0gaXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBDYWxsZWQgYnkgTG9nVHNFbnRyeS4gVGhlIGlucHV0IGlzIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCisvLyBGaW5kcyBvdXRsaWVycyBhbmQgd3JpdGVzIHRvIG1PdXRsaWVyZGF0YS4KKy8vIEVhY2ggdmFsdWUgaW4gbU91dGxpZXJkYXRhIGNvbnNpc3RzIG9mOiA8b3V0bGllciB0aW1lc3RhbXAsIHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyPi4KKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgeworICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBmaXJzdCBwYXNzOiBuZWVkIHRvIGluaXRpYWxpemUKKyAgICBpZiAobUVsYXBzZWQgPT0gMCkgeworICAgICAgICBtUHJldk5zID0gdGltZXN0YW1wc1swXTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZ0czogdGltZXN0YW1wcykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBkaWZmTXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVsdGFNcyhtUHJldk5zLCB0cykpOworICAgICAgICBpZiAoZGlmZk1zID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhtRWxhcHNlZCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1QcmV2TnMpKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCisgICAgICAgICAgICAvLyBGSVhNRTogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKKyAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCisgICAgICAgICAgICBpZiAobU91dGxpZXJEYXRhLnNpemUoKSA+PSBrT3V0bGllclNlcmllc1NpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0bGllckRhdGEucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxhcHNlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUVsYXBzZWQgKz0gZGlmZk1zOworICAgICAgICBtUHJldk5zID0gdHM7CisgICAgfQorfQorCisKKy8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKKyAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQorICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07CisgICAgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShrVGVtcFRlc3REYXRhKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorICAgIGRldGVjdFBlYWtzKCk7Cit9CisKKy8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5IC0tPiBpcyB0aGlzIHN0aWxsIHJlbGV2YW50PworLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAorLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCkgeworICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpIDwgMSkgeworICAgICAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IG1SZWNlbnRIaXN0cyBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogaGlzdHMgc2l6ZSAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOworICAgIC8vIFRPRE86IG1vcmUgZWxhYm9yYXRlIGRhdGEgYW5hbHlzaXMKKyAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworCisgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisKK30KKworCisvLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAorLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCisvLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKKy8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCisvLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKKy8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAorLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCisvLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5CisgICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7CisgICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCisgICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKKyAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1MGFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBhIGZpbGUuCisvLyBUT0RPOiBmb3JtYXQgdGhlIGRhdGEgZWZmaWNpZW50bHkgYW5kIHdyaXRlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIHRvIGRpZmZlcmVudCBmaWxlcwordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpIHsKKyAgICBBTE9HRCgid3JpdGluZyBwZXJmb3JtYW5jZSBkYXRhIHRvIGZpbGUiKTsKKyAgICBpZiAob3V0bGllckRhdGEuZW1wdHkoKSB8fCBoaXN0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9mc3RyZWFtIG9mczsKKyAgICBvZnMub3BlbihrTmFtZSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFvZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBrTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb2ZzIDw8ICJPdXRsaWVyIGRhdGE6IGludGVydmFsIGFuZCB0aW1lc3RhbXBcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyIDogb3V0bGllckRhdGEpIHsKKyAgICAgICAgb2ZzIDw8IG91dGxpZXIuZmlyc3QgPDwgIjogIiA8PCBvdXRsaWVyLnNlY29uZCA8PCAiXG4iOworICAgIH0KKyAgICBvZnMgPDwgIkhpc3RvZ3JhbSBkYXRhXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmaGlzdCA6IGhpc3RzKSB7CisgICAgICAgIG9mcyA8PCAiXHR0aW1lc3RhbXBcbiI7CisgICAgICAgIG9mcyA8PCBoaXN0LmZpcnN0IDw8ICJcbiI7CisgICAgICAgIG9mcyA8PCAiXHRidWNrZXRzIGFuZCBjb3VudHNcbiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYnVja2V0IDogaGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIG9mcyA8PCBidWNrZXQuZmlyc3QgPDwgIjogIiA8PCBidWNrZXQuc2Vjb25kIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgb2ZzLmNsb3NlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggNDc0N2RjZi4uNzExODJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggNTA4ZTBmZS4uOGEzZmZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDU2YTJhMzguLjM0OGI0ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKaW5kZXggOTdhNTdlMC4uNTM1ZTNmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU2luayB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1dSSVRFIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCmluZGV4IDRmYmRiNGIuLmJjNmFhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU291cmNlIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fUkVBRCBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNzg1YjljMi4uM2U0OGVlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNDMsOCArNDQsNiBAQAogY2xhc3MgV3JpdGVyOwogY2xhc3MgUmVhZGVyOwogCi1wcml2YXRlOgotCiBlbnVtIEV2ZW50IDogdWludDhfdCB7CiAgICAgRVZFTlRfUkVTRVJWRUQsCiAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCkBAIC01OSwxMiArNTgsMTMgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAogICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKIAogICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKIH07CiAKK3ByaXZhdGU6CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwpAQCAtMjQ4LDYgKzI0OCw4IEBACiAgICAgaW50IGF1dGhvcjsKIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAordXNpbmcgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciA9IEhpc3RUc0VudHJ5V2l0aEF1dGhvcjsKKwogc3RydWN0IEhpc3RJbnRFbnRyeSB7CiAgICAgbG9nX2hhc2hfdCBoYXNoOwogICAgIGludCB2YWx1ZTsKQEAgLTM0MSw4ICszNDMsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwogCiAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwogCkBAIC00MDcsNiArNDA4LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKICAgICBjbGFzcyBTbmFwc2hvdCB7CiAgICAgcHVibGljOgogICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CkBAIC00NDMsMjAgKzQ0NSwxNyBAQAogCiAgICAgdmlydHVhbCB+UmVhZGVyKCk7CiAKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpOwotCiAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwogICAgIC8vIGR1bXAgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAvLyBUT0RPOiBtb3ZlIGR1bXAgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4gTW9kZWwvdmlldy9jb250cm9sbGVyIGRlc2lnbgogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBTbmFwc2hvdCAmIHNuYXApOwogICAgIC8vIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIChjYWxsIGdldFNuYXBzaG90KCkgYW5kIHByZXZpb3VzIGR1bXAoKSkKICAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOwogICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0gICAgLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKLSAgICB2b2lkICAgICBzZXRGaW5kR2xpdGNoKGJvb2wgcyk7Ci0gICAgYm9vbCAgICAgaXNGaW5kR2xpdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CkBAIC00NjksMTAgKzQ2OCw2IEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAotICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKLSAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KLSAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0ODAsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJOQkxvZy5oIgorI2luY2x1ZGUgIlJlcG9ydFBlcmZvcm1hbmNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7CisgICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZworICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIE5lZWQgdG8gYWRkIGEgbXV0ZXguCisgICAgLy8gRklYTUU6IGNvbnRpbnVlIHRoaXMgd2F5IHVudGlsIGFuYWx5c2lzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFRoZW4sIHVzZQorICAgIC8vIHRoZSBmaWZvIHdyaXRlciB1dGlsaXRpZXMuCitwdWJsaWM6CisKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCk7CisKKyAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKKyAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gYXVkaW8gb24vb2ZmIGV2ZW50IGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLAorICAgIC8vIGUuZy4gRVZFTlRfQVVESU9fU1RBVEUuCisgICAgLy8gY2FsbHMgZmx1c2hUaW1lU3RhbXBTZXJpZXMgb24gdGhlIGRhdGEgdXAgdG8gdGhlIGV2ZW50LAorICAgIC8vIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgdGhlIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKworICAgIC8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKKyAgICAvLyBtZXJnZXMgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmVzIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCk7CisKKyAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgdGhyZWFkIHNhZmUuIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gaW5zdGFuY2UKKyAgICAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzLgorICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXBfcmF3IHRzKTsKKworICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgorICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCisgICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKKyAgICB2b2lkIGRldGVjdFBlYWtzKCk7CisKKyAgICAvLyBydW5zIGFuYWx5c2lzIG9uIHRpbWVzdGFtcCBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCB0byBhIGhpc3RvZ3JhbQorICAgIC8vIGZpbmRzIG91dGxpZXJzCisgICAgLy8gd3JpdGVzIHRvIG1PdXRsaWVyRGF0YSA8dGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXIsIG91dGxpZXIgdGltZXN0YW1wPgorICAgIHZvaWQgc3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmdGltZXN0YW1wcyk7CisKKyAgICAvLyBpbnB1dDogc2VyaWVzIG9mIHNob3J0IGhpc3RvZ3JhbXMuIEdlbmVyYXRlcyBhIHN0cmluZyBvZiBhbmFseXNpcyBvZiB0aGUgYnVmZmVyIHBlcmlvZHMKKyAgICAvLyBUT0RPOiBXSVAgd3JpdGUgbW9yZSBkZXRhaWxlZCBhbmFseXNpcworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgorICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCA9IDEwKTsKKworICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzLiB0ZW1wIGZvciB0ZXN0aW5nCisgICAgdm9pZCB0ZXN0RnVuY3Rpb24oKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgZ2xpdGNoZXMgaW4gYSB0aW1lIHNlcmllcworICAgIC8vIFRPRE8gaW5jb3Jwb3JhdGUgdGhpcyBpbnRvIHRoZSBhbmFseXNpcyAoY3VycmVudGx5IHVudXNlZCkKKyAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnNhbXBsZXMpOworCitwcml2YXRlOgorCisgICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6IDxlbGFwc2VkIHRpbWUgYmV0d2VlbiBvdXRsaWVycyBpbiBtcywgb3V0bGllciB0aW1lc3RhbXA+CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7CisKKyAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAorICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQorICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CisKKyAgICAvLyBUT0RPOiB0dXJuIHRoZXNlIGludG8gY2lyY3VsYXIgYnVmZmVycyBmb3IgYmV0dGVyIGRhdGEgZmxvdworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1SZWNlbnRIaXN0czsKKworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIGxvbmctdGVybSBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtTG9uZ1Rlcm1IaXN0czsKKworICAgIC8vIHZlY3RvciBvZiB0aW1lc3RhbXBzLCBjb2xsZWN0ZWQgZnJvbSBOQkxvZyBmb3IgYSAoVE9ETykgc3BlY2lmaWMgdGhyZWFkCisgICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmx1c2hlZAorICAgIHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+IG1UaW1lU3RhbXBTZXJpZXM7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7CisKKyAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKKyAgICAvLyBUT0RPOiBsZWFybiBzb21lIG9mIHRoZXNlIGZyb20gdGhlIGRhdGEsIGRlbGV0ZSB1bnVzZWQgb25lcworICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBtYWtlIGtQZXJpb2RNcyBzdGF0aWMuCisgICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQorICAgIGludCBrUGVyaW9kTXM7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyTXMgPSA3OyAvLyB2YWx1ZXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIGNhdXNlIGdsaXRjaGVzCisgICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKKyAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCisgICAgaW50IGtQZXJpb2RNc0NQVTsgLy8gY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KKworICAgIC8vIFBlYWsgZGV0ZWN0aW9uOiBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIG1lYW4gY29uc2lkZXJlZCBhIHNpZ25pZmljYW50IGNoYW5nZQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0ZGRldlRocmVzaG9sZCA9IDU7CisKKyAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gVE9ETzogYWRqdXN0IGFsbCBvZiB0aGVzZSB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtSZWNlbnRIaXN0c0NhcGFjaXR5ID0gMTAwOyAvLyBudW1iZXIgb2Ygc2hvcnQtdGVybSBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTaG9ydEhpc3RTaXplID0gNTA7IC8vIG51bWJlciBvZiBzYW1wbGVzIGluIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gb3V0bGllciBhcnJheQorICAgIHN0YXRpYyBjb25zdCBpbnQga1BlYWtTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5CisgICAgc3RhdGljIGNvbnN0IGludCBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5ID0gMjA7IC8vIG51bWJlciBvZiBsb25nLXRlcm0gaGlzdG9ncmFtIHN0b3JlZCBpbiBtZW1vcnkKKyAgICAvLyBtYXhpbXVtIGVsYXBzZWQgdGltZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpbWVzdGFtcCBvZiBhIGxvbmctdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0VGltZXNwYW5NcyA9IDUgKiBrTXNQZXJTZWM7CisKKyAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KKyAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAorICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOworICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKKyAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKKyAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7CisgICAgaW50NjRfdCBtUHJldk5zID0gLTE7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA1OGI5NzUwLi4wNDMxOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX1BJUEVfSAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyODEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCisvLyBUT0RPIG1vdmUgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24gdG8gUmVwb3J0UGVyZm9ybWFuY2UuY3BwCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCisvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZC4gdmFsdWU6IGNvdW50CisvLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKK3VzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwordXNpbmcgb3V0bGllckludGVydmFsID0gdWludDY0X3Q7CisvLyBpbnQ2NF90IHRpbWVzdGFtcHMgYXJlIGNvbnZlcnRlZCB0byB1aW50NjRfdCBpbiBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhLAorLy8gYW5kIGFsbCBhbmFseXNpcyBmdW5jdGlvbnMgdXNlIHVpbnQ2NF90LgordXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7Cit1c2luZyB0aW1lc3RhbXBfcmF3ID0gaW50NjRfdDsKKworLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCisvLyBUT0RPOiB0aGUgY29kZSBoYXMgYSBtaXggb2YgdHlwZWRlZiBhbmQgdXNpbmcuIFN0YW5kYXJkaXplIHRvIG9uZSBvciB0aGUgb3RoZXIuCit0eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lCisvLyBpbnRlcnZhbHMgdG8gYSBmaWxlLgordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpOworCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGFlNDk5MDMuLmNjMmQwMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAjZGVmaW5lIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggNjBhZTkyZS4uYzUxZDBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlUmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkFJTy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggMDFmMDliZS4uYTJlYjlhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC00OSwyMSArNDksMTggQEAKIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCi0jaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIgogI2luY2x1ZGUgImluY2x1ZGUvRGF0YUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJvbXgvT01YVXRpbHMuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg2NiwxNiArMTg2MywxNSBAQAogICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CiAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3dPblNodXRkb3duOwogICAgICAgICB9CisgICAgfQorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7CisgICAgICAgIC8vIHVzZSBuYXRpdmVfaGFuZGxlcyBmb3Igc2VjdXJlIGlucHV0IGJ1ZmZlcnMKKyAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBJT01YOjprUG9ydE1vZGVQcmVzZXRTZWN1cmVCdWZmZXIpOwogCi0gICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbmF0aXZlX2hhbmRsZXMgZm9yIHNlY3VyZSBpbnB1dCBidWZmZXJzCi0gICAgICAgICAgICBlcnIgPSBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldFNlY3VyZUJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZmFsbGluZyBiYWNrIHRvIG5vbi1uYXRpdmVfaGFuZGxlcyIpOwotICAgICAgICAgICAgICAgIHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJmYWxsaW5nIGJhY2sgdG8gbm9uLW5hdGl2ZV9oYW5kbGVzIik7CisgICAgICAgICAgICBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpOworICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKQEAgLTQxNzQsMTEgKzQxNzAsMTIgQEAKIC8vIHN0YXRpYwogaW50IC8qIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKi8gQUNvZGVjOjpnZXRBVkNMZXZlbEZvcigKICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCi0gICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlKSB7CisgICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFRVhUVFlQRSBwcm9maWxlKSB7CiAgICAgLy8gY29udmVydCBiaXRyYXRlIHRvIG1haW4vYmFzZWxpbmUgcHJvZmlsZSBrYnBzIGVxdWl2YWxlbnQKLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKCh1aW50MzJfdClwcm9maWxlKSB7CiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTA6CiAgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMzAwMCk7IGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOgogICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKICAgICAgICAgICAgIGJpdHJhdGUgPSBkaXZVcChiaXRyYXRlLCAxMjUwKTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MzIyLDkgKzQzMTksMTQgQEAKICAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAyOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcworICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOworCiAgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgaDI2NHR5cGUubkJGcmFtZXMpOwogICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9Ci0gICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCB8IE9NWF9WSURFT19QaWN0dXJlVHlwZUI7CisgICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDExQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9UUlVFOwpAQCAtNDg0Myw5ICs0ODQ1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoID4gdmlkZW9EZWYtPm5GcmFtZVdpZHRoIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0ID4gdmlkZW9EZWYtPm5GcmFtZUhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjcm9wcGVkIHJlY3QgKCVkLCAlZCkgLSAoJXUsICV1KSB2cy4gZnJhbWUgKCV1LCAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjcm9wcGVkIHJlY3QgKCVkLCAlZCwgJXUsICV1KSB2cy4gZnJhbWUgKCV1LCAldSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLCByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCwgcmVjdC5uSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPm5GcmFtZVdpZHRoLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjM0MCwxOSArNjM0MiwxMCBAQAogCiAgICAgQ0hFQ0sobUNvZGVjLT5tT01YTm9kZSA9PSBOVUxMKTsKIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgYm9vbCB0cmVibGVGbGFnOwotICAgIGlmIChjbGllbnQuY29ubmVjdCgmdHJlYmxlRmxhZykgIT0gT0spIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1Db2RlYy0+c2V0VHJlYmxlRmxhZyh0cmVibGVGbGFnKTsKLQotICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOwogCiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgIFZlY3RvcjxBU3RyaW5nPiBvd25lcnM7CiAKICAgICBBU3RyaW5nIG1pbWU7CiAKQEAgLTYzNjAsOSArNjM1MywzMSBAQAogICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChsaXN0ICE9IE5VTEwgJiYgbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUuY19zdHIoKSkgPj0gMCkgewotICAgICAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGNvbXBvbmVudE5hbWUpOworICAgICAgICBpZiAobGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9idGFpbiBNZWRpYUNvZGVjTGlzdCB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGNyZWF0ZSBjb2RlYyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBsaXN0LT5maW5kQ29kZWNCeU5hbWUoY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvckludmFsaWRDb21wb25lbnQsIE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7CisgICAgICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGVycm9yIChpbmRleCBvdXQtb2YtYm91bmQpIHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgInJldHJpZXZpbmcgaW5mb3JtYXRpb24gZm9yIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgb3duZXJzLmFkZChpbmZvLT5nZXRPd25lck5hbWUoKSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICAgICAiZGVmYXVsdCIgOiBpbmZvLT5nZXRPd25lck5hbWUoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIApAQCAtNjM3NCwxMCArNjM4OSwxMiBAQAogICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBlbmNvZGVyLCAvLyBjcmVhdGVFbmNvZGVyCiAgICAgICAgICAgICAgICAgMCwgICAgICAgLy8gZmxhZ3MKLSAgICAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOworICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcywKKyAgICAgICAgICAgICAgICAmb3duZXJzKTsKICAgICB9CiAKICAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIAogICAgIHN0YXR1c190IGVyciA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtNjM4NSw2ICs2NDAyLDE0IEBACiAgICAgICAgICAgICArK21hdGNoSW5kZXgpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW21hdGNoSW5kZXhdOwogCisgICAgICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgICAgIGJvb2wgdHJlYmxlRmxhZzsKKyAgICAgICAgaWYgKGNsaWVudC5jb25uZWN0KG93bmVyc1ttYXRjaEluZGV4XS5jX3N0cigpLCAmdHJlYmxlRmxhZykgIT0gT0spIHsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7CisKICAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKQEAgLTYzOTIsNiArNjQxNyw3IEBACiAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvZGVjLT5zZXRUcmVibGVGbGFnKHRyZWJsZUZsYWcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtODIxNSwxNiArODI0MSwxNSBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMpIHsKLSAgICAoKmNhcHMpLmNsZWFyKCk7Ci0gICAgY29uc3QgY2hhciAqcm9sZSA9IEdldENvbXBvbmVudFJvbGUoaXNFbmNvZGVyLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBjb25zdCBjaGFyKiBvd25lciwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKKyAgICBjb25zdCBjaGFyICpyb2xlID0gR2V0Q29tcG9uZW50Um9sZShpc0VuY29kZXIsIG1pbWUpOwogICAgIGlmIChyb2xlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7CisgICAgc3RhdHVzX3QgZXJyID0gY2xpZW50LmNvbm5lY3Qob3duZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC04MjMzLDcgKzgyNTgsNyBAQAogICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKLSAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmb214Tm9kZSk7CisgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZvbXhOb2RlKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC04MjQ2LDggKzgyNzEsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyPiBidWlsZGVyID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyKCk7Ci0gICAgYm9vbCBpc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7CisgICAgYm9vbCBpc1ZpZGVvID0gc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpID09IDA7CiAKICAgICBpZiAoaXNWaWRlbykgewogICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbTsKQEAgLTgyNjIsMTEgKzgyODYsMjIgQEAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKworICAgICAgICAgICAgLy8gQVZDIGNvbXBvbmVudHMgbWF5IG5vdCBsaXN0IHRoZSBjb25zdHJhaW5lZCBwcm9maWxlcyBleHBsaWNpdGx5LCBidXQKKyAgICAgICAgICAgIC8vIGRlY29kZXJzIHRoYXQgc3VwcG9ydCBhIHByb2ZpbGUgYWxzbyBzdXBwb3J0IGl0cyBjb25zdHJhaW5lZCB2ZXJzaW9uLgorICAgICAgICAgICAgLy8gRW5jb2RlcnMgbXVzdCBleHBsaWNpdGx5IHN1cHBvcnQgY29uc3RyYWluZWQgcHJvZmlsZXMuCisgICAgICAgICAgICBpZiAoIWlzRW5jb2RlciAmJiBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIHByb2ZpbGVzIGFmdGVyICV1OiAleC8leCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODI3Nyw3ICs4MzEyLDYgQEAKICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOwogICAgICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICBWZWN0b3I8dWludDMyX3Q+IHN1cHBvcnRlZENvbG9yczsgLy8gc2hhZG93IGNvcHkgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKICAgICAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsgaW5kZXggPD0ga01heEluZGljZXNUb0NoZWNrOyArK2luZGV4KSB7CiAgICAgICAgICAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKApAQCAtODI5MSwyOCArODMyNSwxNyBAQAogICAgICAgICAgICAgaWYgKElzRmxleGlibGVDb2xvckZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgb214Tm9kZSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQsIGZhbHNlIC8qIHVzaW5nTmF0aXZlV2luZG93ICovLAogICAgICAgICAgICAgICAgICAgICAmZmxleGlibGVFcXVpdmFsZW50KSkgewotICAgICAgICAgICAgICAgIGJvb2wgbWFya2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRDb2xvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZENvbG9yc1tpXSA9PSBmbGV4aWJsZUVxdWl2YWxlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1hcmtlZCkgewotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvcnMucHVzaChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JzLnB1c2gocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgYnVpbGRlci0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogCiAgICAgICAgICAgICBpZiAoaW5kZXggPT0ga01heEluZGljZXNUb0NoZWNrKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RvcHBpbmcgY2hlY2tpbmcgZm9ybWF0cyBhZnRlciAldTogJXMoJXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtaW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpID09IDApIHsKICAgICAgICAgLy8gTW9yZSBhdWRpbyBjb2RlY3MgaWYgdGhleSBoYXZlIHByb2ZpbGVzLgogICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9QUk9GSUxFVFlQRSBwYXJhbTsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW0pOwpAQCAtODMyNiwxMSArODM0OSwxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRm9yIGF1ZGlvLCBsZXZlbCBpcyBpZ25vcmVkLgotICAgICAgICAgICAgYnVpbGRlci0+YWRkUHJvZmlsZUxldmVsKHBhcmFtLmVQcm9maWxlLCAwIC8qIGxldmVsICovKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgMCAvKiBsZXZlbCAqLyk7CiAKICAgICAgICAgICAgIGlmIChpbmRleCA9PSBrTWF4SW5kaWNlc1RvQ2hlY2spIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdG9wcGluZyBjaGVja2luZyBwcm9maWxlcyBhZnRlciAldTogJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZVByb2ZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MzM4LDcgKzgzNjEsNyBAQAogICAgICAgICAvLyBOT1RFOiBXaXRob3V0IEFuZHJvaWQgZXh0ZW5zaW9ucywgT01YIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVlcnkKICAgICAgICAgLy8gQUFDIHByb2ZpbGUgc3VwcG9ydAogICAgICAgICBpZiAocGFyYW0ublByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzQ3LDE0ICs4MzcwLDE0IEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIDAsICZzaWRlYmFuZEhhbmRsZSkgPT0gT0spIHsKICAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGluY2x1ZGVzIGFkYXB0aXZlIHBsYXliYWNrCi0gICAgICAgICAgICBidWlsZGVyLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjaworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKICAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7CiAgICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKICAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgYnVpbGRlci0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzY2LDExICs4Mzg5LDEwIEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqY2FwcyA9IGJ1aWxkZXI7CiAgICAgb214Tm9kZS0+ZnJlZU5vZGUoKTsKICAgICBjbGllbnQuZGlzY29ubmVjdCgpOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggMGQ5Njk2Zi4uM2M3YWUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG51bWVyaWM+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCw4ICszNCwxMSBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiB1c2luZyBCdWZmZXJJbmZvID0gQUNvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVySW5mbzsKIHVzaW5nIEJ1ZmZlckluZm9JdGVyYXRvciA9IHN0ZDo6dmVjdG9yPGNvbnN0IEJ1ZmZlckluZm8+Ojpjb25zdF9pdGVyYXRvcjsKIApAQCAtMTE0LDc0ICsxMTcsOTcgQEAKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQogCi0gICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgbmF0aXZlX2hhbmRsZV90ICpzZWN1cmVIYW5kbGUgPSBOVUxMOwogICAgIGlmIChzZWN1cmUpIHsKICAgICAgICAgc3A8U2VjdXJlQnVmZmVyPiBzZWN1cmVEYXRhID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN1cmVCdWZmZXIgKj4oaXQtPm1Db2RlY0J1ZmZlci5nZXQoKSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCk7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CisgICAgICAgIGlmIChzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblR5cGUoKSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OwotICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgc2VjdXJlSGFuZGxlID0gc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uUG9pbnRlcigpKTsKICAgICB9Ci0KLSAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOwotICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgc291cmNlLm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Ci0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPSBzZWN1cmVIYW5kbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7CisgICAgICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOworCiAgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoa2V5LCBpdiwgbW9kZSwgcGF0dGVybiwKICAgICAgICAgICAgICAgICBzb3VyY2UsIGl0LT5tQ2xpZW50QnVmZmVyLT5vZmZzZXQoKSwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5kc3RUeXBlID0gZGVzdGluYXRpb24ubVR5cGUgPT0KLSAgICAgICAgICAgICAgICBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5ID8KLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNjcmFtYmxpbmdDb250cm9sID0ga2V5ICE9IE5VTEwgPwotICAgICAgICAgICAgICAgIChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdIDoKLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlclBsdWdpbjo6a1NjcmFtYmxpbmdfVW5zY3JhbWJsZWQ7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLm51bVN1YlNhbXBsZXMgPSBudW1TdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zdWJTYW1wbGVzID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKilzdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zcmNNZW0gPSBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0UHRyID0gTlVMTDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICBpbnQzMl90IGRlc2NyYW1ibGVSZXN1bHQgPSAtMTsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZShkZXNjcmFtYmxlSW5mbywgJmRlc2NyYW1ibGVSZXN1bHQpOwotCi0gICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBkZXNjcmFtYmxlUmVzdWx0OwotICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgZXhjZXB0aW9uQ29kZT0lZCwgZXJyPSVkLCByZXN1bHQ9JXpkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSwgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgcmVzdWx0PSV6ZCIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJlc3VsdCA+IDAgJiYgZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXIgPSB7CisgICAgICAgICAgICAgICAgLmhlYXBCYXNlID0gbUhpZGxNZW1vcnksCisgICAgICAgICAgICAgICAgLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0LAorICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZQorICAgICAgICB9OworCisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICAgICAgICAgICAgZHN0QnVmZmVyLnNlY3VyZU1lbW9yeSA9IGhpZGxfaGFuZGxlKHNlY3VyZUhhbmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCwgcmVzdWx0PSV6ZCIsCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgcmVzdWx0KTsKKworICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgICAgICAgbWVtY3B5KGl0LT5tQ29kZWNCdWZmZXItPmJhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5wb2ludGVyKCksIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7Ci0gICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKLSAgICB9Ci0KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCkBAIC0yNzUsMTAgKzMwMSwyMSBAQAogICAgICAgICBpbnQzMl90IHNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAoZGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOwogICAgICAgICBpZiAoc2VxTnVtID49IDApIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gc2VxTnVtOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CisgICAgICAgICAgICBBTE9HVigic2V0SGVhcCByZXR1cm5lZCBtSGVhcFNlcU51bT0lZCIsIG1IZWFwU2VxTnVtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7Ci0gICAgICAgICAgICBBTE9HRCgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRIZWFwIGZhaWxlZCwgc2V0dGluZyBtSGVhcFNlcU51bT0tMSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgICAgICBpZiAobmF0aXZlSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOworICAgICAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgICAgICAgICBtSGlkbE1lbW9yeSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLCBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZWQgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBoaWRsX21lbW9yeSBmb3IgZGVzY3JhbWJsZXIiKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGVhbGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggNmNjMWFjZS4uYzhkNGU0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKKyAgICAgICAgIkNvZGVjQmFzZS5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLApAQCAtMjksNiArMzAsNyBAQAogICAgICAgICAiRnJhbWVSZW5kZXJUcmFja2VyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgICAgICJJdGVtVGFibGUuY3BwIiwKICAgICAgICAgIkpQRUdTb3VyY2UuY3BwIiwKICAgICAgICAgIk1QM0V4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTVBFRzJUU1dyaXRlci5jcHAiLApAQCAtNDksNiArNTEsNyBAQAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKKyAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJPZ2dFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCiAgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLApAQCAtNjcsMTEgKzcwLDYgQEAKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKQEAgLTk2LDE2ICs5NCwyMCBAQAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKIAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xMTQsNyArMTE2LDYgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FhY2VuYyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogICAgICAgICAibGlidnB4IiwKQEAgLTEyNCw5ICsxMjUsMTIgQEAKICAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCiAKLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYm1lZGlhIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgIF0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICIuIiwKICAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKQEAgLTE3Myw0ICsxNzcsNSBAQAogICAgICJ0aW1lZHRleHQiLAogICAgICJ3ZWJtIiwKICAgICAid2lmaS1kaXNwbGF5IiwKKyAgICAieG1scGFyc2VyIiwKIF0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCmluZGV4IDQzMDkzNzIuLjZkZmUyZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApAQCAtMTI3LDEwICsxMjcsNiBAQAogfQogCiBzc2l6ZV90IFRpbnlDYWNoZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID49IGtDYWNoZVNpemUpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgIC8vIENoZWNrIGlmIHRoZSBjYWNoZSBzYXRpc2ZpZXMgdGhlIHJlYWQuCiAgICAgaWYgKG1DYWNoZWRPZmZzZXQgPD0gb2Zmc2V0CiAgICAgICAgICAgICAmJiBvZmZzZXQgPCAob2ZmNjRfdCkgKG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkpIHsKQEAgLTE1NCw2ICsxNTAsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHNpemUgPj0ga0NhY2hlU2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQogCiAgICAgLy8gRmlsbCB0aGUgY2FjaGUgYW5kIGNvcHkgdG8gdGhlIGNhbGxlci4KICAgICBjb25zdCBzc2l6ZV90IG51bVJlYWQgPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtQ2FjaGUsIGtDYWNoZVNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2MTBiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlY0Jhc2UiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEJ1ZmZlckNoYW5uZWxCYXNlOjpzZXRDcnlwdG8oY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bykgeworICAgIG1DcnlwdG8gPSBjcnlwdG87Cit9CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldERlc2NyYW1ibGVyKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSB7CisgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggYTU3NjBkMS4uYzIyMDUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTkyLDYgKzkyLDQ4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICB1aW50OF90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgfQorICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2U6OmdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICByZXR1cm4gZ2V0VUludDY0KG9mZnNldCwgeCk7CisgICAgfQorICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBzdGF0dXNfdCBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKICAgICAqc2l6ZSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCmluZGV4IDkxNzg3MGYuLjFhYTNiYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcApAQCAtODgsNyArODgsOSBAQAogCiBzdGF0dXNfdCBGcmFtZVJlbmRlclRyYWNrZXI6Om9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pIHsKICAgICAvLyBlbnN1cmUgbW9ub3RvbmljIHRpbWVzdGFtcHMKLSAgICBpZiAobUxhc3RSZW5kZXJUaW1lTnMgPj0gc3lzdGVtTmFubykgeworICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+IHN5c3RlbU5hbm8gfHwKKyAgICAgICAgLy8gRU9TIGlzIG5vcm1hbGx5IG1hcmtlZCBvbiB0aGUgbGFzdCBmcmFtZQorICAgICAgICAobUxhc3RSZW5kZXJUaW1lTnMgPT0gc3lzdGVtTmFubyAmJiBtZWRpYVRpbWVVcyAhPSBJTlQ2NF9NQVgpKSB7CiAgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIG91dCBvZiBvcmRlci9zdGFsZSBzeXN0ZW0gbmFubyAlbGxkIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSXRlbVRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTg5ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSXRlbVRhYmxlLmNwcApAQCAtMCwwICsxLDE1NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKKworI2luY2x1ZGUgPGluY2x1ZGUvSXRlbVRhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBoZWlmIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIHN0cnVjdCB0byBrZWVwIHRyYWNrIG9mIG9uZSBpbWFnZSBpdGVtCisvLworCitzdHJ1Y3QgSW1hZ2VJdGVtIHsKKyAgICBmcmllbmQgc3RydWN0IEl0ZW1SZWZlcmVuY2U7CisgICAgZnJpZW5kIHN0cnVjdCBJdGVtUHJvcGVydHk7CisKKyAgICBJbWFnZUl0ZW0oKSA6IEltYWdlSXRlbSgwKSB7fQorICAgIEltYWdlSXRlbSh1aW50MzJfdCBfdHlwZSkgOiB0eXBlKF90eXBlKSwKKyAgICAgICAgICAgIHJvd3MoMCksIGNvbHVtbnMoMCksIHdpZHRoKDApLCBoZWlnaHQoMCksIHJvdGF0aW9uKDApLAorICAgICAgICAgICAgb2Zmc2V0KDApLCBzaXplKDApLCBuZXh0VGlsZUluZGV4KDApIHt9CisKKyAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJyk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TmV4dFRpbGVJdGVtSWQodWludDMyX3QgKm5leHRUaWxlSXRlbUlkLCBib29sIHJlc2V0KSB7CisgICAgICAgIGlmIChyZXNldCkgeworICAgICAgICAgICAgbmV4dFRpbGVJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5leHRUaWxlSW5kZXggPj0gZGltZ1JlZnMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICAqbmV4dFRpbGVJdGVtSWQgPSBkaW1nUmVmc1tuZXh0VGlsZUluZGV4KytdOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpbnQzMl90IHJvd3M7CisgICAgaW50MzJfdCBjb2x1bW5zOworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCByb3RhdGlvbjsKKyAgICBvZmY2NF90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBodmNjOworICAgIHNwPEFCdWZmZXI+IGljYzsKKworICAgIFZlY3Rvcjx1aW50MzJfdD4gdGh1bWJuYWlsczsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGRpbWdSZWZzOworICAgIHNpemVfdCBuZXh0VGlsZUluZGV4OworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSVNPIGJveGVzCisvLworCitzdHJ1Y3QgQm94IHsKK3Byb3RlY3RlZDoKKyAgICBCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9CisKKyAgICB2aXJ0dWFsIH5Cb3goKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNodW5rRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IC8qdHlwZSovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorCisgICAgaW5saW5lIHNwPERhdGFTb3VyY2U+IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CisKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHVpbnQzMl90IG1UeXBlOworfTsKKworc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgeworICAgIGlmICgqb2Zmc2V0IDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGJlIHRvcCBsZXZlbAorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplIDAgZm9yIG5vbi10b3AgbGV2ZWwgYm94Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7CisKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG9uQ2h1bmtEYXRhKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7CisgICAgd2hpbGUgKG9mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggeworcHJvdGVjdGVkOgorICAgIEZ1bGxCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CisKKyAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KKworICAgIGlubGluZSB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgc3RhdHVzX3QgcGFyc2VGdWxsQm94SGVhZGVyKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKKworcHJpdmF0ZToKKyAgICB1aW50OF90IG1WZXJzaW9uOworICAgIHVpbnQzMl90IG1GbGFnczsKK307CisKK3N0YXR1c190IEZ1bGxCb3g6OnBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICgqc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KCpvZmZzZXQsICZtVmVyc2lvbiwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MjQoKm9mZnNldCArIDEsICZtRmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgKm9mZnNldCArPSA0OworICAgICpzaXplIC09IDQ7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgUHJpbWFyeUltYWdlIGJveAorLy8KKworc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgUGl0bUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7Cit9OworCitzdGF0dXNfdCBQaXRtQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDApID8gMiA6IDQ7CisgICAgaWYgKHNpemUgPCBpdGVtSWRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGl0ZW1JZDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByaW1hcnkgaWQgJWQiLCBpdGVtSWQpOworICAgICpwcmltYXJ5SXRlbUlkID0gaXRlbUlkOworCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSXRlbUxvY2F0aW9uIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBFeHRlbnRFbnRyeSB7CisgICAgdWludDY0X3QgZXh0ZW50SW5kZXg7CisgICAgdWludDY0X3QgZXh0ZW50T2Zmc2V0OworICAgIHVpbnQ2NF90IGV4dGVudExlbmd0aDsKK307CisKK3N0cnVjdCBJdGVtTG9jIHsKKyAgICBJdGVtTG9jKCkgOiBJdGVtTG9jKDAsIDAsIDAsIDApIHt9CisgICAgSXRlbUxvYyh1aW50MzJfdCBpdGVtX2lkLCB1aW50MTZfdCBjb25zdHJ1Y3Rpb25fbWV0aG9kLAorICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXgsIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0KSA6CisgICAgICAgIGl0ZW1JZChpdGVtX2lkKSwKKyAgICAgICAgY29uc3RydWN0aW9uTWV0aG9kKGNvbnN0cnVjdGlvbl9tZXRob2QpLAorICAgICAgICBkYXRhUmVmZXJlbmNlSW5kZXgoZGF0YV9yZWZlcmVuY2VfaW5kZXgpLAorICAgICAgICBiYXNlT2Zmc2V0KGJhc2Vfb2Zmc2V0KSB7fQorCisgICAgdm9pZCBhZGRFeHRlbnQoY29uc3QgRXh0ZW50RW50cnkmIGV4dGVudCkgeworICAgICAgICBleHRlbnRzLnB1c2hfYmFjayhleHRlbnQpOworICAgIH0KKworICAgIHN0YXR1c190IGdldExvYyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwKKyAgICAgICAgICAgIG9mZjY0X3QgaWRhdE9mZnNldCwgc2l6ZV90IGlkYXRTaXplKSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGZpeCBleHRlbnQgaGFuZGxpbmcsIGZpeCBjb25zdHJ1Y3Rpb25NZXRob2QgPSAyCisgICAgICAgIENIRUNLKGV4dGVudHMuc2l6ZSgpID09IDEpOworICAgICAgICBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDApIHsKKyAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQ7CisgICAgICAgICAgICAqc2l6ZSA9IGV4dGVudHNbMF0uZXh0ZW50TGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdGlvbk1ldGhvZCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgPiBpZGF0U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ID0gYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgaWRhdE9mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIHBhcnNlZCBpbmZvCisgICAgdWludDMyX3QgaXRlbUlkOworICAgIHVpbnQxNl90IGNvbnN0cnVjdGlvbk1ldGhvZDsKKyAgICB1aW50MTZfdCBkYXRhUmVmZXJlbmNlSW5kZXg7CisgICAgb2ZmNjRfdCBiYXNlT2Zmc2V0OworICAgIFZlY3RvcjxFeHRlbnRFbnRyeT4gZXh0ZW50czsKK307CisKK3N0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElsb2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCisgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzQ29uc3RydWN0TWV0aG9kMSgpIHsgcmV0dXJuIG1IYXNDb25zdHJ1Y3RNZXRob2QxOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgaXNTaXplRmllbGRWYWxpZCh1aW50MzJfdCBvZmZzZXRfc2l6ZSkgeworICAgICAgICByZXR1cm4gb2Zmc2V0X3NpemUgPT0gMCB8fCBvZmZzZXRfc2l6ZSA9PSA0IHx8IG9mZnNldF9zaXplID09IDg7CisgICAgfQorICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqbUl0ZW1Mb2NzOworICAgIGJvb2wgbUhhc0NvbnN0cnVjdE1ldGhvZDE7Cit9OworCitzdGF0dXNfdCBJbG9jQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHZlcnNpb24oKSA+IDIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmb2Zmc2V0X3NpemUsIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDhfdCBsZW5ndGhfc2l6ZSA9IChvZmZzZXRfc2l6ZSAmIDB4Rik7CisgICAgb2Zmc2V0X3NpemUgPj49IDQ7CisKKyAgICB1aW50OF90IGJhc2Vfb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmYmFzZV9vZmZzZXRfc2l6ZSwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50OF90IGluZGV4X3NpemUgPSAwOworICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICBpbmRleF9zaXplID0gKGJhc2Vfb2Zmc2V0X3NpemUgJiAweEYpOworICAgIH0KKyAgICBiYXNlX29mZnNldF9zaXplID4+PSA0OworICAgIHNpemUgLT0gMjsKKworICAgIGlmICghaXNTaXplRmllbGRWYWxpZChvZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGxlbmd0aF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoYmFzZV9vZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKChpbmRleF9zaXplKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBvZmZzZXQgc2l6ZSBub3QgdmFsaWQ6ICVkLCAlZCwgJWQsICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG9mZnNldF9zaXplLCBsZW5ndGhfc2l6ZSwgYmFzZV9vZmZzZXRfc2l6ZSwgaW5kZXhfc2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgaXRlbV9jb3VudDsKKyAgICBzaXplX3QgaXRlbUZpZWxkU2l6ZSA9IHZlcnNpb24oKSA8IDIgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1GaWVsZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1fY291bnQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigiaXRlbV9jb3VudCAlbGxkIiwgKGxvbmcgbG9uZykgaXRlbV9jb3VudCk7CisgICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7CisgICAgc2l6ZSAtPSBpdGVtRmllbGRTaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1bJXp1XTogaWQgJWxsZCIsIGksIChsb25nIGxvbmcpaXRlbV9pZCk7CisgICAgICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOworCisgICAgICAgIHVpbnQ4X3QgY29uc3RydWN0aW9uX21ldGhvZCA9IDA7CisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICAgICAgdWludDhfdCBidWZbMl07CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBidWYsIDIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RydWN0aW9uX21ldGhvZCA9IChidWZbMV0gJiAweEYpOworICAgICAgICAgICAgQUxPR1YoImNvbnN0cnVjdGlvbl9tZXRob2QgJWQiLCBjb25zdHJ1Y3Rpb25fbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25fbWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgICAgICBtSGFzQ29uc3RydWN0TWV0aG9kMSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXg7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZkYXRhX3JlZmVyZW5jZV9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGF0YV9yZWZlcmVuY2VfaW5kZXggJWQiLCBkYXRhX3JlZmVyZW5jZV9pbmRleCk7CisgICAgICAgIGlmIChkYXRhX3JlZmVyZW5jZV9pbmRleCAhPSAwKSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHJlZmVyZW5jZSB0byBvdGhlciBmaWxlcworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0X3NpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmJhc2Vfb2Zmc2V0LCBiYXNlX29mZnNldF9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBiYXNlX29mZnNldF9zaXplOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJiYXNlX29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZykgYmFzZV9vZmZzZXQpOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUxvY3MtPmFkZChpdGVtX2lkLCBJdGVtTG9jKAorICAgICAgICAgICAgICAgIGl0ZW1faWQsIGNvbnN0cnVjdGlvbl9tZXRob2QsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBiYXNlX29mZnNldCkpOworICAgICAgICBJdGVtTG9jICZpdGVtID0gbUl0ZW1Mb2NzLT5lZGl0VmFsdWVBdChpbmRleCk7CisKKyAgICAgICAgdWludDE2X3QgZXh0ZW50X2NvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZXh0ZW50X2NvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJleHRlbnRfY291bnQgJWQiLCBleHRlbnRfY291bnQpOworCisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxICYmIChvZmZzZXRfc2l6ZSA9PSAwIHx8IGxlbmd0aF9zaXplID09IDApKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBkaXZpZGVjIGludG8gbW9yZSB0aGFuIG9uZSBleHRlbnRzLCBvZmZzZXQgYW5kCisgICAgICAgICAgICAvLyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGV4dGVudF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfaW5kZXggPSAxOyAvLyBkZWZhdWx0PTEKKyAgICAgICAgICAgIGlmICgodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpICYmIChpbmRleF9zaXplID4gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2luZGV4LCBpbmRleF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGlzIG1vZGUKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW5kZXhfc2l6ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXh0ZW50X2luZGV4ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9vZmZzZXQgPSAwOyAvLyBkZWZhdWx0PTAKKyAgICAgICAgICAgIGlmIChvZmZzZXRfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X29mZnNldCwgb2Zmc2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImV4dGVudF9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X29mZnNldCk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9sZW5ndGggPSAwOyAvLyB0aGlzIGluZGljYXRlcyBmdWxsIGxlbmd0aCBvZiBmaWxlCisgICAgICAgICAgICBpZiAobGVuZ3RoX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9sZW5ndGgsIGxlbmd0aF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfbGVuZ3RoICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9sZW5ndGgpOworCisgICAgICAgICAgICBpdGVtLmFkZEV4dGVudCh7IGV4dGVudF9pbmRleCwgZXh0ZW50X29mZnNldCwgZXh0ZW50X2xlbmd0aCB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtUmVmZXJlbmNlIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgeworICAgIEl0ZW1SZWZlcmVuY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgdWludDMyX3QgaXRlbUlkKCkgeyByZXR1cm4gbUl0ZW1JZDsgfQorCisgICAgdm9pZCBhcHBseShLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JbWFnZU1hcCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBpdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJhdHRhY2ggcmVmZXJlbmNlIHR5cGUgMHgleCB0byBpdGVtIGlkICVkKSIsIHR5cGUoKSwgbUl0ZW1JZCk7CisKKyAgICAgICAgaWYgKHR5cGUoKSA9PSBGT1VSQ0MoJ2QnLCAnaScsICdtJywgJ2cnKSkgeworICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBpZiAoIWltYWdlLmRpbWdSZWZzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZGltZ1JlZnMgaWYgbm90IGNsZWFuISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2UuZGltZ1JlZnMuYXBwZW5kVmVjdG9yKG1SZWZzKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlKCkgPT0gRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJykpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbWFnZUluZGV4ID0gaXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1SZWZzW2ldKTsKKworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICAgICAgICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJJbWFnZSBpdGVtIGlkICVkIHVzZXMgdGh1bWJuYWlsIGl0ZW0gaWQgJWQiLCBtUmVmc1tpXSwgbUl0ZW1JZCk7CisgICAgICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFpbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHJlZiB0eXBlIDB4JXgiLCB0eXBlKCkpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1JdGVtSWQ7CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IG1SZWZzOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVJlZmVyZW5jZSk7Cit9OworCitzdGF0dXNfdCBJdGVtUmVmZXJlbmNlOjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IG1SZWZJZFNpemUgKyAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZtSXRlbUlkLCBtUmVmSWRTaXplKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSBtUmVmSWRTaXplOworCisgICAgdWludDE2X3QgY291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJmNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSAyOworICAgIHNpemUgLT0gKG1SZWZJZFNpemUgKyAyKTsKKworICAgIGlmIChzaXplIDwgY291bnQgKiBtUmVmSWRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IHJlZkl0ZW1JZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJnJlZkl0ZW1JZCwgbVJlZklkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gbVJlZklkU2l6ZTsKKyAgICAgICAgbVJlZnMucHVzaF9iYWNrKHJlZkl0ZW1JZCk7CisgICAgICAgIEFMT0dWKCJpdGVtIGlkICVkOiByZWZlcmVuY2luZyBpdGVtIGlkICVkIiwgbUl0ZW1JZCwgcmVmSXRlbUlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElyZWZCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqbUl0ZW1SZWZzOworfTsKKworc3RhdHVzX3QgSXJlZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtUmVmSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcmVmQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUmVmZXJlbmNlPiBpdGVtUmVmID0gbmV3IEl0ZW1SZWZlcmVuY2Uoc291cmNlKCksIHR5cGUsIG1SZWZJZFNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVJlZi0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtUmVmcy0+cHVzaF9iYWNrKGl0ZW1SZWYpOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1Qcm9wZXJ0eSByZWxhdGVkIGJveGVzCisvLworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeSB7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgZXNzZW50aWFsOworICAgIHVpbnQxNl90IGluZGV4OworfTsKKworc3RydWN0IEl0ZW1Qcm9wZXJ0eSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBJdGVtUHJvcGVydHkoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmLyppbWFnZSovKSBjb25zdCB7CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZShvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVByb3BlcnR5KTsKK307CisKK3N0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIElzcGVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS53aWR0aCA9IG1XaWR0aDsKKyAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7Cit9OworCitzdGF0dXNfdCBJc3BlQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZtV2lkdGgpCisgICAgICAgICAgICB8fCAhc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmbUhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBBTE9HVigicHJvcGVydHkgaXNwZTogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIEh2Y2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS5odmNjID0gbUhWQ0M7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEFCdWZmZXI+IG1IVkNDOworfTsKKworc3RhdHVzX3QgSHZjY0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIG1IVkNDID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisKKyAgICBpZiAobUhWQ0MtPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSFZDQy0+ZGF0YSgpLCBzaXplKSA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIEFMT0dWKCJwcm9wZXJ0eSBodmNDIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcm90Qm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7CisgICAgSXJvdEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uucm90YXRpb24gPSBtQW5nbGUgKiA5MDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtQW5nbGU7Cit9OworCitzdGF0dXNfdCBJcm90Qm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJm1BbmdsZSwgMSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG1BbmdsZSAmPSAweDM7CisgICAgQUxPR1YoInByb3BlcnR5IGlyb3Q6ICVkIiwgbUFuZ2xlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBDb2xyQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2MnLCAnbycsICdsJywgJ3InKSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2UuaWNjID0gbUlDQ0RhdGE7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEFCdWZmZXI+IG1JQ0NEYXRhOworfTsKKworc3RhdHVzX3QgQ29sckJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBjb2xvdXJfdHlwZTsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmY29sb3VyX3R5cGUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICAgIGlmIChjb2xvdXJfdHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGlmICgoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdyJywgJ0knLCAnQycsICdDJykpICYmCisgICAgICAgIChjb2xvdXJfdHlwZSAhPSBGT1VSQ0MoJ3AnLCAncicsICdvJywgJ2YnKSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtSUNDRGF0YSA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIGlmIChtSUNDRGF0YS0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1JQ0NEYXRhLT5kYXRhKCksIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIEFMT0dWKCJwcm9wZXJ0eSBDb2xyOiBzaXplICV6ZCIsIHNpemUpOworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwbWFCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSXBtYUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKK3ByaXZhdGU6CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOworfTsKKworc3RhdHVzX3QgSXBtYUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGVudHJ5Q291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmVudHJ5Q291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgc2l6ZSAtPSA0OworCisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBlbnRyeUNvdW50OyArK2spIHsKKyAgICAgICAgdWludDMyX3QgaXRlbUlkID0gMDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpIDwgMSkgPyAyIDogNDsKKworICAgICAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUgKyAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1JZCwgaXRlbUlkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gaXRlbUlkU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplOworCisgICAgICAgIHVpbnQ4X3QgYXNzb2NpYXRpb25Db3VudDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJmFzc29jaWF0aW9uQ291bnQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIHNpemUtLTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFzc29jaWF0aW9uQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc2l6ZV90IHByb3BJbmRleFNpemUgPSAoZmxhZ3MoKSAmIDEpID8gMiA6IDE7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHByb3BJbmRleFNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDE2X3QgcHJvcEluZGV4OworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2VmFyKG9mZnNldCwgJnByb3BJbmRleCwgcHJvcEluZGV4U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gcHJvcEluZGV4U2l6ZTsKKyAgICAgICAgICAgIHNpemUgLT0gcHJvcEluZGV4U2l6ZTsKKyAgICAgICAgICAgIHVpbnQxNl90IGJpdG1hc2sgPSAoMSA8PCAoOCAqIHByb3BJbmRleFNpemUgLSAxKSk7CisgICAgICAgICAgICBBc3NvY2lhdGlvbkVudHJ5IGVudHJ5ID0geworICAgICAgICAgICAgICAgICAgICAuaXRlbUlkID0gaXRlbUlkLAorICAgICAgICAgICAgICAgICAgICAuZXNzZW50aWFsID0gISEocHJvcEluZGV4ICYgYml0bWFzayksCisgICAgICAgICAgICAgICAgICAgIC5pbmRleCA9ICh1aW50MTZfdCkgKHByb3BJbmRleCAmIH5iaXRtYXNrKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSAlZCAoZXNzZW50aWFsICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCwgZW50cnkuaW5kZXgsIGVudHJ5LmVzc2VudGlhbCk7CisKKyAgICAgICAgICAgIG1Bc3NvY2lhdGlvbnMtPnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7CisgICAgSXBjb0JveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptSXRlbVByb3BlcnRpZXM7Cit9OworCitzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcGNvQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUHJvcGVydHk+IGl0ZW1Qcm9wZXJ0eTsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSHZjY0JveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXNwZUJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXJvdEJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleAorICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEl0ZW1Qcm9wZXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVByb3BlcnR5LT5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2soaXRlbVByb3BlcnR5KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7CisgICAgSXBycEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsCisgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAorICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLAorICAgICAgICBtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqbVByb3BlcnRpZXM7CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOworfTsKKworc3RhdHVzX3QgSXBycEJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IElwcnBCb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIElwY29Cb3ggaXBjb0JveChzb3VyY2UoKSwgbVByb3BlcnRpZXMpOworICAgICAgICAgICAgcmV0dXJuIGlwY29Cb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpOgorICAgICAgICB7CisgICAgICAgICAgICBJcG1hQm94IGlwbWFCb3goc291cmNlKCksIG1Bc3NvY2lhdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIGlwbWFCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIGJveC4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1JbmZvIHJlbGF0ZWQgYm94ZXMKKy8vCitzdHJ1Y3QgSXRlbUluZm8geworICAgIHVpbnQzMl90IGl0ZW1JZDsKKyAgICB1aW50MzJfdCBpdGVtVHlwZTsKK307CisKK3N0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIEluZmVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCk7Cit9OworCitib29sIEluZmVCb3g6OnBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBTdHJpbmc4ICpvdXQpIHsKKyAgICBjaGFyIHRtcFsyNTZdOworICAgIHNpemVfdCBsZW4gPSAwOworICAgIG9mZjY0X3QgbmV3T2Zmc2V0ID0gKm9mZnNldDsKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSAqb2Zmc2V0ICsgKnNpemU7CisgICAgd2hpbGUgKG5ld09mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG5ld09mZnNldCsrLCAmdG1wW2xlbl0sIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcFtsZW5dID09IDApIHsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKHRtcCwgbGVuKTsKKworICAgICAgICAgICAgKm9mZnNldCA9IG5ld09mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gc3RvcE9mZnNldCAtIG5ld09mZnNldDsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrbGVuID49IHNpemVvZih0bXApKSB7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCh0bXAsIGxlbik7CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgSW5mZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbigpID09IDAgfHwgdmVyc2lvbigpID09IDEpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVpbnQxNl90IGl0ZW1faWQ7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZpdGVtX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJpdGVtX2lkICVkIiwgaXRlbV9pZCk7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCArIDIsICZpdGVtX3Byb3RlY3Rpb25faW5kZXgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKworICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOworICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X3R5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCBjb250ZW50X2VuY29kaW5nOworICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSkgeworICAgICAgICAgICAgdWludDMyX3QgZXh0ZW5zaW9uX3R5cGU7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZXh0ZW5zaW9uX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlCisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyB2ZXJzaW9uID49IDIKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDIpID8gMiA6IDQ7CisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKKyAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9wcm90ZWN0aW9uX2luZGV4ICVkIiwgaXRlbV9wcm90ZWN0aW9uX2luZGV4KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIHVpbnQzMl90IGl0ZW1fdHlwZTsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJml0ZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW1JbmZvLT5pdGVtSWQgPSBpdGVtX2lkOworICAgICAgICBpdGVtSW5mby0+aXRlbVR5cGUgPSBpdGVtX3R5cGU7CisKKyAgICAgICAgY2hhciBpdGVtVHlwZVN0cmluZ1s1XTsKKyAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhpdGVtX3R5cGUsIGl0ZW1UeXBlU3RyaW5nKTsKKyAgICAgICAgQUxPR1YoIml0ZW1fdHlwZSAlcyIsIGl0ZW1UeXBlU3RyaW5nKTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gaXRlbUlkU2l6ZSArIDY7CisKKyAgICAgICAgU3RyaW5nOCBpdGVtX25hbWU7CisgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1fbmFtZSAlcyIsIGl0ZW1fbmFtZS5jX3N0cigpKTsKKworICAgICAgICBpZiAoaXRlbV90eXBlID09IEZPVVJDQygnbScsICdpJywgJ20nLCAnZScpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfdHlwZTsKKyAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbV90eXBlID09IEZPVVJDQygndScsICdyJywgJ2knLCAnICcpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGl0ZW1fdXJpX3R5cGU7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX3VyaV90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJaW5mQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKSksCisgICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzR3JpZHMoKSB7IHJldHVybiBtSGFzR3JpZHM7IH0KKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPEl0ZW1JbmZvPiAqbUl0ZW1JbmZvczsKKyAgICBib29sIG1IYXNHcmlkczsKK307CisKK3N0YXR1c190IElpbmZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgZW50cnlDb3VudFNpemUgPSB2ZXJzaW9uKCkgPT0gMCA/IDIgOiA0OworICAgIGlmIChzaXplIDwgZW50cnlDb3VudFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZW50cnlfY291bnQ7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJmVudHJ5X2NvdW50LCBlbnRyeUNvdW50U2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBBTE9HVigiZW50cnlfY291bnQgJWQiLCBlbnRyeV9jb3VudCk7CisKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOworICAgIG9mZnNldCArPSBlbnRyeUNvdW50U2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5X2NvdW50ICYmIG9mZnNldCA8IHN0b3BPZmZzZXQ7IGkrKykgeworICAgICAgICBBTE9HVigiZW50cnkgJXp1IiwgaSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9mZnNldCAhPSBzdG9wT2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJaW5mQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAodHlwZSAhPSBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgSW5mZUJveCBpbmZlQm94KHNvdXJjZSgpKTsKKyAgICBJdGVtSW5mbyBpdGVtSW5mbzsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbmZlQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJml0ZW1JbmZvKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtSW5mb3MtPnB1c2hfYmFjayhpdGVtSW5mbyk7CisgICAgbUhhc0dyaWRzIHw9IChpdGVtSW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKSk7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSXRlbVRhYmxlOjpJdGVtVGFibGUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtUHJpbWFyeUl0ZW1JZCgwKSwKKyAgICAgIG1JZGF0T2Zmc2V0KDApLAorICAgICAgbUlkYXRTaXplKDApLAorICAgICAgbUltYWdlSXRlbXNWYWxpZChmYWxzZSksCisgICAgICBtQ3VycmVudEltYWdlSW5kZXgoMCkgeworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXBycCcpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWxvYycpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgncGl0bScpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWluZicpOworfQorCitJdGVtVGFibGU6On5JdGVtVGFibGUoKSB7fQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bnJlY29nbml6ZWQgYm94IHR5cGU6IDB4JXgiLCB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElsb2NCb3ggaWxvY0JveChtRGF0YVNvdXJjZSwgJm1JdGVtTG9jcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaWxvY0JveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaWxvY0JveC5oYXNDb25zdHJ1Y3RNZXRob2QxKCkpIHsKKyAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpZGF0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lsb2MnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElpbmZCb3ggaWluZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtSW5mb3MpOworICAgIHN0YXR1c190IGVyciA9IGlpbmZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgeworICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWluZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgUGl0bUJveCBwaXRtQm94KG1EYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwaXRtQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJm1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ3BpdG0nKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElwcnBCb3ggaXBycEJveChtRGF0YVNvdXJjZSwgJm1JdGVtUHJvcGVydGllcywgJm1Bc3NvY2lhdGlvbnMpOworICAgIHN0YXR1c190IGVyciA9IGlwcnBCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lwcnAnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBpZGF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgLy8gb25seSByZW1lbWJlciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIGlkYXQgYm94IGZvciBsYXRlciB1c2UKKyAgICBtSWRhdE9mZnNldCA9IG9mZnNldDsKKyAgICBtSWRhdFNpemUgPSBzaXplOworCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lkYXQnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElyZWZCb3ggaXJlZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtUmVmZXJlbmNlcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaXJlZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXJlZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSkgeworICAgIGlmIChtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtQm94ZXNTZWVuLmluc2VydCh0eXBlKTsKKworICAgIC8vIG5lZWQgYXQgbGVhc3QgJ2lwcnAnLCAnaWxvYycsICdwaXRtJywgJ2lpbmYnOworICAgIC8vIG5lZWQgJ2lkYXQnIGlmIGFueSBpdGVtcyB1c2VkIGNvbnN0cnVjdGlvbl9tZXRob2Qgb2YgMjsKKyAgICAvLyBuZWVkICdpcmVmJyBpZiB0aGVyZSBhcmUgZ3JpZHMuCisgICAgaWYgKCFzdGQ6OmluY2x1ZGVzKAorICAgICAgICAgICAgbUJveGVzU2Vlbi5iZWdpbigpLCBtQm94ZXNTZWVuLmVuZCgpLAorICAgICAgICAgICAgbVJlcXVpcmVkQm94ZXMuYmVnaW4oKSwgbVJlcXVpcmVkQm94ZXMuZW5kKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigiYnVpbGRpbmcgaW1hZ2UgdGFibGUuLi4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1JbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBJdGVtSW5mbyAmaW5mbyA9IG1JdGVtSW5mb3NbaV07CisKKworICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaW1hZ2VJbmRleCA+PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZHVwbGljYXRlIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaWxvY0luZGV4ID0gbUl0ZW1Mb2NzLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaWxvY0luZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImlsb2MgbWlzc2luZyBmb3IgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEl0ZW1Mb2MgJmlsb2MgPSBtSXRlbUxvY3NbaWxvY0luZGV4XTsKKworICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChpbG9jLmdldExvYygmb2Zmc2V0LCAmc2l6ZSwgbUlkYXRPZmZzZXQsIG1JZGF0U2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBJbWFnZUl0ZW0gaW1hZ2UoaW5mby5pdGVtVHlwZSk7CisKKyAgICAgICAgQUxPR1YoImFkZGluZyAlczogaXRlbUlkICVkIiwgaW1hZ2UuaXNHcmlkKCkgPyAiZ3JpZCIgOiAiaW1hZ2UiLCBpbmZvLml0ZW1JZCk7CisKKyAgICAgICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7CisgICAgICAgICAgICAvLyBJbWFnZUdyaWQgc3RydWN0IGlzIGF0IGxlYXN0IDgtYnl0ZSwgYXQgbW9zdCAxMi1ieXRlIChpZiBmbGFncyYxKQorICAgICAgICAgICAgaWYgKHNpemUgPCA4IHx8IHNpemUgPiAxMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IGJ1ZlsxMl07CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWFnZS5yb3dzID0gYnVmWzJdICsgMTsKKyAgICAgICAgICAgIGltYWdlLmNvbHVtbnMgPSBidWZbM10gKyAxOworCisgICAgICAgICAgICBBTE9HVigicm93cyAlZCwgY29sdW1hbnMgJWQiLCBpbWFnZS5yb3dzLCBpbWFnZS5jb2x1bW5zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGltYWdlLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIGltYWdlLnNpemUgPSBzaXplOworICAgICAgICB9CisgICAgICAgIG1JdGVtSWRUb0ltYWdlTWFwLmFkZChpbmZvLml0ZW1JZCwgaW1hZ2UpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFzc29jaWF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBhdHRhY2hQcm9wZXJ0eShtQXNzb2NpYXRpb25zW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0ltYWdlTWFwKTsKKyAgICB9CisKKyAgICBtSW1hZ2VJdGVtc1ZhbGlkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSXRlbVRhYmxlOjphdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbikgeworICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoYXNzb2NpYXRpb24uaXRlbUlkKTsKKworICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQxNl90IHByb3BlcnR5SW5kZXggPSBhc3NvY2lhdGlvbi5pbmRleDsKKyAgICBpZiAocHJvcGVydHlJbmRleCA+PSBtSXRlbVByb3BlcnRpZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBpbnZhbGlkIHByb3BlcnR5IGluZGV4ICVkIiwgcHJvcGVydHlJbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiYXR0YWNoIHByb3BlcnR5ICVkIHRvIGl0ZW0gaWQgJWQpIiwKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXgsIGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICBtSXRlbVByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0tPmF0dGFjaFRvKAorICAgICAgICAgICAgbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCkpOworfQorCitzcDxNZXRhRGF0YT4gSXRlbVRhYmxlOjpnZXRJbWFnZU1ldGEoKSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOworICAgIGlmIChpbWFnZUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiUHJpbWFyeSBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBtUHJpbWFyeUl0ZW1JZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFMT0dWKCJwcmltYXJ5IGltYWdlIGluZGV4ICV6dSIsIGltYWdlSW5kZXgpOworCisgICAgY29uc3QgSW1hZ2VJdGVtICppbWFnZSA9ICZtSXRlbUlkVG9JbWFnZU1hcFtpbWFnZUluZGV4XTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKworICAgIEFMT0dWKCJzZXR0aW5nIGltYWdlIHNpemUgJWR4JWQiLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgaW1hZ2UtPndpZHRoKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKKyAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKKyAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQorICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCisgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsgLy8gZG9uJ3Qgc2V0IGlmIGludmFsaWQKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKworICAgIGlmICghaW1hZ2UtPnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICBzc2l6ZV90IHRodW1ibmFpbEluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CisgICAgICAgIGlmICh0aHVtYm5haWxJbmRleCA+PSAwKSB7CisgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0ltYWdlTWFwW3RodW1ibmFpbEluZGV4XTsKKworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWwud2lkdGgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgdGh1bWJuYWlsLmhlaWdodCk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCBrVHlwZUhWQ0MsCisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgQUxPR1YoInRodW1ibmFpbCBtZXRhOiAlZHglZCwgaW5kZXggJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYm5haWxJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiUmVmZXJlbmNlZCB0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7CisgICAgICAgIHNzaXplX3QgdGlsZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShpbWFnZS0+ZGltZ1JlZnNbMF0pOworICAgICAgICBpZiAodGlsZUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRSb3dzLCBpbWFnZS0+cm93cyk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgaW1hZ2UtPmNvbHVtbnMpOworCisgICAgICAgIC8vIHBvaW50IGltYWdlIHRvIHRoZSBmaXJzdCB0aWxlIGZvciBncmlkIHNpemUgYW5kIEhWQ0MKKyAgICAgICAgaW1hZ2UgPSAmbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQodGlsZUluZGV4KTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRXaWR0aCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRIZWlnaHQsIGltYWdlLT5oZWlnaHQpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKyAgICB9CisKKyAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiaHZjYyBpcyBtaXNzaW5nISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBpbWFnZS0+aHZjYy0+ZGF0YSgpLCBpbWFnZS0+aHZjYy0+c2l6ZSgpKTsKKworICAgIGlmIChpbWFnZS0+aWNjICE9IE5VTEwpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SWNjUHJvZmlsZSwgMCwgaW1hZ2UtPmljYy0+ZGF0YSgpLCBpbWFnZS0+aWNjLT5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gbWV0YTsKK30KKwordWludDMyX3QgSXRlbVRhYmxlOjpjb3VudEltYWdlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltYWdlSXRlbXNWYWxpZCA/IG1JdGVtSWRUb0ltYWdlTWFwLnNpemUoKSA6IDA7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6ZmluZFByaW1hcnlJbWFnZSh1aW50MzJfdCAqaW1hZ2VJbmRleCkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqaW1hZ2VJbmRleCA9IGluZGV4OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpmaW5kVGh1bWJuYWlsKHVpbnQzMl90ICppbWFnZUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzc2l6ZV90IHByaW1hcnlJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOworICAgIGlmIChwcmltYXJ5SW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJQcmltYXJ5IGl0ZW0gaWQgJWQgbm90IGZvdW5kISIsIG1QcmltYXJ5SXRlbUlkKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBJbWFnZUl0ZW0gJnByaW1hcnlJbWFnZSA9IG1JdGVtSWRUb0ltYWdlTWFwW3ByaW1hcnlJbmRleF07CisgICAgaWYgKHByaW1hcnlJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIlVzaW5nIHByaW1hcnkgaW4gcGxhY2Ugb2YgdGh1bWJuYWlsLiIpOworICAgICAgICAqaW1hZ2VJbmRleCA9IHByaW1hcnlJbmRleDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNzaXplX3QgdGh1bWJuYWlsSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KAorICAgICAgICAgICAgcHJpbWFyeUltYWdlLnRodW1ibmFpbHNbMF0pOworICAgIGlmICh0aHVtYm5haWxJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlRodW1ibmFpbCBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBwcmltYXJ5SW1hZ2UudGh1bWJuYWlsc1swXSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKmltYWdlSW5kZXggPSB0aHVtYm5haWxJbmRleDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAorICAgICAgICB1aW50MzJfdCAqaW1hZ2VJbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChpbWFnZUluZGV4ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCppbWFnZUluZGV4ID49IG1JdGVtSWRUb0ltYWdlTWFwLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIkJhZCBpbWFnZSBpbmRleCEiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRJbWFnZUluZGV4ID0gKmltYWdlSW5kZXg7CisgICAgfQorCisgICAgSW1hZ2VJdGVtICZpbWFnZSA9IG1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KG1DdXJyZW50SW1hZ2VJbmRleCk7CisgICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7CisgICAgICAgIHVpbnQzMl90IHRpbGVJdGVtSWQ7CisgICAgICAgIHN0YXR1c190IGVyciA9IGltYWdlLmdldE5leHRUaWxlSXRlbUlkKCZ0aWxlSXRlbUlkLCBpbWFnZUluZGV4ICE9IE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIHNzaXplX3QgdGlsZUltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KHRpbGVJdGVtSWQpOworICAgICAgICBpZiAodGlsZUltYWdlSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvSW1hZ2VNYXBbdGlsZUltYWdlSW5kZXhdLm9mZnNldDsKKyAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JbWFnZU1hcFt0aWxlSW1hZ2VJbmRleF0uc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW1hZ2VJbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBGb3Igc2luZ2xlIGltYWdlcywgd2Ugb25seSBhbGxvdyBpdCB0byBiZSByZWFkIG9uY2UsIGFmdGVyIHRoYXQKKyAgICAgICAgICAgIC8vIGl0J3MgRU9TLiAgTmV3IGltYWdlIGluZGV4IG11c3QgYmUgcmVxdWVzdGVkIGVhY2ggdGltZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgICpvZmZzZXQgPSBtSXRlbUlkVG9JbWFnZU1hcFttQ3VycmVudEltYWdlSW5kZXhdLm9mZnNldDsKKyAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JbWFnZU1hcFttQ3VycmVudEltYWdlSW5kZXhdLnNpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9IC8vIG5hbWVzcGFjZSBoZWlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggODdhYmI2YS4uOWM3NzdiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTI3LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9JdGVtVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpAQCAtMzUsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNzEsNyArNzQsOCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKLSAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCk7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwpAQCAtMTMzLDYgKzEzNyw5IEBACiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCisgICAgYm9vbCBtSXNIRUlGOworICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKKwogICAgIHNpemVfdCBwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwogICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKQEAgLTI4NCw0NSArMjkxLDYgQEAKIAogc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKIAotc3RhdGljIHZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwcmludGYoIjB4JTA0enggICIsIG9mZnNldCk7Ci0KLSAgICAgICAgc2l6ZV90IG4gPSBzaXplIC0gb2Zmc2V0OwotICAgICAgICBpZiAobiA+IDE2KSB7Ci0gICAgICAgICAgICBuID0gMTY7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpID09IDgpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIGkgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRhdGFbb2Zmc2V0ICsgaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCIgIik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpc3ByaW50KGRhdGFbb2Zmc2V0ICsgaV0pKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsIGRhdGFbb2Zmc2V0ICsgaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaW50ZigiXG4iKTsKLQotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqRm91ckNDMk1JTUUodWludDMyX3QgZm91cmNjKSB7CiAgICAgc3dpdGNoIChmb3VyY2MpIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKQEAgLTM3Nyw2ICszNDUsNyBAQAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCisgICAgICBtSXNIRUlGKGZhbHNlKSwKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSwKICAgICAgIG1GaWxlTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKQEAgLTM4NSw2ICszNTQsMTAgQEAKIH0KIAogTVBFRzRFeHRyYWN0b3I6On5NUEVHNEV4dHJhY3RvcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3ZvaWQgTVBFRzRFeHRyYWN0b3I6OnJlbGVhc2UoKSB7CiAgICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7CiAgICAgd2hpbGUgKHRyYWNrKSB7CiAgICAgICAgIFRyYWNrICpuZXh0ID0gdHJhY2stPm5leHQ7CkBAIC00MDYsNiArMzc5LDEyIEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewogICAgICAgICBkZWxldGUgW10gbVBzc2hbaV0uZGF0YTsKICAgICB9CisgICAgbVBzc2guY2xlYXIoKTsKKworICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgIH0KIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNTExLDE0ICs0OTAsNiBAQAogICAgIHJldHVybiB0cmFjay0+bWV0YTsKIH0KIAotc3RhdGljIHZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKSB7Ci0gICAgc1swXSA9IHggPj4gMjQ7Ci0gICAgc1sxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgc1syXSA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICBzWzNdID0geCAmIDB4ZmY7Ci0gICAgc1s0XSA9ICdcMCc7Ci19Ci0KIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fSU5JVCkgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKQEAgLTUyOCw3ICs0OTksOCBAQAogICAgIHN0YXR1c190IGVycjsKICAgICBib29sIHNhd01vb3ZPclNpZHggPSBmYWxzZTsKIAotICAgIHdoaWxlICghKHNhd01vb3ZPclNpZHggJiYgKG1NZGF0Rm91bmQgfHwgbU1vb2ZGb3VuZCkpKSB7CisgICAgd2hpbGUgKCEoKHNhd01vb3ZPclNpZHggJiYgKG1NZGF0Rm91bmQgfHwgbU1vb2ZGb3VuZCkpIHx8CisgICAgICAgICAgICAobUlzSEVJRiAmJiAobUl0ZW1UYWJsZSAhPSBOVUxMKSAmJiBtSXRlbVRhYmxlLT5pc1ZhbGlkKCkpKSkgewogICAgICAgICBvZmY2NF90IG9yaWdfb2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQsIDApOwogCkBAIC01ODAsNiArNTUyLDI5IEBACiAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CiAgICAgICAgIGZyZWUoYnVmKTsKICAgICB9CisKKyAgICBpZiAobUlzSEVJRikgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YSgpOworICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gbUxhc3RUcmFjazsKKyAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBpcyBzZXQgYmVmb3JlIG1ldGFkYXRhIGlzIGZ1bGx5IHByb2Nlc3NlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSB0cmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrLT5tZXRhID0gbWV0YTsKKyAgICAgICAgdHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCAwKTsKKyAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOworICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CisgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOworICAgIH0KKwogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCkBAIC05NjYsOCArOTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID0gbmV3IFNhbXBsZVRhYmxlKG1EYXRhU291cmNlKTsKICAgICAgICAgICAgIH0KQEAgLTExMzksOCArMTEzNSw5IEBACiAgICAgICAgICAgICBvcmlnaW5hbF9mb3VyY2MgPSBudG9obChvcmlnaW5hbF9mb3VyY2MpOwogICAgICAgICAgICAgQUxPR1YoInJlYWQgb3JpZ2luYWwgZm9ybWF0OiAlZCIsIG9yaWdpbmFsX2ZvdXJjYyk7CiAKLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKQEAgLTE1ODAsOCArMTU3Nyw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCkBAIC0xNjE3LDggKzE2MTUsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVNpemVQYXJhbXMoCkBAIC0xNzc5LDM1ICsxNzc4LDQ5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAotICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIlx4QTl4eXoiIGJveAotICAgICAgICAgICAgLy8gd291bGQgYmUgOCwgZm9yIGluc3RhbmNlICJceEE5eHl6IiArICJceDAwXHgwNFx4MTVceGM3IiArICIwKzAvIiwKLSAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNCIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNCwKLSAgICAgICAgICAgIC8vICJcMHgxNVx4YzciIGlzIHRoZSBsYW5ndWFnZSBjb2RlID0gZW4sIGFuZCAiMCswIiBpcyBhCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94IHdvdWxkCisgICAgICAgICAgICAvLyBiZSA5LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA1XHgxNVx4YzciICsgIiswKzAvIiwKKyAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNSIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNSwKKyAgICAgICAgICAgIC8vICJcMHgxNVx4YzciIGlzIHRoZSBsYW5ndWFnZSBjb2RlID0gZW4sIGFuZCAiKzArMC8iIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgZGV2aWNlcyBlbmNvdW50ZXJlZCBpbiB0aGUgd2lsZCBvbWl0IHRoZSB0cmFpbGluZworICAgICAgICAgICAgLy8gc2xhc2gsIHdlJ2xsIGFsbG93IHRoYXQuCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeyAvLyA4IGluc3RlYWQgb2YgOSB0byBhbGxvdyBmb3IgbWlzc2luZyAvCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gV29yc3QgY2FzZSB0aGUgbG9jYXRpb24gc3RyaW5nIGxlbmd0aCB3b3VsZCBiZSAxOCwKLSAgICAgICAgICAgIC8vIGZvciBpbnN0YW5jZSArOTAuMDAwMC0xODAuMDAwMCwgd2l0aG91dCB0aGUgdHJhaWxpbmcgIi8iIGFuZAotICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBsZW5ndGggKyBsYW5ndWFnZSBjb2RlLCBhbmQgc29tZSBkZXZpY2VzIGluY2x1ZGUKLSAgICAgICAgICAgIC8vIGFuIGFkZGl0aW9uYWwgOCBieXRlcyBvZiBhbHRpdHVkZSwgZS5nLiArMDA3LjE4NgotICAgICAgICAgICAgY2hhciBidWZmZXJbMTggKyA4XTsKLQotICAgICAgICAgICAgLy8gU3Vic3RyYWN0aW5nIDUgZnJvbSB0aGUgZGF0YSBzaXplIGlzIGJlY2F1c2UgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCArCi0gICAgICAgICAgICAvLyBsYW5ndWFnZSBjb2RlIHRha2VzIDQgYnl0ZXMsIGFuZCB0aGUgdHJhaWxpbmcgc2xhc2ggIi8iIHRha2VzIDEgYnl0ZS4KLSAgICAgICAgICAgIG9mZjY0X3QgbG9jYXRpb25fbGVuZ3RoID0gY2h1bmtfZGF0YV9zaXplIC0gNTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvbl9sZW5ndGggPj0gKG9mZjY0X3QpIHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDQsIGJ1ZmZlciwgbG9jYXRpb25fbGVuZ3RoKSA8IGxvY2F0aW9uX2xlbmd0aCkgeworICAgICAgICAgICAgdWludDE2X3QgbGVuOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRhdGFfb2Zmc2V0LCAmbGVuKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnVmZmVyW2xvY2F0aW9uX2xlbmd0aF0gPSAnXDAnOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sIGJ1ZmZlcik7CisgICAgICAgICAgICAvLyBhbGxvdyAiKzArMCIgd2l0aG91dCB0cmFpbGluZyBzbGFzaAorICAgICAgICAgICAgaWYgKGxlbiA8IDQgfHwgbGVuID4gY2h1bmtfZGF0YV9zaXplIC0gNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgbG9jYXRpb24gc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFuZ3VhZ2UgY29kZSBpcyBmb3JtYXR0ZWQKKyAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBJU08gNjcwOToyMDA4IChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNjcwOSkuCisgICAgICAgICAgICAvLyBBbGxvY2F0ZSAyIGV4dHJhIGJ5dGVzLCBpbiBjYXNlIHdlIG5lZWQgdG8gYWRkIGEgdHJhaWxpbmcgc2xhc2gsCisgICAgICAgICAgICAvLyBhbmQgdG8gYWRkIGEgdGVybWluYXRpbmcgMC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGJ1ZmZlcihuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltsZW4rMl0oKSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA0LCAmYnVmZmVyWzBdLCBsZW4pIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBpZiAobGVuIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgYSB0cmFpbGluZyBzbGFzaCBpZiB0aGVyZSB3YXNuJ3Qgb25lLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcltsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbbGVuXSA9ICcvJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCAmYnVmZmVyWzBdKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIwMjMsNiArMjAzNiwyOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUlzSEVJRikgeworICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUl0ZW1UYWJsZSA9IG5ldyBJdGVtVGFibGUobURhdGFTb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSXRlbVRhYmxlLT5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CkBAIC0yMzcwLDYgKzI0MDUsNyBAQAogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGNodW5rX2RhdGFfc2l6ZSAtIDgpIC8gNDsKKyAgICAgICAgICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBicmFuZFNldDsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29tcGF0aWJsZUJyYW5kcyArIDI7ICsraSkgewogICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGluZGV4LCBpdCByZWZlcnMgdG8gdGhlIG1pbm9yVmVyc2lvbiwKQEAgLTIzODMsMTAgKzI0MTksMTUgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBicmFuZCA9IG50b2hsKGJyYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoYnJhbmQgPT0gRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJykpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJhbmRTZXQuaW5zZXJ0KGJyYW5kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtSXNRVCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygnbScsICdpJywgJ2YnLCAnMScpKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgYnJhbmRTZXQuY291bnQoRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJykpID4gMCkgeworICAgICAgICAgICAgICAgIG1Jc0hFSUYgPSB0cnVlOworICAgICAgICAgICAgICAgIEFMT0dWKCJpZGVudGlmaWVkIEhFSUYgaW1hZ2UiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OwpAQCAtMzMzNSw3ICszMzc2LDcgQEAKIAogICAgIHNwPE1QRUc0U291cmNlPiBzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKHRoaXMsCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQpOworICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgbUl0ZW1UYWJsZSk7CiAgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTM3MjQsNyArMzc2NSw4IEBACiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAotICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCkKKyAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKICAgICA6IG1Pd25lcihvd25lciksCiAgICAgICBtRm9ybWF0KGZvcm1hdCksCiAgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKQEAgLTM3NDksNyArMzc5MSw5IEBACiAgICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAogICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKLSAgICAgIG1TcmNCdWZmZXIoTlVMTCkgeworICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKKyAgICAgIG1Jc0hFSUYoaXRlbVRhYmxlICE9IE5VTEwpLAorICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKIAogICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CiAKQEAgLTQ1MjQsNzcgKzQ1NjgsOTMgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKLSAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6Ci0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6Ci0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQWZ0ZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKLSAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBpZiAobUlzSEVJRikgeworICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKIAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIDEwMDAwMDAsIG1UaW1lc2NhbGUsCi0gICAgICAgICAgICAgICAgJnNhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwotCi0gICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbG9zZXN0IHNhbXBsZSBhbHJlYWR5LCBub3cgd2Ugd2FudCB0aGUgc3luYwotICAgICAgICAgICAgLy8gc2FtcGxlIHByZWNlZGluZyBpdCAob3IgdGhlIHNhbXBsZSBpdHNlbGYgb2YgY291cnNlKSwgZXZlbgotICAgICAgICAgICAgLy8gaWYgdGhlIHN1YnNlcXVlbnQgc3luYyBzYW1wbGUgaXMgY2xvc2VyLgotICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZUluZGV4OwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTeW5jU2FtcGxlTmVhcigKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKLSAgICAgICAgICAgICAgICAvLyBBbiBhdHRlbXB0IHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd291bGQKLSAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBjYXVzZSB0aGlzIEVSUk9SX09VVF9PRl9SQU5HRSBlcnJvci4gUHJvcGFnYXRpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAotICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCi0gICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFByaW1hcnlJbWFnZSgmbUN1cnJlbnRTYW1wbGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWwoJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQWZ0ZXI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQ2xvc2VzdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgY2xvc2VzdCBzYW1wbGUgYWxyZWFkeSwgbm93IHdlIHdhbnQgdGhlIHN5bmMKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGUgcHJlY2VkaW5nIGl0IChvciB0aGUgc2FtcGxlIGl0c2VsZiBvZiBjb3Vyc2UpLCBldmVuCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN1YnNlcXVlbnQgc3luYyBzYW1wbGUgaXMgY2xvc2VyLgorICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc2FtcGxlVGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbiBhdHRlbXB0IHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd291bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHkgY2F1c2UgdGhpcyBFUlJPUl9PVVRfT0ZfUkFOR0UgZXJyb3IuIFByb3BhZ2F0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCisgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KIAogI2lmIDAKLSAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZVRpbWU7Ci0gICAgICAgIENIRUNLX0VRKE9LLCBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOworICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZVRpbWU7CisgICAgICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnN5bmNTYW1wbGVUaW1lKSk7CiAKLSAgICAgICAgQUxPR0koInNlZWsgdG8gdGltZSAlbGxkIHVzID0+IHNhbXBsZSBhdCB0aW1lICVsbGQgdXMsICIKLSAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICBzZWVrVGltZVVzLAotICAgICAgICAgICAgIHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwgLyBtVGltZXNjYWxlLAotICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTE9HSSgic2VlayB0byB0aW1lICVsbGQgdXMgPT4gc2FtcGxlIGF0IHRpbWUgJWxsZCB1cywgIgorICAgICAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUsCisgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CiAjZW5kaWYKIAotICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwpAQCAtNDYxMSw5ICs0NjcxLDE5IEBACiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmICghbUlzSEVJRikgeworICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1DdXJyZW50U2FtcGxlSW5kZXggOiBOVUxMLCAmb2Zmc2V0LCAmc2l6ZSk7CisKKyAgICAgICAgICAgIGN0cyA9IHN0dHMgPSAwOworICAgICAgICAgICAgaXNTeW5jU2FtcGxlID0gMDsKKyAgICAgICAgICAgIEFMT0dWKCJpbWFnZSBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNTE3MSw2ICs1MjQxLDcgQEAKIAogdm9pZCBNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzKCkgewogICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6cG9wdWxhdGVNZXRyaWNzIik7CisgICAgLy8gd3JpdGUgaW50byBtQW5hbHl0aWNzSXRlbQogfQogCiBzdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KApAQCAtNTE4Nyw3ICs1MjU4LDggQEAKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dlNiIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnZzYiLCA4KQogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBpc29tIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWICIsIDgpCiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00QSAiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBmNHYgIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwa2RkaSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00VlAiLCA4KSkgeworICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1pZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZWljIiwgOCkpIHsKICAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwogICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKIApAQCAtNTIxNiw2ICs1Mjg4LDggQEAKIAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCiAgICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAorICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDkzZDRmNTcuLjc3ODZjNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTQzMiw3ICs0MzIsNyBAQAogfTsKIAogTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGludCBmZCkgewotICAgIGluaXRJbnRlcm5hbChmZCk7CisgICAgaW5pdEludGVybmFsKGZkLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00NTEsMTkgKzQ1MSwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCkgewordm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbikgewogICAgIEFMT0dWKCJpbml0SW50ZXJuYWwiKTsKICAgICBtRmQgPSBkdXAoZmQpOwogICAgIG1OZXh0RmQgPSAtMTsKICAgICBtSW5pdENoZWNrID0gbUZkIDwgMD8gTk9fSU5JVDogT0s7Ci0gICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcgPSB0cnVlOwotICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCA9IHRydWU7Ci0gICAgbVVzZTMyQml0T2Zmc2V0ID0gdHJ1ZTsKLSAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IGZhbHNlOworCisgICAgbUludGVybGVhdmVEdXJhdGlvblVzID0gMTAwMDAwMDsKKworICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFsbDsKKyAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAtMTsKICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZCA9IGZhbHNlOwogICAgIG1TZW5kTm90aWZ5ID0gZmFsc2U7CisKKyAgICAvLyBSZXNldCBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBhbGwgdGhlIHNlc3Npb25zIGFuZCB0aGV5IHdpbGwgYmUKKyAgICAvLyBpbml0aWFsaXplZCBpbiBzdGFydChNZXRhRGF0YSAqcGFyYW0pLgorICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gdHJ1ZTsKKyAgICBtVXNlNEJ5dGVOYWxMZW5ndGggPSB0cnVlOworICAgIG1Vc2UzMkJpdE9mZnNldCA9IHRydWU7CiAgICAgbU9mZnNldCA9IDA7CiAgICAgbU1kYXRPZmZzZXQgPSAwOwogICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKQEAgLTQ3MiwxNyArNDc5LDIxIEBACiAgICAgbUZyZWVCb3hPZmZzZXQgPSAwOwogICAgIG1TdHJlYW1hYmxlRmlsZSA9IGZhbHNlOwogICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA9IDA7Ci0gICAgbU1vb3ZFeHRyYVNpemUgPSAwOwotICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDEwMDAwMDA7CiAgICAgbVRpbWVTY2FsZSA9IC0xOwotICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFsbDsKLSAgICBtTGF0aXR1ZGV4MTAwMDAgPSAwOwotICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAwOwotICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7Ci0gICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtTWV0YUtleXMgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICBhZGREZXZpY2VNZXRhKCk7CisKKyAgICAvLyBGb2xsb3dpbmcgdmFyaWFibGVzIG9ubHkgbmVlZCB0byBiZSBzZXQgZm9yIHRoZSBmaXJzdCByZWNvcmRpbmcgc2Vzc2lvbi4KKyAgICAvLyBBbmQgdGhleSB3aWxsIHN0YXkgdGhlIHNhbWUgZm9yIGFsbCB0aGUgcmVjb3JkaW5nIHNlc3Npb25zLgorICAgIGlmIChpc0ZpcnN0U2Vzc2lvbikgeworICAgICAgICBtTW9vdkV4dHJhU2l6ZSA9IDA7CisgICAgICAgIG1NZXRhS2V5cyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBhZGREZXZpY2VNZXRhKCk7CisgICAgICAgIG1MYXRpdHVkZXgxMDAwMCA9IDA7CisgICAgICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAwOworICAgICAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IGZhbHNlOworICAgIH0KKwogICAgIC8vIFZlcmlmeSBtRmQgaXMgc2Vla2FibGUKICAgICBvZmY2NF90IG9mZiA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX1NFVCk7CiAgICAgaWYgKG9mZiA8IDApIHsKQEAgLTg3MywxOSArODg0LDggQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnBhdXNlKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCppdCktPnBhdXNlKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIEFMT0dXKCJNUEVHNFdyaXRlcjogcGF1c2UgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6c3RvcFdyaXRlclRocmVhZCgpIHsKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAgICAgICAgICAgICBpbnQgZmQgPSBtTmV4dEZkOwogICAgICAgICAgICAgbU5leHRGZCA9IC0xOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBpbml0SW50ZXJuYWwoZmQpOworICAgICAgICAgICAgaW5pdEludGVybmFsKGZkLCBmYWxzZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogICAgICAgICAgICAgc3RhcnQobVN0YXJ0TWV0YS5nZXQoKSk7CiAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTkVYVF9PVVRQVVRfRklMRV9TVEFSVEVELCAwKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggYmQ3MTYzMi4uNzU5ZTQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTIzLDcgKzIzLDggQEAKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC03Miw2ICs3MywxMyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0NyeXB0byA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY3J5cHRvIjsgICAvKiAwLDEgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFbmNvZGVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsgLyogMCwxICovCiAKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNCeXRlc0luID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5ieXRlc2luIjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNQcm9maWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcm9maWxlIjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMZXZlbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGV2ZWwiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01heFdpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXh3aWR0aCI7ICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTWF4SGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXhoZWlnaHQiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0Vycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJjb2RlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFcnJvclN0YXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSI7CiAKIAogc3RhdGljIGludDY0X3QgZ2V0SWQoY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gJmNsaWVudCkgewpAQCAtNDI4LDIyICs0MzYsNiBAQAogfQogCiAvLyBzdGF0aWMKLXN0YXR1c190IE1lZGlhQ29kZWM6OlF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMgLyogbm9ubnVsbCAqLykgewotICAgIC8vIFRSSUNLWTogdGhpcyBtZXRob2QgaXMgdXNlZCBieSBNZWRpYUNvZGVjTGlzdC9JbmZvIGR1cmluZyBpdHMKLSAgICAvLyBpbml0aWFsaXphdGlvbi4gQXMgc3VjaCwgd2UgY2Fubm90IGNyZWF0ZSBhIE1lZGlhQ29kZWMgaW5zdGFuY2UKLSAgICAvLyBiZWNhdXNlIHRoYXQgcmVxdWlyZXMgYW4gaW5pdGlhbGl6ZWQgTWVkaWFDb2RlY0xpc3QuCi0KLSAgICBzcDxDb2RlY0Jhc2U+IGNvZGVjID0gR2V0Q29kZWNCYXNlKG5hbWUpOwotICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKG5hbWUsIG1pbWUsIGlzRW5jb2RlciwgY2Fwcyk7Ci19Ci0KLS8vIHN0YXRpYwogc3A8UGVyc2lzdGVudFN1cmZhY2U+IE1lZGlhQ29kZWM6OkNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKSB7CiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBpZiAoY2xpZW50LmNvbm5lY3QoKSAhPSBPSykgewpAQCAtNDc1LDYgKzQ2Nyw3IEBACiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtU3RpY2t5RXJyb3IoT0spLAogICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKKyAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAogICAgICAgbVJlc291cmNlTWFuYWdlckNsaWVudChuZXcgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KHRoaXMpKSwKICAgICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkocGlkKSksCiAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZChmYWxzZSksCkBAIC00OTMsNiArNDg2LDE4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVVpZCA9IHVpZDsKICAgICB9CisgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKK30KKworTWVkaWFDb2RlYzo6fk1lZGlhQ29kZWMoKSB7CisgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKKyAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOworCisgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7CisgICAgQ0hFQ0sobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCk7CiAgICAgLy8gc2V0IHVwIG91ciBuZXcgcmVjb3JkLCBnZXQgYSBzZXNzaW9uSUQsIHB1dCBpdCBpbnRvIHRoZSBpbi1wcm9ncmVzcyBsaXN0CiAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOwogICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CkBAIC01MDIsMTEgKzUwNyw5IEBACiAgICAgfQogfQogCi1NZWRpYUNvZGVjOjp+TWVkaWFDb2RlYygpIHsKLSAgICBDSEVDS19FUShtU3RhdGUsIFVOSU5JVElBTElaRUQpOwotICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShnZXRJZChtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KSk7Ci0KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCApIHsKK3ZvaWQgTWVkaWFDb2RlYzo6Zmx1c2hBbmFseXRpY3NJdGVtKCkgeworICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwpAQCAtNjk5LDEwICs3MDIsMjEgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKIAorICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IDA7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigicHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1Byb2ZpbGUsIHByb2ZpbGUpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgbGV2ZWwgPSAwOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0xldmVsLCBsZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobUlzVmlkZW8pIHsKICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJm1WaWRlb1dpZHRoKTsKICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZtVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKGtDb2RlY1JvdGF0aW9uLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZtUm90YXRpb25EZWdyZWVzKSkgewogICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgICAgIH0KIApAQCAtNzEwLDYgKzcyNCwxNCBAQAogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1dpZHRoLCBtVmlkZW9XaWR0aCk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjSGVpZ2h0LCBtVmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY1JvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY01heFdpZHRoLCBtYXhXaWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IG1heEhlaWdodCA9IDA7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNNYXhIZWlnaHQsIG1heEhlaWdodCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgpAQCAtMTQxNiw2ICsxNDM4LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE0MjMsNiArMTQ1MSwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBDT05GSUdVUkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE0NTksNiArMTQ5MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSgKQEAgLTE0ODcsNiArMTUyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTU5MSw2ICsxNjM0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGF1Z21lbnQgb3VyIG1lZGlhIG1ldHJpY3MgaW5mbywgbm93IHRoYXQgd2Uga25vdyBtb3JlIHRoaW5ncworICAgICAgICAgICAgICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29uZmlndXJlTXNnICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJlTXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IGluY2x1ZGVzOiBtaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI4MTYsNiArMjg3Miw5IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAgICAgICAgIGluZm8tPm1EYXRhLmNsZWFyKCk7CisgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+YWRkSW50NjQoa0NvZGVjQnl0ZXNJbiwgc2l6ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDFkY2JhMjkuLjQ2NTI1OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTI0LDE3ICsyNCwxNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTQyLDIwICs0MiwyMCBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZXhwYXQuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgTXV0ZXggc0luaXRNdXRleDsKK25hbWVzcGFjZSB7CiAKLXN0YXRpYyBib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyICpzKSB7Ci0gICAgaWYgKCFzdHJjYXNlY21wKHMsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAocywgInllcyIpIHx8ICFzdHJjYXNlY21wKHMsICJ5IikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNoYXIgKmVuZDsKLSAgICB1bnNpZ25lZCBsb25nIHJlcyA9IHN0cnRvdWwocywgJmVuZCwgMTApOwotICAgIHJldHVybiAqcyAhPSAnXDAnICYmICplbmQgPT0gJ1wwJyAmJiByZXMgPiAwOwotfQorTXV0ZXggc0luaXRNdXRleDsKIAotc3RhdGljIGJvb2wgaXNQcm9maWxpbmdOZWVkZWQoKSB7CitNdXRleCBzUmVtb3RlSW5pdE11dGV4OworCitjb25zdGV4cHIgY29uc3QgY2hhcioga1Byb2ZpbGluZ1Jlc3VsdHMgPQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoOworCitib29sIGlzUHJvZmlsaW5nTmVlZGVkKCkgewogICAgIGludDhfdCB2YWx1ZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5wcm9maWxlY29kZWMiLCAwKTsKICAgICBpZiAodmFsdWUgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03OCw2ICs3OCwxMCBAQAogICAgIHJldHVybiBwcm9maWxpbmdOZWVkZWQ7CiB9CiAKK09teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKwogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0OwogCkBAIC04Niw0MiArOTAsNDIgQEAKICAgICBBTE9HVigiRW50ZXIgcHJvZmlsZXJUaHJlYWRXcmFwcGVyLiIpOwogICAgIHJlbW92ZShrUHJvZmlsaW5nUmVzdWx0cyk7ICAvLyByZW1vdmUgcHJldmlvdXMgcmVzdWx0IHNvIHRoYXQgaXQgd29uJ3QgYmUgbG9hZGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgTWVkaWFDb2RlY0xpc3QKLSAgICBNZWRpYUNvZGVjTGlzdCAqY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCk7CisgICAgc3A8TWVkaWFDb2RlY0xpc3Q+IGNvZGVjTGlzdChuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcikpOwogICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CiAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNMaXN0LCBza2lwcGluZyBjb2RlYyBwcm9maWxpbmcuIik7Ci0gICAgICAgIGRlbGV0ZSBjb2RlY0xpc3Q7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBpbmZvczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvZGVjTGlzdC0+Y291bnRDb2RlY3MoKTsgKytpKSB7Ci0gICAgICAgIGluZm9zLnB1c2hfYmFjayhjb2RlY0xpc3QtPmdldENvZGVjSW5mbyhpKSk7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8mIGluZm9zID0gY29kZWNMaXN0LT5tQ29kZWNJbmZvczsKICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIHN0YXJ0ZWQuIik7Ci0gICAgcHJvZmlsZUNvZGVjcyhpbmZvcyk7CisgICAgcHJvZmlsZUNvZGVjcyhpbmZvcywga1Byb2ZpbGluZ1Jlc3VsdHMpOwogICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgY29tcGxldGVkLiIpOwotICAgIGNvZGVjTGlzdC0+cGFyc2VUb3BMZXZlbFhNTEZpbGUoa1Byb2ZpbGluZ1Jlc3VsdHMsIHRydWUgLyogaWdub3JlX2Vycm9ycyAqLyk7CisgICAgY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpOworICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcGFyc2UgcHJvZmlsaW5nIHJlc3VsdHMuIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOwogICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKIAotICAgIGlmIChzQ29kZWNMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgTWVkaWFDb2RlY0xpc3QgKmNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICBpZiAoc0NvZGVjTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcik7CiAgICAgICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CiAgICAgICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogCiAgICAgICAgICAgICBpZiAoaXNQcm9maWxpbmdOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgbmVlZGVkLCB3aWxsIGJlIHJ1biBpbiBzZXBhcmF0ZWQgdGhyZWFkLiIpOwogICAgICAgICAgICAgICAgIHB0aHJlYWRfdCBwcm9maWxlcjsKLSAgICAgICAgICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnByb2ZpbGVyLCBOVUxMLCBwcm9maWxlclRocmVhZFdyYXBwZXIsIE5VTEwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnByb2ZpbGVyLCBudWxscHRyLCBwcm9maWxlclRocmVhZFdyYXBwZXIsIG51bGxwdHIpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIGZvciBjb2RlYyBwcm9maWxpbmcuIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTM0LDggKzEzOCw2IEBACiAgICAgcmV0dXJuIHNDb2RlY0xpc3Q7CiB9CiAKLXN0YXRpYyBNdXRleCBzUmVtb3RlSW5pdE11dGV4OwotCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzUmVtb3RlTGlzdDsKIAogc3A8TWVkaWFDb2RlY0xpc3Q6OkJpbmRlckRlYXRoT2JzZXJ2ZXI+IE1lZGlhQ29kZWNMaXN0OjpzQmluZGVyRGVhdGhPYnNlcnZlcjsKQEAgLTE0OSwxOSArMTUxLDE5IEBACiAvLyBzdGF0aWMKIHNwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChzUmVtb3RlSW5pdE11dGV4KTsKLSAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgIGlmIChzUmVtb3RlTGlzdCA9PSBudWxscHRyKSB7CiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CiAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOwogICAgICAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgc1JlbW90ZUxpc3QgPSBzZXJ2aWNlLT5nZXRDb2RlY0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzUmVtb3RlTGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc1JlbW90ZUxpc3QgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNCaW5kZXJEZWF0aE9ic2VydmVyID0gbmV3IEJpbmRlckRlYXRoT2JzZXJ2ZXIoKTsKICAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNCaW5kZXJEZWF0aE9ic2VydmVyLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gaWYgZmFpbGVkIHRvIGdldCByZW1vdGUgbGlzdCwgY3JlYXRlIGxvY2FsIGxpc3QKICAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gZ2V0TG9jYWxJbnN0YW5jZSgpOwogICAgICAgICB9CkBAIC0xNjksMTc1ICsxNzEsMTEgQEAKICAgICByZXR1cm4gc1JlbW90ZUxpc3Q7CiB9CiAKLS8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KLXN0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQotICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMifTsKLXN0YXRpYyBjb25zdCBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDEyOAotCi1zdGF0aWMgYm9vbCBmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBjaGFyICpvdXRfcGF0aCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgewotICAgICAgICBzbnByaW50ZihvdXRfcGF0aCwKLSAgICAgICAgICAgICAgICAgTUVESUFfQ09ERUNTX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgIiVzLyVzIiwKLSAgICAgICAgICAgICAgICAga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgZmlsZV9uYW1lKTsKLSAgICAgICAgc3RydWN0IHN0YXQgZmlsZV9zdGF0OwotICAgICAgICBpZiAoc3RhdChvdXRfcGF0aCwgJmZpbGVfc3RhdCkgPT0gMCAmJiBTX0lTUkVHKGZpbGVfc3RhdC5zdF9tb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1NZWRpYUNvZGVjTGlzdDo6TWVkaWFDb2RlY0xpc3QoKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1VcGRhdGUoZmFsc2UpLAotICAgICAgbUdsb2JhbFNldHRpbmdzKG5ldyBBTWVzc2FnZSgpKSB7Ci0gICAgY2hhciBjb25maWdfZmlsZV9wYXRoW01FRElBX0NPREVDU19DT05GSUdfRklMRV9QQVRIX01BWF9MRU5HVEhdOwotICAgIGlmIChmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoIm1lZGlhX2NvZGVjcy54bWwiLCBjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoKTsKLSAgICB9Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoLCB0cnVlLyogaWdub3JlX2Vycm9ycyAqLyk7Ci0gICAgfQotICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlLyogaWdub3JlX2Vycm9ycyAqLyk7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKmNvZGVjc194bWwsIGJvb2wgaWdub3JlX2Vycm9ycykgewotICAgIC8vIGdldCBocmVmX2Jhc2UKLSAgICBjb25zdCBjaGFyICpocmVmX2Jhc2VfZW5kID0gc3RycmNocihjb2RlY3NfeG1sLCAnLycpOwotICAgIGlmIChocmVmX2Jhc2VfZW5kICE9IE5VTEwpIHsKLSAgICAgICAgbUhyZWZCYXNlID0gQVN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KLQotICAgIG1Jbml0Q2hlY2sgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQotICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgbURlcHRoID0gMDsKLQotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgbUluaXRDaGVjayA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOyAgLy8gdGhpcyBtYXkgZmFpbCBpZiBJTWVkaWFQbGF5ZXJTZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgfQotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiBwb2xpY2llczsKLSAgICBBU3RyaW5nIHZhbHVlOwotICAgIGlmIChtR2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoa1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MsICZ2YWx1ZSkpIHsKLSAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgodmFsdWUuY19zdHIoKSkpKTsKLSAgICB9Ci0gICAgaWYgKG1HbG9iYWxTZXR0aW5ncy0+ZmluZFN0cmluZyhrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMsICZ2YWx1ZSkpIHsKLSAgICAgICAgcG9saWNpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlLmNfc3RyKCkpKSk7Ci0gICAgfQotICAgIGlmIChwb2xpY2llcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7Ci0gICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNZWRpYUNvZGVjTGlzdDogZmFpbGVkIHRvIGdldCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLT5jb25maWcocG9saWNpZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOwotICAgICAgICBpZiAoaW5mby5tQ2Fwcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgLy8gTm8gdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50Pz8/Ci0gICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUgb2YgbWVkaWE/IiwKLSAgICAgICAgICAgICAgICAgIGluZm8ubU5hbWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIG1Db2RlY0luZm9zLnJlbW92ZUF0KGkpOwotI2lmIExPR19OREVCVUcgPT0gMAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChzaXplX3QgdHlwZV9peCA9IDA7IHR5cGVfaXggPCBpbmZvLm1DYXBzLnNpemUoKTsgKyt0eXBlX2l4KSB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lID0gaW5mby5tQ2Fwcy5rZXlBdCh0eXBlX2l4KTsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiAmY2FwcyA9IGluZm8ubUNhcHMudmFsdWVBdCh0eXBlX2l4KTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBjb2RlYyBpbmZvIGZvciAlczogJXMiLCBpbmZvLm1OYW1lLmNfc3RyKCksIG1pbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiICAgIGZsYWdzPSVkIiwgY2Fwcy0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNvbG9yRm9ybWF0czsKLSAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvckZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG5pY2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjb2xvckZvcm1hdHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChjb2xvckZvcm1hdHMuaXRlbUF0KGl4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBjb2xvcnM9WyVzXSIsIG5pY2UuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOwotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG5pY2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwcm9maWxlTGV2ZWxzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcGwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbHMuaXRlbUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKHBsLm1Qcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChwbC5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgbGV2ZWxzPVslc10iLCBuaWNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcXVpcmtzOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaW5mby5tUXVpcmtzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXJrcy5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWlya3MuYXBwZW5kKGluZm8ubVF1aXJrc1tpeF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgcXVpcmtzPVslc10iLCBxdWlya3MuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiAwCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lID0gaW5mby5tTmFtZTsKLSAgICAgICAgbGluZS5hcHBlbmQoIiBzdXBwb3J0cyAiKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtVHlwZXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gbVR5cGVzLnZhbHVlQXQoaik7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvLm1UeXBlcyAmICgxdWwgPDwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbGluZS5hcHBlbmQobVR5cGVzLmtleUF0KGopKTsKLSAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKLSAgICB9Ci0jZW5kaWYKK01lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKiBidWlsZGVyKSB7CisgICAgbUdsb2JhbFNldHRpbmdzID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlciB3cml0ZXIodGhpcyk7CisgICAgbUluaXRDaGVjayA9IGJ1aWxkZXItPmJ1aWxkTWVkaWFDb2RlY0xpc3QoJndyaXRlcik7CiB9CiAKIE1lZGlhQ29kZWNMaXN0Ojp+TWVkaWFDb2RlY0xpc3QoKSB7CkBAIC0zNDcsNTMxICsxODUsMjEgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKLQotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOwotICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKLSAgICBDSEVDSyhwYXJzZXIgIT0gTlVMTCk7Ci0KLSAgICA6OlhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHRoaXMpOwotICAgIDo6WE1MX1NldEVsZW1lbnRIYW5kbGVyKAotICAgICAgICAgICAgcGFyc2VyLCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlciwgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKTsKLQotICAgIGNvbnN0IGludCBCVUZGX1NJWkUgPSA1MTI7Ci0gICAgd2hpbGUgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgdm9pZCAqYnVmZiA9IDo6WE1MX0dldEJ1ZmZlcihwYXJzZXIsIEJVRkZfU0laRSk7Ci0gICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX0lPOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxfU3RhdHVzIHN0YXR1cyA9IDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBYTUxfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICA6OlhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Ci0KLSAgICBmY2xvc2UoZmlsZSk7Ci0gICAgZmlsZSA9IE5VTEw7CitNZWRpYUNvZGVjTGlzdFdyaXRlcjo6TWVkaWFDb2RlY0xpc3RXcml0ZXIoTWVkaWFDb2RlY0xpc3QqIGxpc3QpIDoKKyAgICBtTGlzdChsaXN0KSB7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjTGlzdDo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjTGlzdCAqPihtZSktPnN0YXJ0RWxlbWVudEhhbmRsZXIobmFtZSwgYXR0cnMpOwordm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIG1MaXN0LT5tR2xvYmFsU2V0dGluZ3MtPnNldFN0cmluZyhrZXksIHZhbHVlKTsKIH0KIAotLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjTGlzdCAqPihtZSktPmVuZEVsZW1lbnRIYW5kbGVyKG5hbWUpOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqaHJlZiA9IE5VTEw7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAiaHJlZiIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhyZWYgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMgYW5kIGZvciBzaW1wbGljaXR5LCBmaWxlIG5hbWVzIGNhbiBvbmx5IGNvbnRhaW4KLSAgICAvLyBbYS16QS1aMC05Xy5dIGFuZCBtdXN0IHN0YXJ0IHdpdGggIG1lZGlhX2NvZGVjc18gYW5kIGVuZCB3aXRoIC54bWwKLSAgICBmb3IgKGkgPSAwOyBocmVmW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICBpZiAoaHJlZltpXSA9PSAnLicgfHwgaHJlZltpXSA9PSAnXycgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnMCcgJiYgaHJlZltpXSA8PSAnOScpIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ0EnICYmIGhyZWZbaV0gPD0gJ1onKSB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdhJyAmJiBocmVmW2ldIDw9ICd6JykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIGZpbGVuYW1lID0gaHJlZjsKLSAgICBpZiAoIWZpbGVuYW1lLnN0YXJ0c1dpdGgoIm1lZGlhX2NvZGVjc18iKSB8fAotICAgICAgICAhZmlsZW5hbWUuZW5kc1dpdGgoIi54bWwiKSkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGZpbGVuYW1lLmluc2VydChtSHJlZkJhc2UsIDApOwotCi0gICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpzdGFydEVsZW1lbnRIYW5kbGVyKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBpblR5cGUgPSB0cnVlOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBtSW5pdENoZWNrID0gaW5jbHVkZVhNTEZpbGUoYXR0cnMpOwotICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wdXNoKG1DdXJyZW50U2VjdGlvbik7Ci0gICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7Ci0gICAgICAgIH0KLSAgICAgICAgKyttRGVwdGg7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fVE9QTEVWRUw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5nIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPQotICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXModHJ1ZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1aXJrIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkUXVpcmsoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5UeXBlID0gZmFsc2U7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKLSAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYgIW1DdXJyZW50SW5mby0+bUhhc1NvbGVNaW1lOwotICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikgfHwgIXN0cmNtcChuYW1lLCAiRmVhdHVyZSIpKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiTGltaXQiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRMaW1pdChhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRGZWF0dXJlKGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgICsrbURlcHRoOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7OwotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7Ci0gICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC0tbURlcHRoOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBpZiAobVVwZGF0ZSAhPSBtR2xvYmFsU2V0dGluZ3MtPmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1HbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKG5hbWUsIHZhbHVlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OnNldEN1cnJlbnRDb2RlY0luZm8oYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoQVN0cmluZyhuYW1lKSA9PSBtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCkpIHsKLSAgICAgICAgICAgIGlmIChtQ29kZWNJbmZvc1tpXS0+Z2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3ZlcnJpZGVzIHdpdGggYW4gdW5leHBlY3RlZCBtaW1lICVzIiwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIChidXQgZG9uJ3QgYWRkIGl0IHRvIG1Db2RlY0luZm9zKSB0byBob2xkIHRoZQotICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB3ZSBkb24ndCB3YW50LgotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUodHlwZSk7ICAvLyB0byBzZXQgdGhlIGN1cnJlbnQgY2FwCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOwotICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKLSAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgotICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZwotICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCi0gICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKLSAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidHlwZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gTlVMTCkgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7Ci0gICAgc3NpemVfdCBpbmRleCA9IC0xOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKEFTdHJpbmcobmFtZSkgPT0gbUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1VcGRhdGUgIT0gKGluZGV4ID49IDApKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIC8vIGV4aXN0aW5nIGNvZGVjCi0gICAgICAgIG1DdXJyZW50SW5mbyA9IG1Db2RlY0luZm9zLmVkaXRJdGVtQXQoaW5kZXgpOwotICAgICAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBleGlzdGluZyB0eXBlCi0gICAgICAgICAgICBpZiAobUNvZGVjSW5mb3NbaW5kZXhdLT5nZXRDYXBhYmlsaXRpZXNGb3IodHlwZSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT51cGRhdGVNaW1lKHR5cGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbmV3IGNvZGVjCi0gICAgICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQotICAgICAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgotICAgICAgICAvLyBIb3dldmVyLCBrZWVwIG1DdXJyZW50SW5mbyBvYmplY3QgYXJvdW5kIHVudGlsIHBhcnNpbmcKLSAgICAgICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KLSAgICAgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKLSAgICAgICAgICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhtQ3VycmVudEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQUxPR1YoImluaXRpYWxpemVDYXBhYmlsaXRpZXMgJXM6JXMiLAotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLCB0eXBlKTsKLQotICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHM7Ci0gICAgc3RhdHVzX3QgZXJyID0gTWVkaWFDb2RlYzo6UXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLAotICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bUlzRW5jb2RlciwKLSAgICAgICAgICAgICZjYXBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIGlmIChjYXBzID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIk1lZGlhQ29kZWM6OlF1ZXJ5Q2FwYWJpbGl0aWVzIHJldHVybmVkIE9LIGJ1dCBubyBjYXBhYmlsaXRpZXMgZm9yICclcyc6JyVzJzonJXMnIiwKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLmNfc3RyKCksIHR5cGUsCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tSXNFbmNvZGVyID8gImVuY29kZXIiIDogImRlY29kZXIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1DdXJyZW50SW5mby0+aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjYXBzKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1DdXJyZW50SW5mby0+YWRkUXVpcmsobmFtZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBib29sIGlzRXhpc3RpbmdUeXBlID0gKG1DdXJyZW50SW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG5hbWUpICE9IE5VTEwpOwotICAgIGlmIChtVXBkYXRlICE9IGlzRXhpc3RpbmdUeXBlKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0YXR1c190IHJldDsKLSAgICBpZiAobVVwZGF0ZSkgewotICAgICAgICByZXQgPSBtQ3VycmVudEluZm8tPnVwZGF0ZU1pbWUobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUN1cnJlbnRJbmZvLT5hZGRNaW1lKG5hbWUpOwotICAgIH0KLQotICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5Ci0gICAgLy8gZmFpbC4gIEhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgKGJ5IG5vdCByZXBvcnRpbmcgc3VjaCBtaW1lKS4KLSAgICBpZiAoIW1VcGRhdGUgJiYgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgewotICAgICAgICBtQ3VycmVudEluZm8tPnJlbW92ZU1pbWUobmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKK3N0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZE1lZGlhQ29kZWNJbmZvKCkgeworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKCk7CisgICAgbUxpc3QtPm1Db2RlY0luZm9zLnB1c2hfYmFjayhpbmZvKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPigKKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CiB9CiAKIC8vIGxlZ2FjeSBtZXRob2QgZm9yIG5vbi1hZHZhbmNlZCBjb2RlY3MKQEAgLTg4MiwxNSArMjEwLDE1IEBACiAgICAgICAgICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwKICAgICB9OwogCi0gICAgc2l6ZV90IG51bUNvZGVjcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKLSAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjczsgKytzdGFydEluZGV4KSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KS5nZXQoKTsKKyAgICBzaXplX3QgbnVtQ29kZWNJbmZvcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKKyAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjSW5mb3M7ICsrc3RhcnRJbmRleCkgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvc1tzdGFydEluZGV4XTsKIAogICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSAhPSBlbmNvZGVyKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBhYmlsaXRpZXMgPSBpbmZvLmdldENhcGFiaWxpdGllc0Zvcih0eXBlKTsKLSAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZkZXRhaWxzID0gY2FwYWJpbGl0aWVzLT5nZXREZXRhaWxzKCk7CkBAIC05MTMsMjIzICsyNDEsOSBAQAogICAgIHJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGJvb2wgZm91bmQgPSB0cnVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCAlcyclcycgYXR0cmlidXRlIiwgbmFtZS5jX3N0cigpLAotICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgbGltaXRFcnJvcihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUuY19zdHIoKSwgbXNnKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIGF0dHIsIHZhbHVlLmNfc3RyKCkpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCi0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImRlZmF1bHQiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJpbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1heCIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1pbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2VzIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAic2NhbGUiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZyhhdHRyc1tpXSwgYXR0cnNbaSArIDFdKTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIG5hbWU7Ci0gICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm5hbWUiLCAmbmFtZSkpIHsKLSAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCi0gICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCi0gICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQotICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAotICAgIGJvb2wgZm91bmQ7Ci0KLSAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIiB8fCBuYW1lID09ICJiaXRyYXRlIiB8fCBuYW1lID09ICJibG9jay1jb3VudCIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gImJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lID09ICJjb21wbGV4aXR5IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiZnJhbWUtcmF0ZSIgfHwgbmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAic2l6ZSIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lLnN0YXJ0c1dpdGgoIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKLSAgICAgICAgQVN0cmluZyBtaW4sIG1heDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZygibWluIiwgJm1pbikgJiYgbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkgewotICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOwotICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikgfHwgbXNnLT5jb250YWlucygidmFsdWUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgJ21pbicgYW5kICdtYXgnIGFzIHdlbGwgYXMgJ3JhbmdlJyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpIHx8IG1zZy0+Y29udGFpbnMoIm1heCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIG9ubHkgJ21pbicgb3IgJ21heCcgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZtYXgpKSB7Ci0gICAgICAgICAgICBtaW4gPSBtYXg7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7Ci0gICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgYm90aCAncmFuZ2UnIGFuZCAndmFsdWUnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIHJhbmdlLCBzY2FsZSA9ICJsaW5lYXIiLCBkZWYsIGluXzsKLSAgICAgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoInJhbmdlIiwgJnJhbmdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgIndpdGggbm8gJ3JhbmdlJywgJ3ZhbHVlJyBvciAnbWluJy8nbWF4JyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJkZWZhdWx0IiwgJmRlZikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0IiwgZm91bmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lICE9ICJxdWFsaXR5IiAmJiBtc2ctPmZpbmRTdHJpbmcoInNjYWxlIiwgJnNjYWxlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIF4gKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJpbiIsICZpbl8pKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgewotICAgICAgICAgICAgaWYgKCEoaW5fID09ICJwaXhlbHMiKSAmJiAhKGluXyA9PSAiYmxvY2tzIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRJbnZhbGlkQXR0cihuYW1lLCAiaW4iLCBpbl8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5fLmVyYXNlKDUsIDEpOyAvLyAocGl4ZWx8YmxvY2spLWFzcGVjdC1yYXRpbwotICAgICAgICAgICAgaW5fLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgaW5fLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG5hbWUgPSBpbl87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCgicXVhbGl0eS1zY2FsZSIsIHNjYWxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQoIi1kZWZhdWx0Iik7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIGRlZik7Ci0gICAgICAgIH0KLSAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2UiKTsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCByYW5nZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVN0cmluZyBtYXgsIHZhbHVlLCByYW5nZXM7Ci0gICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJpbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJjaGFubmVsLWNvdW50IiB8fCBuYW1lID09ICJjb25jdXJyZW50LWluc3RhbmNlcyIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtaW4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZSIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJzYW1wbGUtcmF0ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInJhbmdlcyIsICZyYW5nZXMpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2VzIiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInNjYWxlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImFsaWdubWVudCIgfHwgbmFtZSA9PSAiYmxvY2stc2l6ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJnZhbHVlKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInZhbHVlIiwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heC5zaXplKCkpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gIm1heC0iOwotICAgICAgICAgICAgdGFnLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgbWF4KTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChyYW5nZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2VzIik7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0ICclcyciLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGludDMyX3Qgb3B0aW9uYWwgPSAtMTsKLSAgICBpbnQzMl90IHJlcXVpcmVkID0gLTE7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOwotCi0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpcGFyc2VCb29sZWFuKGF0dHJzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25hbCA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkICYmIG9wdGlvbmFsICE9IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoKG9wdGlvbmFsICE9IC0xIHx8IHJlcXVpcmVkICE9IC0xKSAmJiAodmFsdWUgIT0gTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBoYXMgYm90aCBhIHZhbHVlIGFuZCBvcHRpb25hbC9yZXF1aXJlZCBhdHRyaWJ1dGUiLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGRGZWF0dXJlKG5hbWUsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ3VycmVudEluZm8tPmFkZEZlYXR1cmUobmFtZSwgKHJlcXVpcmVkID09IDEpIHx8IChvcHRpb25hbCA9PSAwKSk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQogc3NpemVfdCBNZWRpYUNvZGVjTGlzdDo6ZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKLQotICAgICAgICBpZiAoaW5mby5tTmFtZSA9PSBuYW1lKSB7CisgICAgICAgIGlmIChzdHJjbXAobUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQogICAgIH0KQEAgLTExNjcsMTEgKzI4MSwxNSBAQAogCiAvL3N0YXRpYwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHVpbnQzMl90IGZsYWdzLCBWZWN0b3I8QVN0cmluZz4gKm1hdGNoZXMpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGVzLCBWZWN0b3I8QVN0cmluZz4gKm93bmVycykgewogICAgIG1hdGNoZXMtPmNsZWFyKCk7CisgICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7CisgICAgICAgIG93bmVycy0+Y2xlYXIoKTsKKyAgICB9CiAKICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBnZXRJbnN0YW5jZSgpOwotICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICBpZiAobGlzdCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTExODcsNDUgKzMwNSwyNyBAQAogICAgICAgICBpbmRleCA9IG1hdGNoSW5kZXggKyAxOwogCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKG1hdGNoSW5kZXgpOwotICAgICAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICAgICBDSEVDSyhpbmZvICE9IG51bGxwdHIpOwogICAgICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKIAogICAgICAgICBpZiAoKGZsYWdzICYga0hhcmR3YXJlQ29kZWNzT25seSkgJiYgaXNTb2Z0d2FyZUNvZGVjKGNvbXBvbmVudE5hbWUpKSB7CiAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgU1cgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtYXRjaGVzLT5wdXNoKGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgb3duZXJzLT5wdXNoKEFTdHJpbmcoaW5mby0+Z2V0T3duZXJOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmbGFncyAmIGtQcmVmZXJTb2Z0d2FyZUNvZGVjcyB8fCBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuc3djb2RlYyIsIGZhbHNlKSkgeworICAgIGlmIChmbGFncyAmIGtQcmVmZXJTb2Z0d2FyZUNvZGVjcyB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LnN3Y29kZWMiLCBmYWxzZSkpIHsKICAgICAgICAgbWF0Y2hlcy0+c29ydChjb21wYXJlU29mdHdhcmVDb2RlY3NGaXJzdCk7CiAgICAgfQogfQogCi0vLyBzdGF0aWMKLXVpbnQzMl90IE1lZGlhQ29kZWNMaXN0OjpnZXRRdWlya3NGb3IoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewotICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IGdldEluc3RhbmNlKCk7Ci0gICAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGl4ID0gbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChpeCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaXgpOwotCi0gICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKLSAgICAgICAgcXVpcmtzIHw9IEFDb2RlYzo6a1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7Ci0gICAgfQotICAgIGlmIChpbmZvLT5oYXNRdWlyaygicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikpIHsKLSAgICAgICAgcXVpcmtzIHw9IEFDb2RlYzo6a1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwotICAgIH0KLQotICAgIHJldHVybiBxdWlya3M7CitNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjp+TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSgpIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAppbmRleCAwOTVmYzZhLi42OTIwZTUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0zMyw4ICszMyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHMgPSAiL2RhdGEvbWlzYy9tZWRpYS9tZWRpYV9jb2RlY3NfcHJvZmlsaW5nX3Jlc3VsdHMueG1sIjsKLQogQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCkgewogICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaWYgKHByb3BlcnR5X2dldCgicm8uYnVpbGQuZGlzcGxheS5pZCIsIHZhbCwgTlVMTCkgJiYgKHN0cmxlbih2YWwpID4gMCkpIHsKQEAgLTIwNSwyNCArMjAzLDI0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MpIHsKK3ZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0cykgewogICAgIENvZGVjU2V0dGluZ3MgZ2xvYmFsX3Jlc3VsdHM7CiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZW5jb2Rlcl9yZXN1bHRzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRlY29kZXJfcmVzdWx0czsKICAgICBwcm9maWxlQ29kZWNzKGluZm9zLCAmZ2xvYmFsX3Jlc3VsdHMsICZlbmNvZGVyX3Jlc3VsdHMsICZkZWNvZGVyX3Jlc3VsdHMpOwotICAgIGV4cG9ydFJlc3VsdHNUb1hNTChrUHJvZmlsaW5nUmVzdWx0cywgZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cywgZGVjb2Rlcl9yZXN1bHRzKTsKKyAgICBleHBvcnRSZXN1bHRzVG9YTUwocHJvZmlsaW5nUmVzdWx0cywgZ2xvYmFsX3Jlc3VsdHMsIGVuY29kZXJfcmVzdWx0cywgZGVjb2Rlcl9yZXN1bHRzKTsKIH0KIAogdm9pZCBwcm9maWxlQ29kZWNzKAotICAgICAgICBjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAogICAgICAgICBDb2RlY1NldHRpbmdzICpnbG9iYWxfcmVzdWx0cywKICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmVuY29kZXJfcmVzdWx0cywKICAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gKmRlY29kZXJfcmVzdWx0cywKICAgICAgICAgYm9vbCBmb3JjZVRvTWVhc3VyZSkgewogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+PiBjb2RlY3NOZWVkTWVhc3VyZTsKICAgICBBU3RyaW5nIHN1cHBvcnRNdWx0aXBsZVNlY3VyZUNvZGVjcyA9ICJ0cnVlIjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gaW5mb3NbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBpbmZvIDogaW5mb3MpIHsKICAgICAgICAgQVN0cmluZyBuYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIikgfHwKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWVuYWJsZSBiZWxvdyBjb2RlY3Mgb25jZSBmaXhlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKaW5kZXggZDRiYjIyNS4uNGY4YzJmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCkBAIC0yMywxMiArMjMsMTAgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1leHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1ZlcnNpb25TdHJpbmc7Ci1leHRlcm4gY29uc3QgY2hhciAqa1Byb2ZpbGluZ1Jlc3VsdHM7Ci0KIHN0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIAogQVN0cmluZyBnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCk7CkBAIC0zNiwxMSArMzQsMTIgQEAKIGJvb2wgc3BsaXRTdHJpbmcoY29uc3QgQVN0cmluZyAmcywgY29uc3QgQVN0cmluZyAmZGVsaW1pdGVyLCBBU3RyaW5nICpzMSwgQVN0cmluZyAqczIpOwogCiAvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIHhtbCBmaWxlIG5hbWVkIGtQcm9maWxpbmdSZXN1bHRzLgotdm9pZCBwcm9maWxlQ29kZWNzKGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcyk7Cit2b2lkIHByb2ZpbGVDb2RlY3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHMpOwogCiAvLyBwcm9maWxlIGNvZGVjcyBhbmQgc2F2ZSB0aGUgcmVzdWx0IHRvIGdsb2JhbF9yZXN1bHRzLCBlbmNvZGVyX3Jlc3VsdHMgYW5kIGRlY29kZXJfcmVzdWx0cy4KIHZvaWQgcHJvZmlsZUNvZGVjcygKLSAgICAgICAgY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKICAgICAgICAgQ29kZWNTZXR0aW5ncyAqZ2xvYmFsX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICplbmNvZGVyX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICpkZWNvZGVyX3Jlc3VsdHMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDUxZjFiYTMuLjY0MGNiODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdU1lZGlhRXh0cmFjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODMsOCArODIsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTExOSw4ICsxMTgsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTE0OSw4ICsxNDgsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgaWYgKG1DYXMgIT0gTlVMTCkgewotICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhcyk7CisgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgeworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKICAgICB9CiAKICAgICBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKQEAgLTE2MSwyNCArMTYwLDM2IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhczogY2FzPSVwIiwgY2FzLmdldCgpKTsKK3N0YXRpYyBTdHJpbmc4IGFycmF5VG9TdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFycmF5KSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4ICIsIGFycmF5W2ldKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKKyAgICBBTE9HVigic2V0TWVkaWFDYXM6IGNhc1Rva2VuPXslc30iLCBhcnJheVRvU3RyaW5nKGNhc1Rva2VuKS5jX3N0cigpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAoY2FzID09IE5VTEwpIHsKKyAgICBpZiAoY2FzVG9rZW4uZW1wdHkoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIG1DYXNUb2tlbiA9IGNhc1Rva2VuOworCiAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKGNhcyk7CisgICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhjYXNUb2tlbik7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUNhcyA9IGNhczsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IDVmOWFhMDEuLjVmNTBlNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtMzgsNyArMzgsNyBAQAogfQogCiBzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3QoKSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobnVsbHB0cik7CisgICAgcmV0dXJuIGNvbm5lY3QoImRlZmF1bHQiLCBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGJvb2wqIHRyZWJsZUZsYWcpIHsKQEAgLTU0LDYgKzU0LDE5IEBACiAgICAgcmV0dXJuIGNvbm5lY3RMZWdhY3koKTsKIH0KIAorc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcpIHsKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7CisgICAgICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICp0cmVibGVGbGFnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29ubmVjdFRyZWJsZShuYW1lKTsKKyAgICB9CisgICAgaWYgKHRyZWJsZUZsYWcgIT0gbnVsbHB0cikgeworICAgICAgICAqdHJlYmxlRmxhZyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY29ubmVjdExlZ2FjeSgpOworfQorCiBzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3RMZWdhY3koKSB7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHNwPElCaW5kZXI+IGNvZGVjYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOwpAQCAtNzMsOSArODYsMTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdFRyZWJsZSgpIHsKK3N0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdFRyZWJsZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoImRlZmF1bHQiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIG5hbWUgPSAiZGVmYXVsdCI7CisgICAgfQorICAgIHNwPElPbXg+IHRPbXggPSBJT214OjpnZXRTZXJ2aWNlKG5hbWUpOwogICAgIGlmICh0T214LmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gVHJlYmxlIElPbXguIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTdhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9teEluZm9CdWlsZGVyIgorCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICBjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgeworICAgIHNwPEFDb2RlYz4gY29kZWMgPSBuZXcgQUNvZGVjKCk7CisgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWltZSwgaXNFbmNvZGVyLCBjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAorICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgorICAgICAgICBpZiAoKGF0dHJpYnV0ZS5rZXkuY29tcGFyZSgwLCA4LCAiZmVhdHVyZS0iKSA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChhdHRyaWJ1dGUua2V5LmNvbXBhcmUoOCwgMTUsICJiaXRyYXRlLW1vZGVzIikKKyAgICAgICAgICAgICAgICAgIT0gMCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlLmtleSBpcyBhIGZlYXR1cmUgdGhhdCBpcyBub3QgYSBiaXRyYXRlCisgICAgICAgICAgICAvLyBjb250cm9sLCBhZGQgYW4gaW50MzIgdmFsdWUuCisgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID09ICIxIiA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vbi1mZWF0dXJlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbCgKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleS5jX3N0cigpLCBhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitPbXhJbmZvQnVpbGRlcjo6T214SW5mb0J1aWxkZXIoKSB7Cit9CisKK3N0YXR1c190IE9teEluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKKyAgICBib29sIHRyZWJsZTsKKyAgICBzcDxJT01YPiBvbXg7CisgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpSb2xlSW5mbz4gcm9sZXM7CisKKyAgICB0cmVibGUgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSk7CisgICAgaWYgKHRyZWJsZSkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisgICAgICAgIC8vIE9idGFpbiBJT214U3RvcmUKKyAgICAgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IElPbXhTdG9yZTo6Z2V0U2VydmljZSgpOworICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25uZWN0IHRvIGFuIElPbXhTdG9yZSBpbnN0YW5jZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGlzdCBzZXJ2aWNlIGF0dHJpYnV0ZXMgKGdsb2JhbCBzZXR0aW5ncykKKyAgICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgICAgaGlkbF92ZWM8SU9teFN0b3JlOjpTZXJ2aWNlQXR0cmlidXRlPiBzZXJ2aWNlQXR0cmlidXRlczsKKyAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG9teFN0b3JlLT5saXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzZXJ2aWNlQXR0cmlidXRlc10KKyAgICAgICAgICAgICAgICAoU3RhdHVzIGluU3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxJT214U3RvcmU6OlNlcnZpY2VBdHRyaWJ1dGU+JgorICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQXR0cmlidXRlcyA9IGluQXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBnbG9iYWwgc2V0dGluZ3MgZnJvbSBJT214U3RvcmUuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJJT214U3RvcmUgcmVwb3J0cyBwYXJzaW5nIGVycm9yLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwIDogc2VydmljZUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgcC5rZXkuY19zdHIoKSwgcC52YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgcm9sZXMgYW5kIGNvbnZlcnQgdG8gSU9NWFN0b3JlJ3MgZm9ybWF0CisgICAgICAgIHRyYW5zU3RhdHVzID0gb214U3RvcmUtPmxpc3RSb2xlcygKKyAgICAgICAgICAgICAgICBbJnJvbGVzXQorICAgICAgICAgICAgICAgIChjb25zdCBoaWRsX3ZlYzxJT214U3RvcmU6OlJvbGVJbmZvPiYgaW5Sb2xlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICByb2xlcy5yZXNlcnZlKGluUm9sZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpblJvbGUgOiBpblJvbGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJT01YU3RvcmU6OlJvbGVJbmZvIHJvbGU7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnJvbGUgPSBpblJvbGUucm9sZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUudHlwZSA9IGluUm9sZS50eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5pc0VuY29kZXIgPSBpblJvbGUuaXNFbmNvZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gaW5Sb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJT01YU3RvcmU6Ok5vZGVJbmZvPiYgbm9kZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLm5vZGVzOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucmVzZXJ2ZShpblJvbGUubm9kZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Ob2RlIDogaW5Sb2xlLm5vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9NWFN0b3JlOjpOb2RlSW5mbyBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IGluTm9kZS5uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUub3duZXIgPSBpbk5vZGUub3duZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpBdHRyaWJ1dGU+JiBhdHRyaWJ1dGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnJlc2VydmUoaW5Ob2RlLmF0dHJpYnV0ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluQXR0ciA6IGluTm9kZS5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTVhTdG9yZTo6QXR0cmlidXRlIGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIua2V5ID0gaW5BdHRyLmtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IGluQXR0ci52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soc3RkOjptb3ZlKGF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShub2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHJvbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGNvZGVjIHJvbGVzIGZyb20gSU9teFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBPYnRhaW4gSU9NWFN0b3JlCisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHNtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIHRoZSBkZWZhdWx0IHNlcnZpY2UgbWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIHNwPElCaW5kZXI+IGNvZGVjQmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOworICAgICAgICBpZiAoY29kZWNCaW5kZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gdGhlIG1lZGlhIGNvZGVjIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBzcDxJTWVkaWFDb2RlY1NlcnZpY2U+IGNvZGVjU2VydmljZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ29kZWNTZXJ2aWNlPihjb2RlY0JpbmRlcik7CisgICAgICAgIGlmIChjb2RlY1NlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIHR5cGUgb2YgbWVkaWEgY29kZWMgc2VydmljZSBvYnRhaW5lZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIG9teCA9IGNvZGVjU2VydmljZS0+Z2V0T01YKCk7CisgICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25uZWN0IHRvIGFuIElPTVggaW5zdGFuY2UuIik7CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWFN0b3JlPiBvbXhTdG9yZSA9IGNvZGVjU2VydmljZS0+Z2V0T01YU3RvcmUoKTsKKyAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT01YU3RvcmUgaW5zdGFuY2UuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgc2VydmljZSBhdHRyaWJ1dGVzIChnbG9iYWwgc2V0dGluZ3MpCisgICAgICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6QXR0cmlidXRlPiBzZXJ2aWNlQXR0cmlidXRlczsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb214U3RvcmUtPmxpc3RTZXJ2aWNlQXR0cmlidXRlcygmc2VydmljZUF0dHJpYnV0ZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gZ2xvYmFsIHNldHRpbmdzIGZyb20gSU9NWFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwIDogc2VydmljZUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgcC5rZXkuY19zdHIoKSwgcC52YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgcm9sZXMKKyAgICAgICAgc3RhdHVzID0gb214U3RvcmUtPmxpc3RSb2xlcygmcm9sZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gY29kZWMgcm9sZXMgZnJvbSBJT01YU3RvcmUuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnZlcnQgcm9sZXMgdG8gbGlzdHMgb2YgY29kZWNzCisKKyAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gc3dDb2RlY3MKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiA+CisgICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvOworICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBod0NvZGVjcworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+ID4KKyAgICAgICAgICAgIGh3Q29kZWNOYW1lMkluZm87CisgICAgLy8gb3duZXIgbmFtZSAtPiBNZWRpYUNvZGVjSW5mbworICAgIC8vIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgSU9teCBzZXJ2aWNlKHMpIG5lZWRlZCBmb3IKKyAgICAvLyBjcmVhdGluZyBJT214Tm9kZSBpbnN0YW5jZXMgYW5kIHF1ZXJ5aW5nIGNhcGFiaWxpdGllcy4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gPgorICAgICAgICAgICAgb3duZXIyQ29kZWNJbmZvOworCisgICAgZm9yIChjb25zdCBhdXRvJiByb2xlIDogcm9sZXMpIHsKKyAgICAgICAgY29uc3QgYXV0byYgdHlwZU5hbWUgPSByb2xlLnR5cGU7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyID0gcm9sZS5pc0VuY29kZXI7CisgICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlczsKKyAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCBoYXJkd2FyZSBub2RlcyBtdXN0IGJlIGFkZGVkIGFmdGVyCisgICAgICAgIC8vIHBsYXRmb3JtIChzb2Z0d2FyZSkgbm9kZXMuIGh3Q29kZWNzIGlzIHVzZWQgdG8gaG9sZCBoYXJkd2FyZSBub2RlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgYWZ0ZXIgc29mdHdhcmUgbm9kZXMgZm9yIHRoZSBzYW1lIHJvbGUuCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElPTVhTdG9yZTo6Tm9kZUluZm8qPiBod0NvZGVjczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogcm9sZS5ub2RlcykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgbm9kZU5hbWUgPSBub2RlLm5hbWU7CisgICAgICAgICAgICBib29sIGlzU29mdHdhcmUgPSBub2RlTmFtZS5jb21wYXJlKDAsIDEwLCAiT01YLmdvb2dsZSIpID09IDA7CisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgIGlmIChpc1NvZnR3YXJlKSB7CisgICAgICAgICAgICAgICAgYXV0byBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gc3dDb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCisgICAgICAgICAgICAgICAgICAgIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZlclBsYXRmb3JtTm9kZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgdGhpcyBub2RlIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkIGFmdGVyIGFsbCBzb2Z0d2FyZSBub2Rlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGh3Q29kZWNzLnB1c2hfYmFjaygmbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgICAgICBub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCisgICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQorICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgorICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogaHdDb2RlY3MpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBub2RlTmFtZSA9IG5vZGUtPm5hbWU7CisgICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCisgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLT5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgKm5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgc29mdHdhcmUgY29kZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGYwYzI3YWMuLjRmZjJiZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTg1LDcgKzg1LDggQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICAvLyBjb3VsZG4ndCBvcGVuIGl0IGxvY2FsbHksIG1heWJlIHRoZSBtZWRpYSBzZXJ2ZXIgY2FuPwotICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpOworICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbnVsbFNlcnZpY2U7CisgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobnVsbFNlcnZpY2UsIHBhdGgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmQsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmTCk7CiAgICAgICAgIGNsb3NlKGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMDNkYzlkZi4uZThjM2RkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTYwLDYgKzYwLDEyIEBACiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjp+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIHsKICAgICBBTE9HVigiflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwogICAgIGNsZWFyTWV0YWRhdGEoKTsKKyAgICAvLyBFeHBsaWNpdGx5IHJlbGVhc2UgZXh0cmFjdG9yIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhlIGRlc3RydWN0b3IsCisgICAgLy8gc29tZSBleHRyYWN0b3JzIG1pZ2h0IG5lZWQgdG8gY2FsbGJhY2sgdG8gY2xvc2Ugb2ZmIHRoZSBEYXRhU291cmNlCisgICAgLy8gYW5kIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0J3Mgc3RpbGwgdGhlcmUuCisgICAgaWYgKG1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBtRXh0cmFjdG9yLT5yZWxlYXNlKCk7CisgICAgfQogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+Y2xvc2UoKTsKICAgICB9CkBAIC0xMjEsMTIgKzEyNywxMiBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKSB7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShEYXRhU291cmNlKSIpOwogCiAgICAgY2xlYXJNZXRhZGF0YSgpOwogICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSk7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSwgbWltZSk7CiAKICAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgYSBNZWRpYUV4dHJhY3Rvci4iKTsKQEAgLTEzNywxNyArMTQzLDE3MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdGljIFZpZGVvRnJhbWUgKmFsbG9jVmlkZW9GcmFtZSgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGJwcCwgYm9vbCBtZXRhT25seSkgeworICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKKyAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CisgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmljY0RhdGE7CisgICAgc2l6ZV90IGljY1NpemU7CisgICAgaWYgKCF0cmFja01ldGEtPmZpbmREYXRhKGtLZXlJY2NQcm9maWxlLCAmdHlwZSwgJmljY0RhdGEsICZpY2NTaXplKSl7CisgICAgICAgIGljY0RhdGEgPSBOVUxMOworICAgICAgICBpY2NTaXplID0gMDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnNhckhlaWdodCkKKyAgICAgICAgICAgICYmIHNhckhlaWdodCAhPSAwKSB7CisgICAgICAgIGRpc3BsYXlXaWR0aCA9ICh3aWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIGRpc3BsYXlXaWR0aCA+IDAgJiYgZGlzcGxheUhlaWdodCA+IDAKKyAgICAgICAgICAgICAgICAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICBBTE9HVigiZm91bmQgZGlzcGxheSBzaXplICVkeCVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFZpZGVvRnJhbWUod2lkdGgsIGhlaWdodCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgcm90YXRpb25BbmdsZSwgYnBwLCAhbWV0YU9ubHksIGljY0RhdGEsIGljY1NpemUpOworfQorCitzdGF0aWMgYm9vbCBnZXREc3RDb2xvckZvcm1hdChhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGNvbG9yRm9ybWF0LAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAqb214Q29sb3JGb3JtYXQsIGludDMyX3QgKmJwcCkgeworICAgIHN3aXRjaCAoY29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKKyAgICAgICAgICAgICpicHAgPSAyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICAgICAgeworICAgICAgICAgICAgKm9teENvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisgICAgICAgICAgICAqYnBwID0gNDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgICAgICAgICAgKmJwcCA9IDQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0OiAlZCIsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIFZpZGVvRnJhbWUgKmV4dHJhY3RWaWRlb0ZyYW1lKAogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLAogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLAotICAgICAgICBpbnQgc2Vla01vZGUpIHsKLQorICAgICAgICBpbnQgc2Vla01vZGUsCisgICAgICAgIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgYm9vbCBtZXRhT25seSkgewogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwogCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU+KHNlZWtNb2RlKTsKKyAgICBpZiAoc2Vla01vZGUgPCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyB8fAorICAgICAgICBzZWVrTW9kZSA+IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgIEFMT0dFKCJVbmtub3duIHNlZWsgbW9kZTogJWQiLCBzZWVrTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgZHN0QnBwOworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdDsKKyAgICBpZiAoIWdldERzdENvbG9yRm9ybWF0KAorICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QpY29sb3JGb3JtYXQsICZkc3RGb3JtYXQsICZkc3RCcHApKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtZXRhT25seSkgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICAgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIGRzdEJwcCwgdHJ1ZSk7CisgICAgfQorCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgc3A8TWV0YURhdGE+IG92ZXJyaWRlTWV0YTsKKyAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWU7CisgICAgICAgIGludDMyX3QgdGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbEhlaWdodDsKKworICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RhbmQtYWxvbmUgdGh1bWJuYWlsLCBzZXQgdXAgdGhlIG92ZXJyaWRlIG1ldGEsCisgICAgICAgIC8vIGFuZCBzZXQgc2Vla1RvIHRpbWUgdG8gLTEuCisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsICZ0aHVtYm5haWxXaWR0aCkKKyAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsICZ0aHVtYm5haWxIZWlnaHQpCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSl7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+cmVtb3ZlKGtLZXlEaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB0aHVtYm5haWxXaWR0aCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIHRodW1ibmFpbEhlaWdodCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldERhdGEoa0tleUhWQ0MsIHR5cGUsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgdGh1bWJOYWlsVGltZSA9IC0xbGw7CisgICAgICAgICAgICBBTE9HVigidGh1bWJuYWlsOiAlZHglZCIsIHRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWxIZWlnaHQpOworICAgICAgICB9IGVsc2UgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCisgICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKKyAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGh1bWJOYWlsVGltZSwgbW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1vZGUpOworICAgIH0KKworICAgIGludDMyX3QgZ3JpZFJvd3MgPSAxLCBncmlkQ29scyA9IDE7CisgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRpbGVkIGhlaWYKKyAgICAgICAgaW50MzJfdCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHRtcFJvd3MsIHRtcENvbHM7CisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFdpZHRoLCAmZ3JpZFdpZHRoKSAmJiBncmlkV2lkdGggPiAwCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZEhlaWdodCwgJmdyaWRIZWlnaHQpICYmIGdyaWRIZWlnaHQgPiAwCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFJvd3MsICZ0bXBSb3dzKSAmJiB0bXBSb3dzID4gMAorICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRDb2xzLCAmdG1wQ29scykgJiYgdG1wQ29scyA+IDApIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBncmlkV2lkdGggKiB0bXBDb2xzICYmIGhlaWdodCA8PSBncmlkSGVpZ2h0ICogdG1wUm93cykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJncmlkOiAlZHglZCwgc2l6ZTogJWR4JWQsIHBpY3R1cmUgc2l6ZTogJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29scywgdG1wUm93cywgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgZ3JpZFdpZHRoKTsKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGdyaWRIZWlnaHQpOworICAgICAgICAgICAgICAgIGdyaWRDb2xzID0gdG1wQ29sczsKKyAgICAgICAgICAgICAgICBncmlkUm93cyA9IHRtcFJvd3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiYWQgZ3JpZDogJWR4JWQsIHNpemU6ICVkeCVkLCBwaWN0dXJlIHNpemU6ICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbHMsIHRtcFJvd3MsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSB0cmFja01ldGE7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50MzJfdCBudW1UaWxlcyA9IGdyaWRSb3dzICogZ3JpZENvbHM7CisKICAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQ7Ci0gICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEsICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKKyAgICBpZiAoY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG92ZXJyaWRlTWV0YSwgJnZpZGVvRm9ybWF0KSAhPSBPSykgewogICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOwogICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNvbnZlcnQgbWV0YSBkYXRhIHRvIG1lc3NhZ2UiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNjAsNyArMzE5LDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IHBvcnRzLCBpZiBzZWVraW5nIHRvIGEgc3luYyBmcmFtZS4gTk9URTogVGhpcyByZXF1ZXN0IG1heQogICAgIC8vIGZhaWwgaWYgY29tcG9uZW50IHJlcXVpcmVzIG1vcmUgdGhhbiB0aGF0IGZvciBkZWNvZGluZy4KICAgICBib29sIGlzU2Vla2luZ0Nsb3Nlc3QgPSAoc2Vla01vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgIGlmICghaXNTZWVraW5nQ2xvc2VzdCkgeworICAgIGJvb2wgZGVjb2RlU2luZ2xlRnJhbWUgPSAhaXNTZWVraW5nQ2xvc2VzdCAmJiAobnVtVGlsZXMgPT0gMSk7CisgICAgaWYgKGRlY29kZVNpbmdsZUZyYW1lKSB7CiAgICAgICAgIHZpZGVvRm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fbnVtLWlucHV0LWJ1ZmZlcnMiLCAxKTsKICAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0tb3V0cHV0LWJ1ZmZlcnMiLCAxKTsKICAgICB9CkBAIC0xOTAsMzAgKzM1MCw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIGlmIChzZWVrTW9kZSA8IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DIHx8Ci0gICAgICAgIHNlZWtNb2RlID4gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLQotICAgICAgICBBTE9HRSgiVW5rbm93biBzZWVrIG1vZGU6ICVkIiwgc2Vla01vZGUpOwotICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlPihzZWVrTW9kZSk7Ci0KLSAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWU7Ci0gICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgewotICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmdGh1bWJOYWlsVGltZSkKLSAgICAgICAgICAgICAgICB8fCB0aHVtYk5haWxUaW1lIDwgMCkgewotICAgICAgICAgICAgdGh1bWJOYWlsVGltZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGh1bWJOYWlsVGltZSwgbW9kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGh1bWJOYWlsVGltZSA9IC0xOwotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhmcmFtZVRpbWVVcywgbW9kZSk7Ci0gICAgfQotCiAgICAgZXJyID0gc291cmNlLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR1coInNvdXJjZSBmYWlsZWQgdG8gc3RhcnQ6ICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOwpAQCAtMjU4LDYgKzM5NCw5IEBACiAgICAgYm9vbCBmaXJzdFNhbXBsZSA9IHRydWU7CiAgICAgaW50NjRfdCB0YXJnZXRUaW1lVXMgPSAtMWxsOwogCisgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIGludDMyX3QgdGlsZXNEZWNvZGVkID0gMDsKKwogICAgIGRvIHsKICAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAtMTsKICAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBsbDsKQEAgLTI4Miw2ICs0MjEsOSBAQAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBFcnJvciBvciBFT1MiKTsKICAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmlyc3RTYW1wbGUgJiYgaXNTZWVraW5nQ2xvc2VzdCkgewpAQCAtMjkzLDYgKzQzNSw3IEBACiAgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHNpemUgKCV6dSkgdG9vIGxhcmdlIGZvciBjb2RlYyBpbnB1dCBzaXplICglenUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKQEAgLTMwMSwxOSArNDQ0LDIwIEBACiAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbWVkaWFCdWZmZXItPmRhdGEoKSArIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXZjT3JIZXZjICYmIElzSURSKGNvZGVjQnVmZmVyKSAmJiAhaXNTZWVraW5nQ2xvc2VzdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gZGVjb2RlIG9uZSBJRFIgZnJhbWUsIHVubGVzcyB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVAotICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhY3R1YWxseSBkZWNvZGUgdG8gdGFyZ2V0VGltZVVzLgotICAgICAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZXJyID09IE9LICYmIGlucHV0SW5kZXggPCBpbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIGlmIChoYXZlTW9yZUlucHV0cyAmJiBpbnB1dEluZGV4IDwgaW5wdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKGlzQXZjT3JIZXZjICYmIElzSURSKGNvZGVjQnVmZmVyKSAmJiBkZWNvZGVTaW5nbGVGcmFtZSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBkZWNvZGUgb25lIElEUiBmcmFtZSwgdW5sZXNzIHdlJ3JlIHNlZWtpbmcgd2l0aCBDTE9TRVNUCisgICAgICAgICAgICAgICAgLy8gb3B0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gYWN0dWFsbHkgZGVjb2RlIHRvIHRhcmdldFRpbWVVcy4KKyAgICAgICAgICAgICAgICBoYXZlTW9yZUlucHV0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQUxPR1YoIlF1ZXVlSW5wdXQ6IHNpemU9JXp1IHRzPSUiIFBSSWQ2NCAiIHVzIGZsYWdzPSV4IiwKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwgcHRzVXMsIGZsYWdzKTsKICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPnF1ZXVlSW5wdXRCdWZmZXIoCkBAIC0zNTAsMTMgKzQ5NCw4MCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiVGltZWQtb3V0IHdhaXRpbmcgZm9yIG91dHB1dC4uIHJldHJpZXMgbGVmdCA9ICV6dSIsIHJldHJpZXNMZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKKwkgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVCBvcHRpb24gYW5kIG9idGFpbmVkIGEgdmFsaWQgdGFyZ2V0VGltZVVzCiAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4dHJhY3RvciwgZGVjb2RlIHRvIHRoZSBzcGVjaWZpZWQgZnJhbWUuIE90aGVyd2lzZSB3ZSdyZSBkb25lLgotICAgICAgICAgICAgICAgICAgICBkb25lID0gKHRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSB0YXJnZXRUaW1lVXMpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgYW4gb3V0cHV0IGJ1ZmZlciwgdGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXIgPSBvdXRwdXRCdWZmZXJzLml0ZW1BdChpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQgPSBjcm9wX3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gYWxsb2NWaWRlb0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSkgKiBncmlkQ29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxKSAqIGdyaWRSb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKKworICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KTsKKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRpbGVzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdExlZnQgPSBjcm9wX2xlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSBjcm9wX3RvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gY3JvcF9yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCA9IHRpbGVzRGVjb2RlZCAlIGdyaWRDb2xzICogd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSB0aWxlc0RlY29kZWQgLyBncmlkQ29scyAqIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGRzdFRvcCArIGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkb25lID0gKHRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSB0YXJnZXRUaW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRlci5jb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBmb3JtYXQgMHglMDh4IHRvIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGb3JtYXQsIGRzdEZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1UaWxlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlc0RlY29kZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lICY9ICh0aWxlc0RlY29kZWQgPj0gbnVtVGlsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGVycm9yICVkICglcykgaW5zdGVhZCBvZiBvdXRwdXQiLCBlcnIsIGFzU3RyaW5nKGVycikpOwogICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKQEAgLTM2NiwxMDIgKzU3NywxMSBAQAogICAgICAgICB9CiAgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFkb25lKTsKIAotICAgIGlmIChlcnIgIT0gT0sgfHwgc2l6ZSA8PSAwIHx8IG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVjb2RlIHRodW1ibmFpbCBmcmFtZSIpOwotICAgICAgICBzb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IGRlY29kZWQgdmlkZW8gZnJhbWUuIik7Ci0gICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gdmlkZW9GcmFtZUJ1ZmZlciA9IG91dHB1dEJ1ZmZlcnMuaXRlbUF0KGluZGV4KTsKLQotICAgIGlmICh0aHVtYk5haWxUaW1lID49IDApIHsKLSAgICAgICAgaWYgKHRpbWVVcyAhPSB0aHVtYk5haWxUaW1lKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgICAgICAgICBBTE9HVigidGh1bWJOYWlsVGltZSA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMsIG1pbWUgPSAlcyIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGh1bWJOYWlsVGltZSwgKGxvbmcgbG9uZyl0aW1lVXMsIG1pbWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgIGludDMyX3QgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b207Ci0gICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3BfbGVmdCwgJmNyb3BfdG9wLCAmY3JvcF9yaWdodCwgJmNyb3BfYm90dG9tKSkgewotICAgICAgICBjcm9wX2xlZnQgPSBjcm9wX3RvcCA9IDA7Ci0gICAgICAgIGNyb3BfcmlnaHQgPSB3aWR0aCAtIDE7Ci0gICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHJvdGF0aW9uQW5nbGU7Ci0gICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkFuZ2xlKSkgewotICAgICAgICByb3RhdGlvbkFuZ2xlID0gMDsgIC8vIEJ5IGRlZmF1bHQsIG5vIHJvdGF0aW9uCi0gICAgfQotCi0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBuZXcgVmlkZW9GcmFtZTsKLSAgICBmcmFtZS0+bVdpZHRoID0gY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDE7Ci0gICAgZnJhbWUtPm1IZWlnaHQgPSBjcm9wX2JvdHRvbSAtIGNyb3BfdG9wICsgMTsKLSAgICBmcmFtZS0+bURpc3BsYXlXaWR0aCA9IGZyYW1lLT5tV2lkdGg7Ci0gICAgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID0gZnJhbWUtPm1IZWlnaHQ7Ci0gICAgZnJhbWUtPm1TaXplID0gZnJhbWUtPm1XaWR0aCAqIGZyYW1lLT5tSGVpZ2h0ICogMjsKLSAgICBmcmFtZS0+bURhdGEgPSBuZXcgdWludDhfdFtmcmFtZS0+bVNpemVdOwotICAgIGZyYW1lLT5tUm90YXRpb25BbmdsZSA9IHJvdGF0aW9uQW5nbGU7Ci0KLSAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7Ci0gICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJnNhcldpZHRoKQotICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnNhckhlaWdodCkKLSAgICAgICAgICAgICYmIHNhckhlaWdodCAhPSAwKSB7Ci0gICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0gKGZyYW1lLT5tRGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgJmhlaWdodCkKLSAgICAgICAgICAgICAgICAmJiBmcmFtZS0+bURpc3BsYXlXaWR0aCA+IDAgJiYgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID4gMAotICAgICAgICAgICAgICAgICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ICogKGludDY0X3Qpd2lkdGggLyBoZWlnaHQgPiAoaW50NjRfdClmcmFtZS0+bURpc3BsYXlXaWR0aCkgewotICAgICAgICAgICAgICAgIGZyYW1lLT5tRGlzcGxheUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoaGVpZ2h0ICogKGludDY0X3QpZnJhbWUtPm1EaXNwbGF5V2lkdGggLyB3aWR0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShmcmFtZS0+bURpc3BsYXlIZWlnaHQgKiAoaW50NjRfdCl3aWR0aCAvIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigidGh1bWJOYWlsIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG92ZXJyaWRkZW4gdG8gJWQgeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoLCBmcmFtZS0+bURpc3BsYXlIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQotICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOwotCi0gICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgZXJyID0gY29udmVydGVyLmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bURhdGEsCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKLSAgICAgICAgICAgICAgICAwLCAwLCBmcmFtZS0+bVdpZHRoIC0gMSwgZnJhbWUtPm1IZWlnaHQgLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBmb3JtYXQgMHglMDh4IHRvIFJHQjU2NSIsIHNyY0Zvcm1hdCk7Ci0KLSAgICAgICAgZXJyID0gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgdmlkZW9GcmFtZUJ1ZmZlci5jbGVhcigpOwogICAgIHNvdXJjZS0+c3RvcCgpOwotICAgIGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwogICAgIGRlY29kZXItPnJlbGVhc2UoKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkNvbG9yY29udmVydGVyIGZhaWxlZCB0byBjb252ZXJ0IGZyYW1lLiIpOwotCisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IHZpZGVvIGZyYW1lIChlcnIgJWQpIiwgZXJyKTsKICAgICAgICAgZGVsZXRlIGZyYW1lOwogICAgICAgICBmcmFtZSA9IE5VTEw7CiAgICAgfQpAQCAtNDcwLDkgKzU5MCwxMCBAQAogfQogCiBWaWRlb0ZyYW1lICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZSgKLSAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkgewogCi0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlIiBQUklkNjQgIiB1cyBvcHRpb246ICVkIiwgdGltZVVzLCBvcHRpb24pOworICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJSIgUFJJZDY0ICIgdXMgb3B0aW9uOiAlZCBjb2xvckZvcm1hdDogJWQsIG1ldGFPbmx5OiAlZCIsCisgICAgICAgICAgICB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKIAogICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIm5vIGV4dHJhY3Rvci4iKTsKQEAgLTU0MCw4ICs2NjEsOCBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0KLSAgICAgICAgICAgIGV4dHJhY3RWaWRlb0ZyYW1lKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gZXh0cmFjdFZpZGVvRnJhbWUoCisgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UsIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogCiAgICAgICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZnJhbWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggMGFlYThlMS4uM2VmOGYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMjM3LDYgKzIzNywxMSBAQAogICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBjb2RlY1Byb2ZpbGU7CiAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBjb2RlY0xldmVsOwogICAgIGlmIChwcm9maWxlcy5tYXAocHJvZmlsZSwgJmNvZGVjUHJvZmlsZSkpIHsKKyAgICAgICAgaWYgKHByb2ZpbGUgPT0gNjYgJiYgKGNvbnN0cmFpbnRzICYgMHg0MCkpIHsKKyAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gMTAwICYmIChjb25zdHJhaW50cyAmIDB4MEMpID09IDB4MEMpIHsKKyAgICAgICAgICAgIGNvZGVjUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g7CisgICAgICAgIH0KICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIGNvZGVjUHJvZmlsZSk7CiAgICAgICAgIGlmIChsZXZlbHMubWFwKGxldmVsLCAmY29kZWNMZXZlbCkpIHsKICAgICAgICAgICAgIC8vIGZvciA5ICYmIDExIGRlY2lkZSBsZXZlbCBiYXNlZCBvbiBwcm9maWxlIGFuZCBjb25zdHJhaW50X3NldDMgZmxhZwpAQCAtMTg3NCw1ICsxODc5LDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAordm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKKyAgICBzWzBdID0geCA+PiAyNDsKKyAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKKyAgICBzWzJdID0gKHggPj4gOCkgJiAweGZmOworICAgIHNbM10gPSB4ICYgMHhmZjsKKyAgICBzWzRdID0gJ1wwJzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDZlMDRjMWUuLjIxYzAwYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdEFBQzIuY3BwIiwKQEAgLTMzLDQgKzM3LDUgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggOWZiZGI3Mi4uZTBjMGMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTIxOCw2ICsyMTgsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEFBQzI6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoKE9NWF9VMzIpIGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nQUFDIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KQEAgLTM0Miw2ICszNjYsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdBQUMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKaW5kZXggYTFjZjI4NS4uNzNhMzk2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBTT0ZUX0FBQ18yX0hfCiAjZGVmaW5lIFNPRlRfQUFDXzJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKICNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAppbmRleCAxYTdmZmNhLi5mYjM2OGMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hYWNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJiYXNpY19vcC9iYXNpY29wMi5jIiwKQEAgLTExMSw2ICsxMTIsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEFBQ0VuY29kZXIyLmNwcCJdLAogCkBAIC0xNDAsNiArMTQ1LDcgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmgKaW5kZXggOTgxY2JiYi4uZTY0YzFiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQUFDX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgVk9fQVVESU9fQ09ERUNBUEk7CiBzdHJ1Y3QgVk9fTUVNX09QRVJBVE9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKaW5kZXggMTIzZmQyNS4uNjgxZGNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BQUNfRU5DT0RFUl8yX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgImFhY2VuY19saWIuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IGM1YWM1NTguLjUxNzc1OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZGQuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAppbmRleCA5OTYxODNiLi5kMjY2ZGMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hX3JlZmwuY3BwIiwKQEAgLTU1LDEzICs1NiwyMCBAQAogICAgIC8vICAgIF0sCiAgICAgLy99LAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0QU1SLmNwcCJdLAogCkBAIC05Niw2ICsxMDQsNyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IDc1NTMxNTMuLmI3ZTg0ZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtMTQzLDYgKzE0MywzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QU1SOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nQU1SIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphbXJQYXJhbXMgPQpAQCAtMjM2LDYgKzI2MCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FNUikKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphYWNQYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaAppbmRleCA3NThkNmFjLi44NjliODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQU1SX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKaW5kZXggYWYwZjhjMi4uNmRjMmRjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYW1yZW5jb2RlLmNwcCIsCkBAIC04Myw2ICs4NCwxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1ybmJlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRBTVJOQkVuY29kZXIuY3BwIl0sCiAKQEAgLTExMCw2ICsxMTUsNyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmgKaW5kZXggNTAxNzhjNC4uYzczZTRkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FNUk5CX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKaW5kZXggZTI2MWMwNC4uYjkzMmNjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FnYzJfYW1yX3diLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCmluZGV4IDVjNWExMjIuLjZkZWQ5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hdXRvY29yci5jIiwKQEAgLTEyOCw2ICsxMjksNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgICAgICAibGlibG9nIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKQEAgLTE0NCw2ICsxNDYsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcndiZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0QU1SV0JFbmNvZGVyLmNwcCJdLAogCkBAIC0xNzMsNiArMTc5LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKaW5kZXggZDUyZmVkMy4uNzlhNWQ2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5oCmluZGV4IGQwYzFkYWIuLjg5NTBhOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQU1SV0JfRU5DT0RFUl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJ2b0FNUldCLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKaW5kZXggOGNlYmIwOS4uZjJlMjhjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKQEAgLTQ3LDYgKzQ3LDEwIEBACiAKICNpbmNsdWRlICJxX3B1bHNlLmgiCiAKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgImFtcndiZW5jIgorI2luY2x1ZGUgImxvZy9sb2cuaCIKKwogc3RhdGljIFdvcmQxNiB0aXBvc1szNl0gPSB7CiAgICAgMCwgMSwgMiwgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgcG9pbnQgJmlwb3NbMF0sIDFzdCBpdGVyICovCiAgICAgMSwgMiwgMywgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgcG9pbnQgJmlwb3NbNF0sIDJuZCBpdGVyICovCkBAIC03NDUsMTEgKzc0OSwxNiBAQAogCiAgICAgICAgIGkgPSAoV29yZDE2KSgodm9fTF9tdWx0KHRyYWNrLCBOUE1BWFBUKSA+PiAxKSk7CiAKLSAgICAgICAgd2hpbGUgKGluZFtpXSA+PSAwKQorICAgICAgICB3aGlsZSAoaSA8IE5QTUFYUFQgKiBOQl9UUkFDSyAmJiBpbmRbaV0gPj0gMCkKICAgICAgICAgewogICAgICAgICAgICAgaSArPSAxOwogICAgICAgICB9Ci0gICAgICAgIGluZFtpXSA9IGluZGV4OworICAgICAgICBpZiAoaSA8IE5QTUFYUFQgKiBOQl9UUkFDSykgeworICAgICAgICAgICAgaW5kW2ldID0gaW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYi8xMzI2NDcyMjIsIE9PQiBhY2Nlc3MgaW4gaW5kIGFycmF5IHRyYWNrPSVkIGk9JWQiLCB0cmFjaywgaSk7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEzMjY0NzIyMiIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgayA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKaW5kZXggNmI5OTZhNy4uMWY0MzgwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hdmNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRBVkNEZWMuY3BwIl0sCkBAIC0xMiw3ICsxNiw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMzAsNCArMzQsNSBAQAogICAgIH0sCiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IDU0ODZhNmQuLmRhZTZlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtNDgsMTAgKzQ4LDE0IEBACiAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUgyNjREX0NNRF9DVExfU0VUX05VTV9DT1JFUwogCiBzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKwogICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKIAogICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCAgICAgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKIAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaAppbmRleCAxOGI3NTU2Li42NzllZDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfSDI2NF9ERUNfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAppbmRleCA0OTAyMWE5Li42NjUwN2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2VuYyJdLAogICAgIHNyY3M6IFsiU29mdEFWQ0VuYy5jcHAiXSwKQEAgLTEzLDcgKzE3LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTMwLDQgKzM0LDUgQEAKICAgICB9LAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCAzMDk2MGI1Li4zMmZkYmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KIApAQCAtNzUsMzMgKzc0LDExIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCiAKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKIH07CiAKIHN0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgewpAQCAtNjI5LDggKzYwNiwxMCBAQAogICAgICAgICBsZXZlbCA9IDMwOwogICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKICAgICAgICAgbGV2ZWwgPSAyMTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDE3NiAqIDE0NCkpIHsKICAgICAgICAgbGV2ZWwgPSAyMDsKKyAgICB9IGVsc2UgeworICAgICAgICBsZXZlbCA9IDEwOwogICAgIH0KICAgICBtQVZDRW5jTGV2ZWwgPSBNQVgobGV2ZWwsIG1BVkNFbmNMZXZlbCk7CiAKQEAgLTk2Myw3ICs5NDIsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOworICAgICAgICAgICAgLy8gVE9ETzogbWFpbnRhaW4gcHJvZmlsZQorICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5lTGV2ZWwgPSBvbXhMZXZlbDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZkZyYW1lcyA9IDE7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCA4MThlNGExLi5hNDNjZGYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAwMjFlNmFmLi4zNzI2OTIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbImNtbk1lbW9yeS5jIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNmFjMjY0ZC4uNTk1Y2ZkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRGbGFjRGVjb2Rlci5jcHAiLApAQCAtMzMsNCArMzcsNSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCBjZmY0YTMzLi40YWIxYWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtMTI2LDYgKzEyNiwyOSBAQAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIEFMT0dWKCJpbnRlcm5hbEdldFBhcmFtZXRlcjogaW5kZXgoJXgpIiwgaW5kZXgpOwogICAgIHN3aXRjaCAoKE9NWF9VMzIpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdGTEFDIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFICpmbGFjUGFyYW1zID0KQEAgLTIxOSw2ICsyNDIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdGTEFDKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMjU2LDEwICszMDIsMjcgQEAKICAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAgICAgICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKICAgICAgICAgYm9vbCBlbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CiAKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGlmIChlbmRPZklucHV0KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IGVtcHR5SW5wdXRCdWZmZXIgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2V0Iik7CiAgICAgICAgICAgICBpbkhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOwpAQCAtMjk3LDggKzM2MCw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogICAgICAgICBzaG9ydCAqb3V0QnVmZmVyID0KICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHNob3J0ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CiAgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKaW5kZXggYzA5MDgxZC4uNGEyMWMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBTT0ZUX0ZMQUNfREVDT0RFUl9ICiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggZDE0MTNmNi4uMDY2OTE3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTIyLDcgKzIyLDcgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zMiw1ICszMiwxMCBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCBjYWNlZGE5Li41NmQyZDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMTU0LDYgKzE1NCwzMCBAQAogICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4PTB4JXgpIiwgaW5kZXgpOwogCiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1BDTSA6IE9NWF9BVURJT19Db2RpbmdGTEFDOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTYzLDcgKzE4Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKQEAgLTE4OSw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZmxhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNvbXByZXNzaW9uTGV2ZWwgPSBtQ29tcHJlc3Npb25MZXZlbDsKICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CkBAIC0yMDMsNiArMjMxLDI5IEBACiBPTVhfRVJST1JUWVBFIFNvZnRGbGFjRW5jb2Rlcjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdGTEFDKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtKSIpOwpAQCAtMjEyLDcgKzI2Myw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwICYmIHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcigpIEVycm9yICMxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTI1OCw2ICszMDksMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZmxhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbUNvbXByZXNzaW9uTGV2ZWwgPSBmbGFjUGFyYW1zLT5uQ29tcHJlc3Npb25MZXZlbDsgLy8gcmFuZ2UgY2xhbXBpbmcgZG9uZSBpbnNpZGUgZW5jb2RlcgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAppbmRleCA2MDI3Zjc2Li5mNGYwNjU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9GTEFDX0VOQ19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKaW5kZXggYjc4YjY4OS4uZmZmNzJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEc3MTEuY3BwIl0sCiAKQEAgLTksNyArMTMsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjcsNCArMzEsNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IGY3YzA0MjkuLjdhNGNjYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0RzcxMTo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0c3MTEgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTczLDYgKzE5NywyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0c3MTEpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKaW5kZXggMTZiNjM0MC4uM2VjZTI0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0c3MTFfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCmluZGV4IDhlODZhZDYuLjc1M2VlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9nc21kZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRHU00uY3BwIl0sCiAKQEAgLTIzLDExICsyNywxMiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJnc20iXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCAxMTk5OWI0Li5kNzc3MjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0R1NNOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nR1NNRlIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTY0LDYgKzE4OCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0dTTUZSKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKaW5kZXggMDMwM2RlYS4uZWY4NjkxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfR1NNX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAiZ3NtLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icAppbmRleCBjZDc1Yzk3Li43ZmE3NGQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRIRVZDLmNwcCJdLApAQCAtMjIsNyArMjYsNyBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTMzLDQgKzM3LDUgQEAKICAgICAvLyByZXF1aXJlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJlbG9jIFJfQVJNX1JFTDMyOyByZWNvbXBpbGUgd2l0aCAtZlBJQwogICAgIC8vIEJ1ZzogMTY4NTMyOTEKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCmluZGV4IGU3YzIxMjcuLjU4MDA0OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfSEVWQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDA0ZWEwNzUuLjEyMTZhZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAiLApAQCAtNjYsNiArNjgsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzQuY3BwIl0sCiAKQEAgLTg3LDcgKzkzLDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTEwMyw0ICsxMDksNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCA0MTFhMjUxLi4zOWI2N2FiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0zMSwyMCArMzEsMTIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtNNFZQcm9maWxlTGV2ZWxzW10gPSB7Ci0gICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDAgfSwKLSAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMGIgfSwKLSAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMSB9LAotICAgIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyIH0sCiAgICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDMgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaAppbmRleCA0MTE0ZTdkLi5lMzk5YWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX01QRUc0X0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAppbmRleCBkYTViMTYyLi42NDA3MThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2JpdHN0cmVhbV9pby5jcHAiLApAQCAtNTIsNiArNTMsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzRFbmNvZGVyLmNwcCJdLAogCkBAIC03NSw3ICs4MCw3IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKQEAgLTkwLDYgKzk1LDcgQEAKICAgICAgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggZjE1YjE1NC4uZjZhN2IwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNpbmNsdWRlICJTb2Z0TVBFRzRFbmNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKaW5kZXggYWU4Y2I2Zi4uMDBmMmRkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggMGQwYTJjNi4uMjczZmEzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAiLApAQCAtNzcsNiArNzgsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wM2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdE1QMy5jcHAiXSwKIApAQCAtMTAyLDcgKzEwNyw3IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMTEwLDYgKzExNSw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggM2RlZjFmMC4uMjM2NDY4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC0xMzQsNiArMTM0LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRNUDM6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdNUDMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMjA4LDYgKzIzMiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ01QMykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKaW5kZXggM2JmYTZjNy4uOTc2ZmQwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX01QM19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIHN0cnVjdCB0UFZNUDNEZWNvZGVyRXh0ZXJuYWw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKaW5kZXggMDE0NDU4MS4uMTVmZGRlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAogICAgIHNyY3M6IFsiU29mdE1QRUcyLmNwcCJdLApAQCAtMTIsNyArMTYsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTMwLDQgKzM0LDUgQEAKICAgICAgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCmluZGV4IDlhNjkyMjYuLjlkNWYzNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuY3BwCkBAIC03ODksNyArNzg5LDcgQEAKIAogICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgc3NpemVfdCB0aW1lU3RhbXBJZHg7Ci0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKIAogICAgICAgICAgICAgICAgIHRpbWVTdGFtcElkeCA9IGdldE1pblRpbWVzdGFtcElkeChtVGltZVN0YW1wcywgbVRpbWVTdGFtcHNWYWxpZCk7CiAgICAgICAgICAgICAgICAgaWYgKHRpbWVTdGFtcElkeCA8IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaAppbmRleCA2NzI5YTU0Li4zMzhmYzMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9NUEVHMl9IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKaW5kZXggYzQyNDJjMi4uNTljMWY1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdFZQWC5jcHAiXSwKIApAQCAtMTEsNyArMTUsNyBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zMCw0ICszNCw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IDg0Y2Y3OWMuLmQ2YmI5MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKICNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAppbmRleCAxMTRjMWJlLi43NDE3NzRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdFZQWEVuY29kZXIuY3BwIiwKQEAgLTI2LDEwICszMCwxMSBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCmluZGV4IDg2ZGZhZDcuLmRkODZkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVlBYX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAppbmRleCBiOGMxODA3Li5mYWQ5ODhiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FWQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIAogI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icAppbmRleCA1ZDljNGM4Li44OGQ2ZWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0T3B1cy5jcHAiXSwKIApAQCAtMTAsMTMgKzE0LDE1IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlib3B1cyIsCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMjcsNCArMzMsNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDJhYzZjZTAuLjgxMzAwNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNjIsNiArNjIsNyBAQAogICAgICAgbVNlZWtQcmVSb2xsKDApLAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCisgICAgICBtSGF2ZUVPUyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtMTI5LDYgKzEzMCwzMSBAQAogT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTIDoKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQpAQCAtMjEyLDYgKzIzOCwzMCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KQEAgLTMzNSw3ICszODUsMzEgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiBrUmF0ZSAvIDEwMDAwMDAwMDA7CiB9CiAKLXZvaWQgU29mdE9wdXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdE9wdXM6OmhhbmRsZUVPUygpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKyAgICBDSEVDSyghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKTsKKworICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgIG1IYXZlRU9TID0gdHJ1ZTsKKworICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworCisgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICArK21JbnB1dEJ1ZmZlckNvdW50OworfQorCit2b2lkIFNvZnRPcHVzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKQEAgLTM0MywxMDQgKzQxNywxMDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDMpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOwotICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7Ci0gICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7Ci0gICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzaW5nIE9wdXMgSGVhZGVyIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OwotICAgICAgICAgICAgaWYgKG1IZWFkZXItPmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPnN0cmVhbV9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKLSAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cz0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0KLSAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLT5nYWluX2RiKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXM9JXMiLAotICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOwotICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOwotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICB3aGlsZSAoIW1IYXZlRU9TICYmICFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworCisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICYmIHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOworICAgICAgICAgICAgICAgIG1IZWFkZXIgPSBuZXcgT3B1c0hlYWRlcigpOworICAgICAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUGFyc2luZyBPcHVzIEhlYWRlciBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKCFtRGVjb2RlciB8fCBzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLT5nYWluX2RiKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGluSGVhZGVyLT5wQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaW5IZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZ25vcmUgQ1NEIHJlLXN1Ym1pc3Npb25zLgorICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPj0gMyAmJiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAogICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICBoYW5kbGVFT1MoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC00OTAsNyArNTY4LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXItPmNoYW5uZWxzOwotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAKICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUFuY2hvclRpbWVVcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvCkBAIC00OTksMjIgKzU3NiwyMCBAQAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBtSGF2ZUVPUyA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogICAgICAgICB9CiAKKyAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKwogICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBvdXRJbmZvID0gTlVMTDsKICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKLQotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwogICAgIH0KIH0KIApAQCAtNTI2LDYgKzYwMSw3IEBACiAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOwogICAgICAgICBtQW5jaG9yVGltZVVzID0gMDsKICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgICAgIG1IYXZlRU9TID0gZmFsc2U7CiAgICAgfQogfQogCkBAIC01NDIsNiArNjE4LDcgQEAKICAgICB9CiAKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICBtSGF2ZUVPUyA9IGZhbHNlOwogfQogCiB2b2lkIFNvZnRPcHVzOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaAppbmRleCA5N2Y2NTYxLi45MWNhZmExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApAQCAtMjMsNyArMjMsNyBAQAogCiAjZGVmaW5lIFNPRlRfT1BVU19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIHN0cnVjdCBPcHVzTVNEZWNvZGVyOwogCkBAIC03NSw2ICs3NSw3IEBACiAgICAgaW50NjRfdCBtU2FtcGxlc1RvRGlzY2FyZDsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OworICAgIGJvb2wgbUhhdmVFT1M7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKQEAgLTg1LDYgKzg2LDcgQEAKICAgICB2b2lkIGluaXRQb3J0cygpOwogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKyAgICB2b2lkIGhhbmRsZUVPUygpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9wdXMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAppbmRleCBjNjQwMjdiLi5mMjFkNDZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3Jhd2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdFJhdy5jcHAiXSwKIApAQCAtMjcsNCArMzEsNSBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCBhY2IyYjM3Li4xYTUyN2IzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDY0ICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC03OCw3ICs3OCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSAzMiAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTEwMCw2ICsxMDAsMjggQEAKIE9NWF9FUlJPUlRZUEUgU29mdFJhdzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTE1Myw2ICsxNzUsMjYgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmgKaW5kZXggODA5MDZiNC4uZWJjMjc0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1JBV19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIHN0cnVjdCB0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggMWE0ZGU2MC4uNjI4YjM2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdFZvcmJpcy5jcHAiXSwKIApAQCAtMTAsNyArMTQsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTI1LDQgKzI5LDUgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICB9LAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCmluZGV4IDE0ZGQyNTAuLjg5MTJmOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0xMjksNiArMTI5LDMwIEBACiBPTVhfRVJST1JUWVBFIFNvZnRWb3JiaXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdWT1JCSVMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CkBAIC0yMjEsNiArMjQ1LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nVk9SQklTKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CkBAIC0yNjIsNyArMzA5LDMzIEBACiAgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOwogfQogCi12b2lkIFNvZnRWb3JiaXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdFZvcmJpczo6aGFuZGxlRU9TKCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgQ0hFQ0soIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSk7CisKKyAgICBtU2F3SW5wdXRFb3MgPSB0cnVlOworCisgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKworICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgU29mdFZvcmJpczo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCkBAIC0yNzAsNjkgKzM0Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUlucHV0QnVmZmVyQ291bnQgPCAyKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gaW5mby0+bUhlYWRlcjsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgaWYgKHNpemUgPCA3KSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIGlucHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgc2l6ZSk7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7Ci0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgICAgIG9nZ19yZWZlcmVuY2UgcmVmOwotICAgICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOwotCi0gICAgICAgIG1ha2VCaXRSZWFkZXIoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgc2l6ZSAtIDcsCi0gICAgICAgICAgICAgICAgJmJ1ZiwgJnJlZiwgJmJpdHMpOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBDSEVDSyhtVmkgPT0gTlVMTCk7Ci0gICAgICAgICAgICBtVmkgPSBuZXcgdm9yYmlzX2luZm87Ci0gICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7Ci0KLSAgICAgICAgICAgIGludCByZXQgPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpOwotICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIHJldCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfYm9va3MobVZpLCAmYml0cyk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE5VTEwpOwotICAgICAgICAgICAgbVN0YXRlID0gbmV3IHZvcmJpc19kc3Bfc3RhdGU7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLCB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKTsKLQotICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBrRGVmYXVsdFNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBtVmktPmNoYW5uZWxzICE9IGtEZWZhdWx0Q2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInZvcmJpczogcmF0ZS9jaGFubmVscyBjaGFuZ2VkOiAlbGQvJWQiLCBtVmktPnJhdGUsIG1WaS0+Y2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7Ci0KLSAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IChtU2F3SW5wdXRFb3MgJiYgIW1TaWduYWxsZWRPdXRwdXRFb3MpKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIHdoaWxlICghbVNpZ25hbGxlZE91dHB1dEVvcyAmJiAoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFb3MpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9IE5VTEw7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IE5VTEw7CiAgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CkBAIC0zNDYsNiArMzU3LDczIEBACiAgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXMgPSAwOwogCiAgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMikgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICYmIHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIGlucHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2dnX2J1ZmZlciBidWY7CisgICAgICAgICAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgICAgICAgICAgb2dncGFja19idWZmZXIgYml0czsKKworICAgICAgICAgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgc2l6ZSAtIDcsICZidWYsICZyZWYsICZiaXRzKTsKKworICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1WaSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpID0gbmV3IHZvcmJpc19pbmZvOworICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIHJldCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCByZXQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gbmV3IHZvcmJpc19kc3Bfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtVmktPnJhdGUgIT0ga0RlZmF1bHRTYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmktPmNoYW5uZWxzICE9IGtEZWZhdWx0Q2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidm9yYmlzOiByYXRlL2NoYW5uZWxzIGNoYW5nZWQ6ICVsZC8lZCIsIG1WaS0+cmF0ZSwgbVZpLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgICAgICBtU2F3SW5wdXRFb3MgPSB0cnVlOwogICAgICAgICAgICAgfQpAQCAtMzU5LDggKzQzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaW5IZWFkZXItPm5PZmZzZXQgKyBpbkhlYWRlci0+bkZpbGxlZExlbiAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQgKyBpbkhlYWRlci0+bkZpbGxlZExlbiAtIDQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwogCiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKQEAgLTM5OSw2ICs0NzYsMTQgQEAKICAgICAgICAgaW50IG51bUZyYW1lcyA9IDA7CiAKICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIGlmIChtU3RhdGUgPT0gbnVsbHB0ciB8fCBtVmkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZCwgaW5wdXQgZG9lcyBub3QgaGF2ZSBDU0QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGludCBlcnIgPSB2b3JiaXNfZHNwX3N5bnRoZXNpcyhtU3RhdGUsICZwYWNrLCAxKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICAvLyBGSVhNRSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgbG9nIHNwYW0KQEAgLTQ0OCwxOCArNTMzLDEzIEBACiAgICAgICAgIGlmIChpbkhlYWRlcikgewogICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwogICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgICAgIH0KIAogICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBvdXRJbmZvID0gTlVMTDsKICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKLQotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCmluZGV4IDMwZDEzN2IuLjVmZjhlYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZPUkJJU19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIHN0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOwogc3RydWN0IHZvcmJpc19pbmZvOwpAQCAtNzIsNiArNzIsNyBAQAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworICAgIHZvaWQgaGFuZGxlRU9TKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0Vm9yYmlzKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCAzY2E3Y2MwLi4wOTgyMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgorI2luY2x1ZGUgImxpYnl1di92aWRlb19jb21tb24uaCIKIAogI2RlZmluZSBVU0VfTElCWVVWCiAKQEAgLTQxLDE3ICs0MiwxNyBAQAogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc1ZhbGlkKCkgY29uc3QgewotICAgIGlmIChtRHN0Rm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgc3dpdGNoIChtU3JjRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjIsMTQgKzYzLDQzIEBACiAgICAgICAgIHZvaWQgKmJpdHMsCiAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKLSAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20pCisgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCkKICAgICA6IG1CaXRzKGJpdHMpLAorICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRnJvbWF0KSwKICAgICAgIG1XaWR0aCh3aWR0aCksCiAgICAgICBtSGVpZ2h0KGhlaWdodCksCiAgICAgICBtQ3JvcExlZnQoY3JvcExlZnQpLAogICAgICAgbUNyb3BUb3AoY3JvcFRvcCksCiAgICAgICBtQ3JvcFJpZ2h0KGNyb3BSaWdodCksCiAgICAgICBtQ3JvcEJvdHRvbShjcm9wQm90dG9tKSB7CisgICAgc3dpdGNoKG1Db2xvckZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgICAgICBtQnBwID0gMjsKKyAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgICAgICBtQnBwID0gNDsKKyAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKKyAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICBtQnBwID0gMTsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0ICVkIiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgbUJwcCA9IDE7CisgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CisgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAogc2l6ZV90IENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OmNyb3BXaWR0aCgpIGNvbnN0IHsKQEAgLTg5LDE5ICsxMTksMTUgQEAKICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAogICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSkgewotICAgIGlmIChtRHN0Rm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgQml0bWFwUGFyYW1zIHNyYygKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmNCaXRzKSwKICAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsCi0gICAgICAgICAgICBzcmNDcm9wTGVmdCwgc3JjQ3JvcFRvcCwgc3JjQ3JvcFJpZ2h0LCBzcmNDcm9wQm90dG9tKTsKKyAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20sIG1TcmNGb3JtYXQpOwogCiAgICAgQml0bWFwUGFyYW1zIGRzdCgKICAgICAgICAgICAgIGRzdEJpdHMsCiAgICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LAotICAgICAgICAgICAgZHN0Q3JvcExlZnQsIGRzdENyb3BUb3AsIGRzdENyb3BSaWdodCwgZHN0Q3JvcEJvdHRvbSk7CisgICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tLCBtRHN0Rm9ybWF0KTsKIAogICAgIHN0YXR1c190IGVycjsKIApAQCAtMjEyLDI2ICsyMzgsMTA0IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OworICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cworICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tV2lkdGggKyBzcmMubUNyb3BMZWZ0OworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiBzcmMubUhlaWdodAotICAgICAgICArIHNyYy5tQ3JvcFRvcCAqIChzcmMubVdpZHRoIC8gMikgKyBzcmMubUNyb3BMZWZ0IC8gMjsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikgKyAoc3JjLm1Dcm9wTGVmdCAvIDIpOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQotICAgICAgICBzcmNfdSArIChzcmMubVdpZHRoIC8gMikgKiAoc3JjLm1IZWlnaHQgLyAyKTsKKyAgICAgICAgc3JjX3UgKyAoc3JjLm1TdHJpZGUgLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOwogCisgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBsaWJ5dXY6Okk0MjBUb1JHQjU2NShzcmNfeSwgc3JjLm1XaWR0aCwgc3JjX3UsIHNyYy5tV2lkdGggLyAyLCBzcmNfdiwgc3JjLm1XaWR0aCAvIDIsCi0gICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVdpZHRoICogMiwgZHN0Lm1XaWR0aCwgZHN0Lm1IZWlnaHQpOworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BQkdSKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQVJHQik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDb2xvckNvbnZlcnRlcjo6d3JpdGVUb0RzdCgKKyAgICAgICAgdm9pZCAqZHN0X3B0ciwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCisgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJnYjEgPQorICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IxXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMyk7CisKKyAgICAgICAgaWYgKHVuY3JvcHBlZCkgeworICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9CisgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKKworICAgICAgICAgICAgKih1aW50MzJfdCAqKWRzdF9wdHIgPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKih1aW50MTZfdCAqKWRzdF9wdHIgPSByZ2IxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgIHsKKyAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KKyAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMV0pCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKworICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQorICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMl0pCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICB7CisgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9CisgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjFdKQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCisgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CisKKyAgICAgICAgaWYgKHVuY3JvcHBlZCkgeworICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KKyAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjJdKQorICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKICAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKQEAgLTI0MiwxOCArMzQ2LDE4IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogKHNyYy5tV2lkdGggLyAyKSArIHNyYy5tQ3JvcExlZnQgLyAyOworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiAoc3JjLm1TdHJpZGUgLyAyKSArIHNyYy5tQ3JvcExlZnQgLyAyOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQotICAgICAgICBzcmNfdSArIChzcmMubVdpZHRoIC8gMikgKiAoc3JjLm1IZWlnaHQgLyAyKTsKKyAgICAgICAgc3JjX3UgKyAoc3JjLm1TdHJpZGUgLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOwogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewpAQCAtMjk2LDMxICs0MDAsMTkgQEAKICAgICAgICAgICAgIHNpZ25lZCBnMiA9ICh0bXAyICsgdl9nICsgdV9nKSAvIDI1NjsKICAgICAgICAgICAgIHNpZ25lZCByMiA9ICh0bXAyICsgdl9yKSAvIDI1NjsKIAotICAgICAgICAgICAgdWludDMyX3QgcmdiMSA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IxXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMV0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKLQotICAgICAgICAgICAgaWYgKHggKyAxIDwgc3JjLmNyb3BXaWR0aCgpKSB7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKSgmZHN0X3B0clt4XSkgPSAocmdiMiA8PCAxNikgfCByZ2IxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkc3RfcHRyW3hdID0gcmdiMTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdW5jcm9wcGVkID0geCArIDEgPCBzcmMuY3JvcFdpZHRoKCk7CisgICAgICAgICAgICAodm9pZCl3cml0ZVRvRHN0KGRzdF9wdHIgKyB4ICogZHN0Lm1CcHAsCisgICAgICAgICAgICAgICAgICAgIGtBZGp1c3RlZENsaXAsIHVuY3JvcHBlZCwgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gc3JjLm1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBzcmMubVN0cmlkZSAvIDI7CiAgICAgICAgIH0KIAotICAgICAgICBkc3RfcHRyICs9IGRzdC5tV2lkdGg7CisgICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1TdHJpZGU7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKaW5kZXggY2UxNjRhMi4uODI5ZjQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCkBAIC0zNCwyMCArMzQsMjEgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgotICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDQxIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDUyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwODB4NDA4MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTMyNzY4IiAvPiA8IS0tIG1heCA0MDk2eDIwNDggZXF1aXZhbGVudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTk2NjA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00ODAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDk2eDQwOTYiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTk2NjA4IiAvPiA8IS0tIG1heCA0MDk2eDMwNzIgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KQEAgLTU2LDYgKzU3LDcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwMDAwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KQEAgLTY0LDYgKzY2LDcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNzksMTAgKzgyLDExIEBACiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQxIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE5MiIgLz4gPCEtLSBtYXggMjA0OHgxMDI0IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDU3NjAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CkBAIC05OCw2ICsxMDIsOSBAQAogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPCEtLSAyMDE2IGRldmljZXMgY2FuIGVuY29kZSBhdCBhYm91dCAxMGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CkBAIC0xMDUsNiArMTEyLDkgQEAKICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgOGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW9fbGUueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvX2xlLnhtbAppbmRleCAwMzRhMDM4Li5kN2M2NTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW9fbGUueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlb19sZS54bWwKQEAgLTM0LDIyICszNCwyMiBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+Ci0gICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDUxIC0tPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDUxIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTYwIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00ODk2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00OTE1MjAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xMzkyNjQiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQzMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNjU1MzYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ5MTUyMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS01MDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE2MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE5MiIgLz4gPCEtLSBtYXggMjA0OHgxMDI0IC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS01MDAwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4gPCEtLSBtYXggMTI4MHg3MjAgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS01MDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CkBAIC04MSwxMiArODEsMTQgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+Ci0gICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDIgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSI4OTZ4ODk2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwzIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTgwOHgxODA4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjIwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00MDUwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iaW50cmEtcmVmcmVzaCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUNvcmUgOiBMZXZlbDIgLS0+CkBAIC0xMDAsNyArMTAyLDggQEAKICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4gPCEtLSBtYXggMTI4MHg3MjAgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggMjg0YzI1Zi4uMWI5ZmUwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiRkxBQ0RlY29kZXIuY3BwIiwKQEAgLTMxLDQgKzM1LDUgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibGlibWVkaWFfaGVhZGVycyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDkxNDYyYzguLjIyMWFmMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEsNyArMSwxNSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0KKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIiwKQEAgLTExLDEyICsxOSwxMyBAQAogICAgICAgICAiaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKICAgICBdLAogCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCBjYzg5MDY0Li44ZjMyNTgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKSB7CiAgICAgc2l6ZV90IG4gPSBzLnNpemUoKTsKKwogICAgIGlmICgobiAlIDQpICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDUsNyArNDYsNiBAQAogICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CiAKICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW4pOwotCiAgICAgdWludDhfdCAqb3V0ID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgaWYgKG91dCA9PSBOVUxMIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgb3V0TGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjEsOSArNjEsOSBAQAogICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CiAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKICAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOwotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnKSB7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKICAgICAgICAgICAgIHZhbHVlID0gNjI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycpIHsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJyB8fCBjID09ICdfJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MzsKICAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNDQsNCArMTQ0LDI2IEBACiAgICAgfQogfQogCit2b2lkIGVuY29kZUJhc2U2NFVybCgKKyAgICAgICAgY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpIHsKKyAgICBlbmNvZGVCYXNlNjQoX2RhdGEsIHNpemUsIG91dCk7CisKKyAgICBpZiAoKC0xICE9IG91dC0+ZmluZCgiKyIpKSB8fCAoLTEgIT0gb3V0LT5maW5kKCIvIikpKSB7CisgICAgICAgIHNpemVfdCBvdXRMZW4gPSBvdXQtPnNpemUoKTsKKyAgICAgICAgY2hhciAqYmFzZTY0dXJsID0gbmV3IGNoYXJbb3V0TGVuXTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRMZW47ICsraSkgeworICAgICAgICAgICAgaWYgKG91dC0+Y19zdHIoKVtpXSA9PSAnKycpCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gJy0nOworICAgICAgICAgICAgZWxzZSBpZiAob3V0LT5jX3N0cigpW2ldID09ICcvJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnXyc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzZTY0dXJsW2ldID0gb3V0LT5jX3N0cigpW2ldOworICAgICAgICB9CisKKyAgICAgICAgb3V0LT5zZXRUbyhiYXNlNjR1cmwsIG91dExlbik7CisgICAgICAgIGRlbGV0ZVtdIGJhc2U2NHVybDsKKyAgICB9Cit9CisKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKaW5kZXggZTM0MGI4OS4uYWJjOTVlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKQEAgLTI4LDYgKzI4LDggQEAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKIHZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwogCit2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBCQVNFXzY0X0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZDc0MWM2Zi4uYTllM2M3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5tawpAQCAtOSwxMSArOSwxMyBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUFEYXRhX3Rlc3QuY3BwIFwKKwlCYXNlNjRfdGVzdC5jcHAgXAogCUZsYWdnZWRfdGVzdC5jcHAgXAogCVR5cGVUcmFpdHNfdGVzdC5jcHAgXAogCVV0aWxzX3Rlc3QuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlibG9nIFwKIAlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKIAlsaWJ1dGlscyBcCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQmFzZTY0X3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9CYXNlNjRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0Mjg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQmFzZTY0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmdVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgeworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworfTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBCYXNlNjRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCit2b2lkIHZlcmlmeURlY29kZShjb25zdCBBU3RyaW5nKiBleHBlY3RlZCwgY29uc3QgQVN0cmluZyogaW4pIHsKKyAgICBzaXplX3QgbnVtVGVzdHMgPSAwOworICAgIHdoaWxlICghZXhwZWN0ZWRbbnVtVGVzdHNdLmVtcHR5KCkpCisgICAgICAgICsrbnVtVGVzdHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRlc3RzOyArK2kpIHsKKyAgICAgICAgLy8gU2luY2UgYW5kcm9pZDo6ZGVjb2RlQmFzZTY0KCkgcmVxdWlyZXMgcGFkZGluZyBjaGFyYWN0ZXJzLAorICAgICAgICAvLyBhZGQgdGhlbSBzbyBsZW5ndGggb2YgZW5jb2RlZCB0ZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgICAgICBpbnQgcmVtYWluZGVyID0gaW5baV0uc2l6ZSgpICUgNDsKKyAgICAgICAgU3RyaW5nOCBwYWRkZWRUZXh0KGluW2ldLmNfc3RyKCkpOworICAgICAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYWRkZWRUZXh0LmFwcGVuZChrQmFzZTY0UGFkZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3A8QUJ1ZmZlcj4gcmVzdWx0ID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcocGFkZGVkVGV4dC5zdHJpbmcoKSkpOworCisgICAgICAgIEFTU0VSVF9FUShBU3RyaW5nVXRpbHM6OkNvbXBhcmUoZXhwZWN0ZWRbaV0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihyZXN1bHQtPmRhdGEoKSksCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0uc2l6ZSgpLCBmYWxzZSksIDApOworICAgIH0KK30KKwordm9pZCB2ZXJpZnlFbmNvZGUoY29uc3QgQVN0cmluZyogZXhwZWN0ZWQsIGNvbnN0IEFTdHJpbmcqIGluKSB7CisgICAgc2l6ZV90IG51bVRlc3RzID0gMDsKKyAgICB3aGlsZSAoIWV4cGVjdGVkW251bVRlc3RzXS5lbXB0eSgpKQorICAgICAgICArK251bVRlc3RzOworCisgICAgQVN0cmluZyBvdXQgPSBBU3RyaW5nKCIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRlc3RzOyArK2kpIHsKKyAgICAgICAgZW5jb2RlQmFzZTY0VXJsKGluW2ldLmNfc3RyKCksIGluW2ldLnNpemUoKSwgJm91dCk7CisKKyAgICAgICAgQVNTRVJUX0VRKEFTdHJpbmdVdGlsczo6Q29tcGFyZShleHBlY3RlZFtpXS5jX3N0cigpLCBvdXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpXS5zaXplKCksIGZhbHNlKSwgMCk7CisgICAgfQorfQorCitURVNUX0YoQmFzZTY0VGVzdCwgVGVzdERlY29kZUJhc2U2NCkgeworICAgIGNvbnN0IEFTdHJpbmcgYmFzZTY0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUm5KcFpXNWtJUSIpLAorICAgICAgICBBU3RyaW5nKCJSMjl2WkNCa1lYa2giKSwKKyAgICAgICAgQVN0cmluZygiIikgIC8vIHN0cmluZyB0byBzaWduYWwgZW5kIG9mIGFycmF5CisgICAgfTsKKworICAgIGNvbnN0IEFTdHJpbmcgY2xlYXJUZXh0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCEiKSwKKyAgICAgICAgQVN0cmluZygiR29vZCBkYXkhIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIHZlcmlmeURlY29kZShjbGVhclRleHQsIGJhc2U2NCk7Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RGVjb2RlQmFzZTY0VXJsKSB7CisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRVcmxbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lDRS1QdyIpLAorICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1JuSnBaVzVrSUNFXyIpLAorICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1B6NC1JRVp5YVdWdVpDQV9QZyIpLAorICAgICAgICBBU3RyaW5nKCIiKQorICAgIH07CisKKyAgICBjb25zdCBBU3RyaW5nIGNsZWFyVGV4dFtdID0geworICAgICAgICBBU3RyaW5nKCJIZWxsbyBGcmllbmQgIT4/IiksCisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCAhPyIpLAorICAgICAgICBBU3RyaW5nKCJIZWxsbyA/Pj4gRnJpZW5kID8+IiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIHZlcmlmeURlY29kZShjbGVhclRleHQsIGJhc2U2NFVybCk7Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RGVjb2RlTWFsZm9ybWVkQmFzZTY0KSB7CisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRVcmxbXSA9IHsKKyAgICAgICAgQVN0cmluZygiMT9HYXdnZ3VGeUdyV0thdjdBWDRWS1VnIiksICAvLyBmYWlsIG9uIHBhcnNpbmcKKyAgICAgICAgQVN0cmluZygiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/PyIpLCAgICAvLyBmYWlsIG9uIGxlbmd0aCBub3QgbXVsdGlwbGUgb2YgNAorICAgICAgICBBU3RyaW5nKCJHYXdnZ3VGeUdyV0thdjdBWDRWS1VnIiksICAgIC8vIGRpdHRvCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHJlc3VsdCA9IGRlY29kZUJhc2U2NChBU3RyaW5nKGJhc2U2NFVybFtpXSkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXN1bHQgPT0gbnVsbHB0cik7CisgICAgfQorfQorCitURVNUX0YoQmFzZTY0VGVzdCwgVGVzdEVuY29kZUJhc2U2NCkgeworICAgIGNvbnN0IEFTdHJpbmcgY2xlYXJUZXh0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCEiKSwKKyAgICAgICAgQVN0cmluZygiR29vZCBkYXkhIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIGNvbnN0IEFTdHJpbmcgYmFzZTY0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUm5KcFpXNWtJUT09IiksCisgICAgICAgIEFTdHJpbmcoIlIyOXZaQ0JrWVhraCIpLAorICAgICAgICBBU3RyaW5nKCIiKQorICAgIH07CisKKyAgICB2ZXJpZnlFbmNvZGUoYmFzZTY0LCBjbGVhclRleHQpOworfQorCitURVNUX0YoQmFzZTY0VGVzdCwgVGVzdEVuY29kZUJhc2U2NFVybCkgeworICAgIGNvbnN0IEFTdHJpbmcgY2xlYXJUZXh0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCAhPj8iKSwKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kICE/IiksCisgICAgICAgIEFTdHJpbmcoIkhlbGxvID8+PiBGcmllbmQgPz4iKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRVcmxbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lDRS1Qdz09IiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUm5KcFpXNWtJQ0VfIiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIHZlcmlmeUVuY29kZShiYXNlNjRVcmwsIGNsZWFyVGV4dCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKaW5kZXggMGRhMmU4MS4uZjI1M2E1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTMwLDYgKzMwLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CisKIC8qKgogICogQnVmZmVyQ2hhbm5lbEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIEFDb2RlYy4KICAqLwpAQCAtMTE3LDYgKzExOSw3IEBACiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwogICAgIHNwPElNZW1vcnk+IG1EZWNyeXB0RGVzdGluYXRpb247CiAgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKyAgICBoaWRsX21lbW9yeSBtSGlkbE1lbW9yeTsKIAogICAgIC8vIFRoZXNlIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHZpYSBzdGQ6OmF0b21pY18qIGZ1bmN0aW9ucy4KICAgICAvLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSXRlbVRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2YWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSXRlbVRhYmxlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSVRFTV9UQUJMRV9IXworI2RlZmluZSBJVEVNX1RBQkxFX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBNZXRhRGF0YTsKKworbmFtZXNwYWNlIGhlaWYgeworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeTsKK3N0cnVjdCBJbWFnZUl0ZW07CitzdHJ1Y3QgSXRlbUxvYzsKK3N0cnVjdCBJdGVtSW5mbzsKK3N0cnVjdCBJdGVtUHJvcGVydHk7CitzdHJ1Y3QgSXRlbVJlZmVyZW5jZTsKKworLyoKKyAqIEl0ZW1UYWJsZSBrZWVwcyB0cmFjayBvZiBhbGwgaW1hZ2UgaXRlbXMgKGluY2x1ZGluZyBjb2RlZCBpbWFnZXMsIGdyaWRzIGFuZAorICogdGlsZXMpIGluc2lkZSBhIEhFSUYgc3RpbGwgaW1hZ2UgKElTTy9JRUMgRkRJUyAyMzAwOC0xMi4yOjIwMTcoRSkpLgorICovCisKK2NsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJdGVtVGFibGUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQorICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoKTsKKyAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OworICAgIHN0YXR1c190IGZpbmRQcmltYXJ5SW1hZ2UodWludDMyX3QgKmltYWdlSW5kZXgpOworICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWwodWludDMyX3QgKnRodW1ibmFpbEluZGV4KTsKKyAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgICAgICB1aW50MzJfdCAqaW1hZ2VJbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgfkl0ZW1UYWJsZSgpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKKyAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+IG1Bc3NvY2lhdGlvbnM7CisgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiBtSXRlbVByb3BlcnRpZXM7CisgICAgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gbUl0ZW1SZWZlcmVuY2VzOworCisgICAgdWludDMyX3QgbVByaW1hcnlJdGVtSWQ7CisgICAgb2ZmNjRfdCBtSWRhdE9mZnNldDsKKyAgICBzaXplX3QgbUlkYXRTaXplOworCisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1SZXF1aXJlZEJveGVzOworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtQm94ZXNTZWVuOworCisgICAgYm9vbCBtSW1hZ2VJdGVtc1ZhbGlkOworICAgIHVpbnQzMl90IG1DdXJyZW50SW1hZ2VJbmRleDsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiBtSXRlbUlkVG9JbWFnZU1hcDsKKworICAgIHN0YXR1c190IHBhcnNlSWxvY0JveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSWluZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSXBycEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSWRhdEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSXJlZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBhdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbik7CisgICAgc3RhdHVzX3QgYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSh1aW50MzJfdCB0eXBlKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1UYWJsZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBoZWlmCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSVRFTV9UQUJMRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCAyYTc1Mjk4Zi4uYWM5M2I1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IGY4NDcxMTkuLmM5ZDdkZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTI4LDExICsyOCwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU2FtcGxlVGFibGU7CiBjbGFzcyBTdHJpbmc4OworbmFtZXNwYWNlIGhlaWYgeworY2xhc3MgSXRlbVRhYmxlOworfQordXNpbmcgaGVpZjo6SXRlbVRhYmxlOwogCiBzdHJ1Y3QgU2lkeEVudHJ5IHsKICAgICBzaXplX3QgbVNpemU7CkBAIC01OSw2ICs2Miw3IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHNEV4dHJhY3RvciI7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgLy8gZm9yIERSTQogICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbik7CkBAIC05Nyw2ICsxMDEsNyBAQAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKICAgICBib29sIG1Jc1FUOworICAgIGJvb2wgbUlzSEVJRjsKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKQEAgLTEzNCw2ICsxMzksOCBAQAogICAgIFNJTkYgKm1GaXJzdFNJTkY7CiAKICAgICBib29sIG1Jc0RybTsKKyAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CisKICAgICBzdGF0dXNfdCBwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KTsKIAogICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCBiN2FjNzE4Li4yNzdlYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CisgICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggZDA0OWRmNS4uNDI0MjQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CkBAIC0zMCw2ICszMSw4IEBACiAjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAKICNkZWZpbmUgVFJBQ0tfQlVGRkVSX1RJTUlORyAgICAgMAogCkBAIC00MiwyMCArNDUsNiBAQAogc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXQyUGFyYW1zOwogc3RydWN0IERhdGFDb252ZXJ0ZXI7CiAKLS8vIFRyZWJsZSBzaGFyZWQgbWVtb3J5Ci1uYW1lc3BhY2UgaGlkbCB7Ci1uYW1lc3BhY2UgYWxsb2NhdG9yIHsKLW5hbWVzcGFjZSBWMV8wIHsKLXN0cnVjdCBJQWxsb2NhdG9yOwotfSAvLyBWMV8wCi19IC8vIGFsbG9jYXRvcgotbmFtZXNwYWNlIG1lbW9yeSB7Ci1uYW1lc3BhY2UgVjFfMCB7Ci1zdHJ1Y3QgSU1lbW9yeTsKLX0gLy8gVjFfMAotfSAvLyBtZW1vcnkKLX0gLy8gaGlkbAotCiB0eXBlZGVmIGhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvciBUQWxsb2NhdG9yOwogdHlwZWRlZiBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnkgVE1lbW9yeTsKIApAQCAtNzIsOSArNjEsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICpjYXBzKTsKKyAgICBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAKQEAgLTk0LDcgKzg0LDggQEAKICAgICAvLyBzb21lIE9NWCBjb21wb25lbnRzIGFzIGF1dG8gbGV2ZWwsIGFuZCBieSBvdGhlcnMgYXMgaW52YWxpZCBsZXZlbC4KICAgICBzdGF0aWMgaW50IC8qIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKi8gZ2V0QVZDTGV2ZWxGb3IoCiAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByYXRlLCBpbnQgYml0cmF0ZSwKLSAgICAgICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSk7CisgICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRUVYVFRZUEUgcHJvZmlsZSA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19BVkNQUk9GSUxFRVhUVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKTsKIAogICAgIC8vIFF1aXJrIHN0aWxsIHN1cHBvcnRlZCwgZXZlbiB0aG91Z2ggZGVwcmVjYXRlZAogICAgIGVudW0gUXVpcmtzIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDJhYWE4ODQuLmQ2MTQ5YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAwZGQ3N2JhLi45MTk3ZjdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI0LDI3ICsyNCwzMSBAQAogCiAjZGVmaW5lIFNUUklOR0lGWV9FTlVNUwogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBCdWZmZXJQcm9kdWNlcldyYXBwZXI7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogc3RydWN0IFJlbmRlcmVkRnJhbWVJbmZvOwogY2xhc3MgU3VyZmFjZTsKK3N0cnVjdCBJQ3J5cHRvOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIsIC8qIHN0YXRpYyAqLyBDb2xvclV0aWxzIHsKICAgICAvKioKQEAgLTIwOSwxMCArMjEzLDYgQEAKICAgICAvLyByZXF1aXJlIGFuIGV4cGxpY2l0IG1lc3NhZ2UgaGFuZGxlcgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcmIC8qbmFtZSovLCBjb25zdCBBU3RyaW5nJiAvKm1pbWUqLywgYm9vbCAvKmlzRW5jb2RlciovLAotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4qIC8qY2FwcyovIC8qIG5vbm51bGwgKi8pIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIC8qc3VyZmFjZSovKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgPSAwOwpAQCAtMjU2LDEzICsyNTYsOSBAQAogICAgICAgICBtQ2FsbGJhY2sgPSBzdGQ6Om1vdmUoY2FsbGJhY2spOwogICAgIH0KIAotICAgIGlubGluZSB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSB7Ci0gICAgICAgIG1DcnlwdG8gPSBjcnlwdG87Ci0gICAgfQorICAgIHZvaWQgc2V0Q3J5cHRvKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pOwogCi0gICAgaW5saW5lIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpIHsKLSAgICAgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Ci0gICAgfQorICAgIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpOwogCiAgICAgLyoqCiAgICAgICogUXVldWUgYW4gaW5wdXQgYnVmZmVyIGludG8gdGhlIGJ1ZmZlciBjaGFubmVsLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDI3MGM4MDkuLjdhYzliMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTQ5LDE0ICs0OSwxNyBAQAogICAgICAgICAgICAgICAgIHZvaWQgKmJpdHMsCiAgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20pOworICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAorICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KTsKIAogICAgICAgICBzaXplX3QgY3JvcFdpZHRoKCkgY29uc3Q7CiAgICAgICAgIHNpemVfdCBjcm9wSGVpZ2h0KCkgY29uc3Q7CiAKICAgICAgICAgdm9pZCAqbUJpdHM7CisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1Db2xvckZvcm1hdDsKICAgICAgICAgc2l6ZV90IG1XaWR0aCwgbUhlaWdodDsKICAgICAgICAgc2l6ZV90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOworICAgICAgICBzaXplX3QgbUJwcCwgbVN0cmlkZTsKICAgICB9OwogCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdDsKQEAgLTgyLDYgKzg1LDEwIEBACiAgICAgc3RhdHVzX3QgY29udmVydFRJWVVWNDIwUGFja2VkU2VtaVBsYW5hcigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICB2b2lkIHdyaXRlVG9Ec3Qodm9pZCAqZHN0X3B0ciwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMik7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNjNlY2NlYS4uYmQ4NjNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTczLDYgKzczLDExIEBACiAgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKICAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwogCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCiAgICAgLy8gUmVhZHMgaW4gImNvdW50IiBlbnRyaWVzIG9mIHR5cGUgVCBpbnRvIHZlY3RvciAqeC4KICAgICAvLyBSZXR1cm5zIHRydWUgaWYgImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLgogICAgIC8vIElmIGZld2VyIHRoYW4gImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLCByZXR1cm4gZmFsc2UuIEluIHRoaXMgY2FzZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oCmluZGV4IDA0NDY5OWMuLmMxNDc1NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaApAQCAtMjMsNiArMjMsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGxpc3Q+CiAKQEAgLTMwLDkgKzMyLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGZW5jZTsKLWNsYXNzIEdyYXBoaWNCdWZmZXI7Ci0KIC8vIFRyYWNrcyB0aGUgcmVuZGVyIGluZm9ybWF0aW9uIGFib3V0IGEgZnJhbWUuIEZyYW1lcyBnbyB0aHJvdWdoIHNldmVyYWwgc3RhdGVzIHdoaWxlCiAvLyB0aGUgcmVuZGVyIGluZm9ybWF0aW9uIGlzIHRyYWNrZWQ6CiAvLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IGRkMzU3Y2MuLjFjN2I0YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTIwNCw3ICsyMDQsMTAgQEAKICAgICB2b2lkIGxvY2soKTsKICAgICB2b2lkIHVubG9jaygpOwogCi0gICAgdm9pZCBpbml0SW50ZXJuYWwoaW50IGZkKTsKKyAgICAvLyBJbml0IGFsbCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciBlYWNoIHJlY29yZGluZyBzZXNzaW9uLiBTb21lIHZhcmlhYmxlcworICAgIC8vIHdpbGwgb25seSBuZWVkIHRvIGJlIHNldCBmb3IgdGhlIGZpcnN0IHJlY29yZGluZyBzZXNzaW9uIGFuZCB0aGV5IHdpbGwgc3RheQorICAgIC8vIHRoZSBzYW1lIGFjcm9zcyBhbGwgdGhlIHJlY29yZGluZyBzZXNzaW9ucy4KKyAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKICAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCA0MTQwMjY2Li4xMDMwNDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtNDcsMTAgKzQ3LDEzIEBACiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogY2xhc3MgU3VyZmFjZTsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBNZWRpYUNvZGVjIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIENvbmZpZ3VyZUZsYWdzIHsKQEAgLTg0LDExICs4Nyw2IEBACiAKICAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKTsKIAotICAgIC8vIHV0aWxpdHkgbWV0aG9kIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcwotICAgIHN0YXRpYyBzdGF0dXNfdCBRdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IEFTdHJpbmcgJm1pbWUsIGJvb2wgaXNFbmNvZGVyLAotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMgLyogbm9ubnVsbCAqLyk7Ci0KICAgICBzdGF0dXNfdCBjb25maWd1cmUoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZuYXRpdmVXaW5kb3csCkBAIC0zMTYsNiArMzE0LDggQEAKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKyAgICB2b2lkIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgdm9pZCBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKIAogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggNDMwYmMxNi4uZjJiZDQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzYsNiArMzUsOCBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiAKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOworCiBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgOiBwdWJsaWMgQm5NZWRpYUNvZGVjTGlzdCB7CiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0SW5zdGFuY2UoKTsKIApAQCAtNTEsNyArNTIsNyBAQAogICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDUxMjciKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOworICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3NbaW5kZXhdOwogICAgIH0KIAogICAgIHZpcnR1YWwgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldEdsb2JhbFNldHRpbmdzKCkgY29uc3Q7CkBAIC02Miw5ICs2Myw2IEBACiAgICAgLy8gb25seSB0byBiZSB1c2VkIGJ5IGdldExvY2FsSW5zdGFuY2UKICAgICBzdGF0aWMgdm9pZCAqcHJvZmlsZXJUaHJlYWRXcmFwcGVyKHZvaWQgKiAvKmFyZyovKTsKIAotICAgIC8vIG9ubHkgdG8gYmUgdXNlZCBieSBNZWRpYVBsYXllclNlcnZpY2UKLSAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgaWdub3JlX2Vycm9ycyA9IGZhbHNlKTsKLQogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBrUHJlZmVyU29mdHdhcmVDb2RlY3MgICA9IDEsCiAgICAgICAgIGtIYXJkd2FyZUNvZGVjc09ubHkgICAgID0gMiwKQEAgLTc0LDEzICs3MiwxMSBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwKICAgICAgICAgICAgIGJvb2wgY3JlYXRlRW5jb2RlciwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGluZyk7Ci0KLSAgICBzdGF0aWMgdWludDMyX3QgZ2V0UXVpcmtzRm9yKGNvbnN0IGNoYXIgKm1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hpbmdDb2RlY3MsCisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm93bmVycyA9IG51bGxwdHIpOwogCiAgICAgc3RhdGljIGJvb2wgaXNTb2Z0d2FyZUNvZGVjKGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUpOwogCi0KIHByaXZhdGU6CiAgICAgY2xhc3MgQmluZGVyRGVhdGhPYnNlcnZlciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKTsKQEAgLTg4LDY0ICs4NCw4NiBAQAogCiAgICAgc3RhdGljIHNwPEJpbmRlckRlYXRoT2JzZXJ2ZXI+IHNCaW5kZXJEZWF0aE9ic2VydmVyOwogCi0gICAgZW51bSBTZWN0aW9uIHsKLSAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKLSAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSUywKLSAgICAgICAgU0VDVElPTl9FTkNPREVSLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9JTkNMVURFLAotICAgIH07Ci0KICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzQ29kZWNMaXN0OwogICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IHNSZW1vdGVMaXN0OwogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7Ci0gICAgaW50MzJfdCBtRGVwdGg7Ci0gICAgQVN0cmluZyBtSHJlZkJhc2U7CiAKICAgICBzcDxBTWVzc2FnZT4gbUdsb2JhbFNldHRpbmdzOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IG1PdmVycmlkZXM7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CiAKLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7Ci0gICAgc3A8TWVkaWFDb2RlY0luZm8+IG1DdXJyZW50SW5mbzsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgY2FsbCBgYnVpbGRNZWRpYUNvZGVjTGlzdCgpYCBmcm9tIHRoZSBnaXZlbgorICAgICAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBvYmplY3QuCisgICAgICovCisgICAgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSogYnVpbGRlcik7CiAKLSAgICBNZWRpYUNvZGVjTGlzdCgpOwogICAgIH5NZWRpYUNvZGVjTGlzdCgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAKLSAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKLSAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgIE1lZGlhQ29kZWNMaXN0KGNvbnN0IE1lZGlhQ29kZWNMaXN0JikgPSBkZWxldGU7CisgICAgTWVkaWFDb2RlY0xpc3QmIG9wZXJhdG9yPShjb25zdCBNZWRpYUNvZGVjTGlzdCYpID0gZGVsZXRlOwogCi0gICAgc3RhdGljIHZvaWQgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBmcmllbmQgTWVkaWFDb2RlY0xpc3RXcml0ZXI7Cit9OwogCi0gICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvIGFkZAorICogaW5mb3JtYXRpb24gdG8gdGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCisgKi8KK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlciB7CisgICAgLyoqCisgICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gYSBgTWVkaWFDb2RlY0xpc3RgJ3MgZ2xvYmFsIHNldHRpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkuCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlLgorICAgICAqLworICAgIHZvaWQgYWRkR2xvYmFsU2V0dGluZyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gYWRkIGEgbmV3IGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0IHRvIGEgYE1lZGlhQ29kZWNMaXN0YCwgYW5kCisgICAgICogcmV0dXJuIGEgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseSBhZGRlZAorICAgICAqIGBNZWRpYUNvZGVjSW5mb2AuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBgTWVkaWFDb2RlY0luZm9Xcml0ZXJgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ld2x5CisgICAgICogYWRkZWQgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCisgICAgICovCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBhZGRNZWRpYUNvZGVjSW5mbygpOworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdC4KKyAgICAgKi8KKyAgICBNZWRpYUNvZGVjTGlzdCogbUxpc3Q7CiAKLSAgICBzdGF0dXNfdCBpbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBhZGRNZWRpYUNvZGVjKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSA9IE5VTEwpOworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGlzIHdyaXRlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgTWVkaWFDb2RlY0xpc3RgCisgICAgICogb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgVGhlICJiYXNlIiBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdC4KKyAgICAgKi8KKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcihNZWRpYUNvZGVjTGlzdCogbGlzdCk7CiAKLSAgICB2b2lkIHNldEN1cnJlbnRDb2RlY0luZm8oYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKTsKKyAgICBmcmllbmQgTWVkaWFDb2RlY0xpc3Q7Cit9OwogCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSk7CisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIHVzZWQgYnkgYE1lZGlhQ29kZWNMaXN0YCB0byBmaWxsIGl0cyBtZW1iZXJzIHdpdGgKKyAqIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uLiBgYnVpbGRNZWRpYUNvZGVjTGlzdCgpYCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEKKyAqIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0IGR1cmluZyBpdHMgY29uc3RydWN0aW9uLgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CisgICAgLyoqCisgICAgICogQnVpbGQgdGhlIGBNZWRpYUNvZGVjTGlzdGAgdmlhIHRoZSBnaXZlbiBgTWVkaWFDb2RlY0xpc3RXcml0ZXJgIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBUaGUgc3RhdHVzIG9mIHRoZSBjb25zdHJ1Y3Rpb24uIGBOT19FUlJPUmAgbWVhbnMgc3VjY2Vzcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgPSAwOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNMaXN0KTsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDJlNjYzZWMuLjZhNWM2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTc5LDYgKzc5LDI2IEBACiAgICAgSEVBUlRCRUFUX0VSUk9SX0JBU0UgPSAtMzAwMCwKICAgICBFUlJPUl9IRUFSVEJFQVRfVEVSTUlOQVRFX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgICAgID0gSEVBUlRCRUFUX0VSUk9SX0JBU0UsCiAKKyAgICAvLyBDQVMtcmVsYXRlZCBlcnJvciBjb2RlcworICAgIENBU19FUlJPUl9CQVNFID0gLTQwMDAsCisKKyAgICBFUlJPUl9DQVNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UsCisgICAgRVJST1JfQ0FTX05PX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMSwKKyAgICBFUlJPUl9DQVNfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAyLAorICAgIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDMsCisgICAgRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgICA9IENBU19FUlJPUl9CQVNFIC0gNCwKKyAgICBFUlJPUl9DQVNfREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1LAorICAgIEVSUk9SX0NBU19DQU5OT1RfSEFORExFICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDYsCisgICAgRVJST1JfQ0FTX1RBTVBFUl9ERVRFQ1RFRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNywKKyAgICBFUlJPUl9DQVNfTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA4LAorICAgIEVSUk9SX0NBU19ERVZJQ0VfUkVWT0tFRCAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDksCisgICAgRVJST1JfQ0FTX1JFU09VUkNFX0JVU1kgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfQ0FTX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTiA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisgICAgRVJST1JfQ0FTX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisKKyAgICBFUlJPUl9DQVNfVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1MDAsCisgICAgRVJST1JfQ0FTX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOTk5LAorCiAgICAgLy8gTkRLIEVycm9yIGNvZGVzCiAgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKICAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKaW5kZXggYTg1NmIyYi4uNmVjN2VhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMjMsMTAgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1ldGFEYXRhOwpAQCAtNzAsMTIgKzY2LDE0IEBACiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgLyp1aWQqLykgewogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+JiAvKmNhcyovKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJi8qY2FzVG9rZW4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQogCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7fQorCiBwcm90ZWN0ZWQ6CiAgICAgTWVkaWFFeHRyYWN0b3IoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IDk2NzZiOTcuLmYyMTEzZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgogICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCiAgICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0CisgICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCisgICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAogCiAgICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCiAgICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLApAQCAtNTgsNiArNjAsNyBAQAogICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKICAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQogICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKQEAgLTIwOSw2ICsyMTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCiAgICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCiAgICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCisKKyAgICBrS2V5R3JpZFdpZHRoICAgICAgICA9ICdncmRXJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHdpZHRoCisgICAga0tleUdyaWRIZWlnaHQgICAgICAgPSAnZ3JkSCcsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBoZWlnaHQKKyAgICBrS2V5R3JpZFJvd3MgICAgICAgICA9ICdncmRSJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHJvd3MKKyAgICBrS2V5R3JpZENvbHMgICAgICAgICA9ICdncmRDJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGNvbHVtbnMKKyAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcmlmaWxlIGRhdGEKIH07CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCAzZTNjYzE3Li42YTkzYmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMjgsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwpAQCAtNjQsNyArNjAsNyBAQAogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YXNvdXJjZSk7CiAKLSAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKTsKKyAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CkBAIC0xMTUsNyArMTExLDcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKIAogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gbUltcGw7Ci0gICAgc3A8SUNhcz4gbUNhczsKKyAgICBISW50ZXJmYWNlVG9rZW4gbUNhc1Rva2VuOwogCiAgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVNlbGVjdGVkVHJhY2tzOwogICAgIGludDY0X3QgbVRvdGFsQml0cmF0ZTsgIC8vIGluIGJpdHMvc2VjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaAppbmRleCAyMDNhMTgxLi4yZjE1OWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmgKQEAgLTI4LDkgKzI4LDEwIEBACiAKICAgICBzdGF0dXNfdCBjb25uZWN0KCk7CiAgICAgc3RhdHVzX3QgY29ubmVjdChib29sKiB0cmVibGVGbGFnKTsKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcgPSBudWxscHRyKTsKIAogICAgIHN0YXR1c190IGNvbm5lY3RMZWdhY3koKTsKLSAgICBzdGF0dXNfdCBjb25uZWN0VHJlYmxlKCk7CisgICAgc3RhdHVzX3QgY29ubmVjdFRyZWJsZShjb25zdCBjaGFyKiBuYW1lID0gImRlZmF1bHQiKTsKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHNwPElPTVg+IGludGVyZmFjZSgpIHsKQEAgLTQwLDggKzQxLDggQEAKIHByaXZhdGU6CiAgICAgc3A8SU9NWD4gbU9NWDsKIAotICAgIE9NWENsaWVudChjb25zdCBPTVhDbGllbnQgJik7Ci0gICAgT01YQ2xpZW50ICZvcGVyYXRvcj0oY29uc3QgT01YQ2xpZW50ICYpOworICAgIE9NWENsaWVudChjb25zdCBPTVhDbGllbnQgJikgPSBkZWxldGU7CisgICAgT01YQ2xpZW50ICZvcGVyYXRvcj0oY29uc3QgT01YQ2xpZW50ICYpID0gZGVsZXRlOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCmluZGV4IGZkZjk5ZWIuLjFiNGQ4NzMgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0xNCwxNCArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKyNpZm5kZWYgT01YX0lORk9fQlVJTERFUl9IXworI2RlZmluZSBPTVhfSU5GT19CVUlMREVSX0hfCiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JhbWJsZXI7CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSURlc2NyYW1ibGVyIHsKLSAgICB2b2lkIHNldE1lZGlhQ2FzU2Vzc2lvbihpbiBieXRlW10gc2Vzc2lvbklkKTsKLSAgICBib29sZWFuIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChTdHJpbmcgbWltZSk7Ci0gICAgaW50IGRlc2NyYW1ibGUoaW4gTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbyk7Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBPbXhJbmZvQnVpbGRlcigpOworICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9JTkZPX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCmluZGV4IGQzOGMzMzcuLmQxNjc3ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KIAotI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogCiAjaW5jbHVkZSAiZm91bmRhdGlvbi9BQmFzZS5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggODhhNDE2YS4uNzdjYmQ0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtOTUsNyArOTUsNyBAQAogdm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogCiBBU3RyaW5nIG5hbWVGb3JGZChpbnQgZmQpOwotCit2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcyk7CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFVUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggMzFlZGIyMS4uYTI1NmE0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw4ICs0MSwxMiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0yMDMsNiArMjA3LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOwpAQCAtMjM1LDcgKzI0MCw3IEBACiAKICAgICAvLyBFbnN1cmUgaW50ZXJuYWwgYnVmZmVycyBjYW4gaG9sZCBzcGVjaWZpZWQgc2l6ZSwgYW5kIHdpbGwgcmUtYWxsb2NhdGUKICAgICAvLyBhcyBuZWVkZWQuCi0gICAgdm9pZCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTgwNyw5ICs4MTIsOSBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBuZWVkZWRTaXplKSB7Citib29sIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwgJiYgbUJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBuZWVkZWRTaXplKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgQUxPR1YoImVuc3VyZUJ1ZmZlckNhcGFjaXR5OiBjdXJyZW50IHNpemUgJXp1LCBuZXcgc2l6ZSAlenUsIHNjcmFtYmxlZCAlZCIsCkBAIC04MzcsNiArODQyLDI2IEBACiAgICAgICAgIG1NZW0gPSBuZXdNZW07CiAgICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gaGVhcC0+Z2V0SGVhcElEKCk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLAorICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAodWludDY0X3QpIHNpemU7CisKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBvZmZzZXQgJXpkLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG9mZnNldCwgc2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtODUwLDYgKzg3NSw3IEBACiAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKQEAgLTkyMyw3ICs5NDksOSBAQAogICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKLSAgICBlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKTsKKyAgICBpZiAoIWVuc3VyZUJ1ZmZlckNhcGFjaXR5KG5lZWRlZFNpemUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQogCiAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7CkBAIC0xMzY1LDQ3ICsxMzkzLDU5IEBACiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gc3ViU2FtcGxlcyA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgIHNpemVvZihEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlKSAqIGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKLQotICAgICAgICBEZXNjcmFtYmxlSW5mbyBpbmZvOwotICAgICAgICBpbmZvLmRzdFR5cGUgPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcjsKLSAgICAgICAgaW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpc2N0cmw7Ci0gICAgICAgIGluZm8ubnVtU3ViU2FtcGxlcyA9IGRlc2NyYW1ibGVTdWJTYW1wbGVzOwotICAgICAgICBpbmZvLnN1YlNhbXBsZXMgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqKXN1YlNhbXBsZXMtPmRhdGEoKTsKLSAgICAgICAgaW5mby5zcmNNZW0gPSBtTWVtOwotICAgICAgICBpbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGluZm8uZHN0UHRyID0gTlVMTDsgLy8gaW4tcGxhY2UgZGVzY3JhbWJsaW5nIGludG8gc3JjTWVtCi0gICAgICAgIGluZm8uZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOworICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1YlNhbXBsZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpdCAhPSBtU3ViU2FtcGxlcy5lbmQoKSAmJiBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXM7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKGl0LT50cmFuc3BvcnRfc2NyYW1ibGluZ19tb2RlICE9IDAgfHwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7CiAgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0ID0gaW5mby5kc3RPZmZzZXQgPSBwZXNPZmZzZXQ7Ci0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbMF0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKKyAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoaW5mbywgJnJlc3VsdCk7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOwogCi0gICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCBleGNlcHRpb25Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmJ5dGVzV3JpdHRlbiwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IF9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7CiAgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggMzc0ZTAxMS4uNDFjMTljZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ2FzOworfX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBjbGFzcyBBQml0UmVhZGVyOwogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCA5NmViNWJmLi4yMTI1OWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zNSw1ICszNSw4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAppbmRleCAwNDdiMWIzLi45ZmY0NTIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKQEAgLTE4LDE1ICsxOCwxOSBAQAogI2RlZmluZSBMT0dfVEFHICJDYXNNYW5hZ2VyIgogI2luY2x1ZGUgIkNhc01hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lNZWRpYUNhc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXI6OlByb2dyYW1DYXNNYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIFByb2dyYW1DYXNNYW5hZ2VyKHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvcik7CkBAIC0xMjUsNDUgKzEyOSw2MCBAQAogICAgICAgICAgY29uc3Qgc3A8SUNhcz4mIGNhcywKICAgICAgICAgIFBpZFRvU2Vzc2lvbk1hcCAmc2Vzc2lvbk1hcCwKICAgICAgICAgIENhc1Nlc3Npb24gKnNlc3Npb24pIHsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8SUJpbmRlcj4gY2FzU2VydmljZUJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYXMiKSk7Ci0gICAgc3A8SU1lZGlhQ2FzU2VydmljZT4gY2FzU2VydmljZSA9Ci0gICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDYXNTZXJ2aWNlPihjYXNTZXJ2aWNlQmluZGVyKTsKLQorICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPSBJTWVkaWFDYXNTZXJ2aWNlOjpnZXRTZXJ2aWNlKCJkZWZhdWx0Iik7CiAgICAgaWYgKGNhc1NlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJTWVkaWFDYXNTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICBzcDxJRGVzY3JhbWJsZXJCYXNlPiBkZXNjcmFtYmxlckJhc2U7CisgICAgUmV0dXJuPFN0YXR1cz4gcmV0dXJuU3RhdHVzKFN0YXR1czo6T0spOworICAgIFJldHVybjxzcDxJRGVzY3JhbWJsZXJCYXNlPiA+IHJldHVybkRlc2NyYW1ibGVyKE5VTEwpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBzZXNzaW9uLT5tQ0FEZXNjcmlwdG9yOwogCi0gICAgU3RhdHVzIHN0YXR1cyA9IGNhcy0+b3BlblNlc3Npb24oJnNlc3Npb25JZCk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGF1dG8gcmV0dXJuVm9pZCA9IGNhcy0+b3BlblNlc3Npb24oCisgICAgICAgICAgICBbJnN0YXR1cywgJnNlc3Npb25JZF0gKFN0YXR1cyBfc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgX3Nlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gX3Nlc3Npb25JZDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHNlc3Npb246IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVyblN0YXR1cyA9IGNhcy0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcml2YXRlIGRhdGE6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpcmV0dXJuU3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gY2FzU2VydmljZS0+Y3JlYXRlRGVzY3JhbWJsZXIoZGVzY3JpcHRvci5tU3lzdGVtSUQsICZkZXNjcmFtYmxlcik7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IGRlc2NyYW1ibGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5EZXNjcmFtYmxlciA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlEKTsKKyAgICBpZiAoIXJldHVybkRlc2NyYW1ibGVyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogdHJhbnM9JXMiLAorICAgICAgICAgICAgICAgIHJldHVybkRlc2NyYW1ibGVyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKyAgICBkZXNjcmFtYmxlckJhc2UgPSAoc3A8SURlc2NyYW1ibGVyQmFzZT4pIHJldHVybkRlc2NyYW1ibGVyOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogbnVsbCBwdHIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gZGVzY3JhbWJsZXItPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBkZXNjcmFtYmxlckJhc2UtPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCAoU3RhdHVzKSByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKKyAgICAgICAgZ290byBsX2ZhaWw7CisgICAgfQorCisgICAgZGVzY3JhbWJsZXIgPSBJRGVzY3JhbWJsZXI6OmNhc3RGcm9tKGRlc2NyYW1ibGVyQmFzZSk7CisgICAgaWYgKGRlc2NyYW1ibGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjYXN0IGZyb20gSURlc2NyYW1ibGVyQmFzZSB0byBJRGVzY3JhbWJsZXIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCkBAIC0xNzcsOCArMTk2LDggQEAKICAgICBpZiAoIXNlc3Npb25JZC5lbXB0eSgpKSB7CiAgICAgICAgIGNhcy0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQotICAgIGlmIChkZXNjcmFtYmxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlc2NyYW1ibGVyLT5yZWxlYXNlKCk7CisgICAgaWYgKGRlc2NyYW1ibGVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyYW1ibGVyQmFzZS0+cmVsZWFzZSgpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTMxNiwxMSArMzM1LDEyIEBACiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIE1lZGlhQ2FzOjpQYXJjZWxhYmxlQ2FzRGF0YSBlY20oYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbUlDYXMtPnByb2Nlc3NFY20obUNBUGlkVG9TZXNzaW9uSWRNYXBbaW5kZXhdLCBlY20pOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByb2Nlc3MgRUNNOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVjbTsKKyAgICBlY20uc2V0VG9FeHRlcm5hbCgodWludDhfdCopYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICBhdXRvIHJldHVyblN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7IC8vIGhhbmRsZWQKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKaW5kZXggODA4OGRlYy4uODFmNjU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKQEAgLTIxLDEwICsyMSwxMyBAQAogI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IEFUU1BhcnNlcjo6Q2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBDYXNNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCBjM2YxMjc0Li45ZDY4NGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTM4LDggKzM4LDEzIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7CisKIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwpAQCAtMTU2LDcgKzE2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgeworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKKyAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwogICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCA3ODkzNzlhLi5mZTUwNjU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0xOSwyMCArMTksMTkgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCi0jaW5jbHVkZSAiLi4vT01YVXRpbHMuaCIKLSNpbmNsdWRlICIuLi9PTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICIuLi9HcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIldPbXhPYnNlcnZlci5oIgotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKLSNpbmNsdWRlICJXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKLQotI2luY2x1ZGUgIk9teC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtMTE1LDE1ICsxMTQsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgaW5zdGFuY2UtPnNldEhhbmRsZShoYW5kbGUpOwotICAgICAgICBzdGQ6OnZlY3RvcjxBU3RyaW5nPiBxdWlya1ZlY3RvcjsKLSAgICAgICAgaWYgKG1QYXJzZXIuZ2V0UXVpcmtzKG5hbWUuY19zdHIoKSwgJnF1aXJrVmVjdG9yKSA9PSBPSykgeworCisgICAgICAgIC8vIEZpbmQgcXVpcmtzIGZyb20gbVBhcnNlcgorICAgICAgICBjb25zdCBhdXRvJiBjb2RlYyA9IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5maW5kKG5hbWUuY19zdHIoKSk7CisgICAgICAgIGlmIChjb2RlYyA9PSBtUGFyc2VyLmdldENvZGVjTWFwKCkuY2VuZCgpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvYnRhaW4gcXVpcmtzIGZvciBvbXggY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgIiciIDw8IG5hbWUuY19zdHIoKSA8PCAiJyAiCisgICAgICAgICAgICAgICAgICAgICJmcm9tIFhNTCBmaWxlcyI7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwotICAgICAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nIHF1aXJrIDogcXVpcmtWZWN0b3IpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcXVpcmsgOiBjb2RlYy0+c2Vjb25kLnF1aXJrU2V0KSB7CiAgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOworICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CisgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnN0YW5jZS0+c2V0UXVpcmtzKHF1aXJrcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDBlMzdhZjkuLjQ0N2FmNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC0xOSw4ICsxOSw5IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgotI2luY2x1ZGUgIk9teFN0b3JlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtMjksMjQgKzMwLDg3IEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi1PbXhTdG9yZTo6T214U3RvcmUoKSB7CitPbXhTdG9yZTo6T214U3RvcmUoCisgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIHsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoc2VhcmNoRGlycywKKyAgICAgICAgICAgIG1haW5YbWxOYW1lLAorICAgICAgICAgICAgcGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIG1QYXJzaW5nU3RhdHVzID0gdG9TdGF0dXMocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSk7CisKKyAgICBjb25zdCBhdXRvJiBzZXJ2aWNlQXR0cmlidXRlTWFwID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3QucmVzaXplKHNlcnZpY2VBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogc2VydmljZUF0dHJpYnV0ZU1hcCkgeworICAgICAgICBTZXJ2aWNlQXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICAgICAgYXR0cmlidXRlLmtleSA9IGF0dHJpYnV0ZVBhaXIuZmlyc3Q7CisgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3RbaV0gPSBzdGQ6Om1vdmUoYXR0cmlidXRlKTsKKyAgICAgICAgKytpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8mIHJvbGVNYXAgPSBwYXJzZXIuZ2V0Um9sZU1hcCgpOworICAgIG1Sb2xlTGlzdC5yZXNpemUocm9sZU1hcC5zaXplKCkpOworICAgIGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgcm9sZVBhaXIgOiByb2xlTWFwKSB7CisgICAgICAgIFJvbGVJbmZvIHJvbGU7CisgICAgICAgIHJvbGUucm9sZSA9IHJvbGVQYWlyLmZpcnN0OworICAgICAgICByb2xlLnR5cGUgPSByb2xlUGFpci5zZWNvbmQudHlwZTsKKyAgICAgICAgcm9sZS5pc0VuY29kZXIgPSByb2xlUGFpci5zZWNvbmQuaXNFbmNvZGVyOworICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHByZWZlclBsYXRmb3JtTm9kZXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbgorICAgICAgICAvLyB0aGUgeG1sIGZpbGUuIE9uY2Ugd2UgaGF2ZSBhIHdheSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24sIGl0CisgICAgICAgIC8vIHNob3VsZCBiZSBwYXJzZWQgcHJvcGVybHkuCisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGVQYWlyLmZpcnN0LmNvbXBhcmUoMCwgNSwgImF1ZGlvIikgPT0gMDsKKyAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CisgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGVQYWlyIDogcm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0KSB7CisgICAgICAgICAgICBOb2RlSW5mbyBub2RlOworICAgICAgICAgICAgbm9kZS5uYW1lID0gbm9kZVBhaXIuc2Vjb25kLm5hbWU7CisgICAgICAgICAgICBub2RlLm93bmVyID0gb3duZXI7CisgICAgICAgICAgICBoaWRsX3ZlYzxOb2RlQXR0cmlidXRlPiYgYXR0cmlidXRlTGlzdCA9IG5vZGUuYXR0cmlidXRlczsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucmVzaXplKG5vZGVQYWlyLnNlY29uZC5hdHRyaWJ1dGVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZVBhaXIgOiBub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdCkgeworICAgICAgICAgICAgICAgIE5vZGVBdHRyaWJ1dGUgYXR0cmlidXRlOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Rba10gPSBzdGQ6Om1vdmUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICArK2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlTGlzdFtqXSA9IHN0ZDo6bW92ZShub2RlKTsKKyAgICAgICAgICAgICsrajsKKyAgICAgICAgfQorICAgICAgICBtUm9sZUxpc3RbaV0gPSBzdGQ6Om1vdmUocm9sZSk7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBtUHJlZml4ID0gcGFyc2VyLmdldENvbW1vblByZWZpeCgpOwogfQogCiBPbXhTdG9yZTo6fk9teFN0b3JlKCkgewogfQogCiBSZXR1cm48dm9pZD4gT214U3RvcmU6Omxpc3RTZXJ2aWNlQXR0cmlidXRlcyhsaXN0U2VydmljZUF0dHJpYnV0ZXNfY2IgX2hpZGxfY2IpIHsKLSAgICBfaGlkbF9jYih0b1N0YXR1cyhOT19FUlJPUiksIGhpZGxfdmVjPFNlcnZpY2VBdHRyaWJ1dGU+KCkpOworICAgIGlmIChtUGFyc2luZ1N0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Tk9fRVJST1IsIG1TZXJ2aWNlQXR0cmlidXRlTGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IobVBhcnNpbmdTdGF0dXMsIGhpZGxfdmVjPFNlcnZpY2VBdHRyaWJ1dGU+KCkpOworICAgIH0KICAgICByZXR1cm4gVm9pZCgpOwogfQogCiBSZXR1cm48dm9pZD4gT214U3RvcmU6OmdldE5vZGVQcmVmaXgoZ2V0Tm9kZVByZWZpeF9jYiBfaGlkbF9jYikgewotICAgIF9oaWRsX2NiKGhpZGxfc3RyaW5nKCkpOworICAgIF9oaWRsX2NiKG1QcmVmaXgpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKIFJldHVybjx2b2lkPiBPbXhTdG9yZTo6bGlzdFJvbGVzKGxpc3RSb2xlc19jYiBfaGlkbF9jYikgewotICAgIF9oaWRsX2NiKGhpZGxfdmVjPFJvbGVJbmZvPigpKTsKKyAgICBfaGlkbF9jYihtUm9sZUxpc3QpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKQEAgLTU0LDEyICsxMTgsNiBAQAogICAgIHJldHVybiBJT214Ojp0cnlHZXRTZXJ2aWNlKG9teE5hbWUpOwogfQogCi0vLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCi0KLUlPbXhTdG9yZSogSElETF9GRVRDSF9JT214U3RvcmUoY29uc3QgY2hhciogLyogbmFtZSAqLykgewotICAgIHJldHVybiBuZXcgT214U3RvcmUoKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCiB9ICAvLyBuYW1lc3BhY2UgVjFfMAogfSAgLy8gbmFtZXNwYWNlIG9teApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKaW5kZXggOTMyN2YwMy4uNjM5YjM1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogCi0jaW5jbHVkZSAiV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oIgotI2luY2x1ZGUgIldQcm9kdWNlckxpc3RlbmVyLmgiCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQxLDcgKzQxLDkgQEAKICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPnJlcXVlc3RCdWZmZXIoc2xvdCwgJmJ1Zik7CiAgICAgQW53QnVmZmVyIGFud0J1ZmZlcnt9OwotICAgIHdyYXBBcygmYW53QnVmZmVyLCAqYnVmKTsKKyAgICBpZiAoYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgd3JhcEFzKCZhbndCdWZmZXIsICpidWYpOworICAgIH0KICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBhbndCdWZmZXIpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CkBAIC02NCwxMCArNjYsOSBAQAogICAgIHNwPEZlbmNlPiBmZW5jZTsKICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgb3V0VGltZXN0YW1wczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+ZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICZzbG90LCAmZmVuY2UsCi0gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8OjphbmRyb2lkOjpQaXhlbEZvcm1hdD4oZm9ybWF0KSwgdXNhZ2UsCi0gICAgICAgICAgICBnZXRGcmFtZVRpbWVzdGFtcHMgPyAmb3V0VGltZXN0YW1wcyA6IG51bGxwdHIpOworICAgICAgICAmc2xvdCwgJmZlbmNlLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLCB1c2FnZSwgbnVsbHB0ciwKKyAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKICAgICBoaWRsX2hhbmRsZSB0RmVuY2V7fTsKICAgICBGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBze307CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggZDg1NDBmOC4uMzIwMWMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTE3LDE1ICsxNywxNCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUV0dyYXBoaWNCdWZmZXJTb3VyY2UiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214QnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotCi0jaW5jbHVkZSAib214L09NWFV0aWxzLmgiCi0jaW5jbHVkZSAiV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtNjgsNyArNjcsMTQgQEAKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMSA9IGRhdGFTcGFjZTsKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMiA9IGFzcGVjdHM7CiAgICAgICAgIHRNc2cuZGF0YS5ldmVudERhdGEuZGF0YTMgPSBwaXhlbEZvcm1hdDsKLSAgICAgICAgbU9teE5vZGUtPmRpc3BhdGNoTWVzc2FnZSh0TXNnKTsKKyAgICAgICAgaWYgKCFtT214Tm9kZS0+ZGlzcGF0Y2hNZXNzYWdlKHRNc2cpLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRXT214Tm9kZVdyYXBwZXIgZmFpbGVkIHRvIGRpc3BhdGNoIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgICAiT01YX0V2ZW50RGF0YVNwYWNlQ2hhbmdlZDogIgorICAgICAgICAgICAgICAgICAgICAiZGF0YVNwYWNlID0gJWxkLCBhc3BlY3RzID0gJWxkLCBwaXhlbEZvcm1hdCA9ICVsZCIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KGRhdGFTcGFjZSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KGFzcGVjdHMpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihwaXhlbEZvcm1hdCkpOworICAgICAgICB9CiAgICAgfQogfTsKIApAQCAtMTQ0LDEwICsxNTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtcy5kYXRhKCkgKyBvdXRQYXJhbXMuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKICAgICAgICAgICAgIH0pOwotICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICBhdXRvIHRyYW5zU3RhdHVzID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMpLAogICAgICAgICAgICAgaW5IaWRsQnl0ZXMoJmNvbnN1bWVyVXNhZ2UsIHNpemVvZihjb25zdW1lclVzYWdlKSksCiAgICAgICAgICAgICBfaGlkbF9jYik7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzKEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgfQogICAgIGlmIChmblN0YXR1cyAhPSBPSykgewogICAgICAgICBjb25zdW1lclVzYWdlID0gMDsKICAgICB9CkBAIC0xNTgsMTAgKzE2NywxMyBAQAogCiAgICAgX3BhcmFtcyA9ICZkZWY7CiAgICAgcGFyYW1zID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KF9wYXJhbXMpOwotICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICB0cmFuc1N0YXR1cyA9IG9teE5vZGUtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSwKICAgICAgICAgICAgIGluSGlkbEJ5dGVzKCZkZWYsIHNpemVvZihkZWYpKSwKICAgICAgICAgICAgIF9oaWRsX2NiKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gdG9TdGF0dXMoRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICB9CiAgICAgaWYgKGZuU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHBvcnQgZGVmaW5pdGlvbjogJWQiLCBmblN0YXR1cyk7CiAgICAgICAgIHJldHVybiB0b1N0YXR1cyhmblN0YXR1cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcAppbmRleCA4MDMyODNhLi5jOGM5NjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAKQEAgLTE2LDggKzE2LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgIldPbXhCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCmluZGV4IDZjMGFiYzkuLjFkYzdjN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCkBAIC0xNiw5ICsxNiw5IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIldPbXhCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwCmluZGV4IDM1NGRiMjkuLmNjYmUyNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAKQEAgLTE2LDE0ICsxNiwxNCBAQAogCiAjZGVmaW5lIExPR19UQUcgIldPbXhPYnNlcnZlci1pbXBsIgogCi0jaW5jbHVkZSA8dmVjdG9yPgotCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KIAotI2luY2x1ZGUgIldPbXhPYnNlcnZlci5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcAppbmRleCBiZTBkNGQ1Li5iZGMzYWExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIldQcm9kdWNlckxpc3RlbmVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCAyZDkyMWY5Li5kNGNkZjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtMSwxMiArMSwxNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKICAgICAgICAgIkdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAiT01YLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTWFzdGVyLmNwcCIsCiAgICAgICAgICJPTVhOb2RlSW5zdGFuY2UuY3BwIiwKICAgICAgICAgIk9NWFV0aWxzLmNwcCIsCkBAIC0yNSwxNCArMjksMTYgQEAKICAgICAgICAgIjEuMC9XT214QnVmZmVyU291cmNlLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLCAvLyBmb3IgbWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmgKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtNDUsMTIgKzUxLDEyIEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCkBAIC01OSw3ICs2NSwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgIF0sCiAKLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICBdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTgwLDE1ICs5MSwyOSBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogICAgIHNyY3M6IFsiT01YVXRpbHMuY3BwIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgXSwKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNzlmNmQ5My4uOTRlZjU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTE3LDE1ICsxNywxMyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UiCiAKLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAKLSNpbmNsdWRlICJPTVhVdGlscy5oIgotI2luY2x1ZGUgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCmluZGV4IDlhNDk1MmUuLjBjNTBjNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkZyYW1lRHJvcHBlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkZyYW1lRHJvcHBlci5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBlZjRkNzQ1Li4xOTE3ZDJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0yMiw3ICsyMiw5IEBACiAKICNkZWZpbmUgU1RSSU5HSUZZX0VOVU1TIC8vIGZvciBhc1N0cmluZyBpbiBIYXJkd2FyZUFQSS5oL1ZpZGVvQVBJLmgKIAotI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KQEAgLTMxLDE0ICszMywxMiBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSAib214L09NWFV0aWxzLmgiCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgIm1lZGlhL09NWEJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KQEAgLTczMyw3ICs3MzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKICAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9IHN0ZDo6bGxyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzKTsKKyAgICAgICAgICAgICAgICAgICAgKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMCk7CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKQEAgLTc0MSw5ICs3NDEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUZyYW1lQ291bnQgKz0gbkZyYW1lczsKICAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgKyBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50IC8gbUNhcHR1cmVGcHMpOworICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtQ2FwdHVyZUZwcyk7CiAgICAgICAgICAgICBtUHJldkZyYW1lVXMgPSBtQmFzZUZyYW1lVXMgKyBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50IC8gbUZwcyk7CisgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogMTAwMDAwMCAvIG1GcHMpOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkLCBjYXB0dXJlVXMgJWxsZCwgZnJhbWVVcyAlbGxkIiwKQEAgLTk1NiwyOCArOTU2LDQwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIHVpbnQ2NF90IHNsb3RNYXNrOwotICAgIGlmIChtQ29uc3VtZXItPmdldFJlbGVhc2VkQnVmZmVycygmc2xvdE1hc2spICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJvbkJ1ZmZlcnNSZWxlYXNlZDogdW5hYmxlIHRvIGdldCByZWxlYXNlZCBidWZmZXIgc2V0Iik7CisgICAgdWludDY0X3QgcmVsZWFzZU1hc2s7CisgICAgaWYgKG1Db25zdW1lci0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZyZWxlYXNlTWFzaykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CisgICAgICAgIEFMT0dXKCJvbkJ1ZmZlcnNSZWxlYXNlZDogdW5hYmxlIHRvIGdldCByZWxlYXNlZCBidWZmZXIgc2V0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xvdE1hc2sgPSByZWxlYXNlTWFzazsKKyAgICAgICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkOiAweCUwMTYiIFBSSXg2NCwgc2xvdE1hc2spOwogICAgIH0KIAotICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKLQorICAgIEFTdHJpbmcgdW5wb3B1bGF0ZWQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7CiAgICAgICAgIGlmICgoc2xvdE1hc2sgJiAweDAxKSAhPSAwKSB7Ci0gICAgICAgICAgICBkaXNjYXJkQnVmZmVySW5TbG90X2woaSk7CisgICAgICAgICAgICBpZiAoIWRpc2NhcmRCdWZmZXJJblNsb3RfbChpKSkgeworICAgICAgICAgICAgICAgIGlmICghdW5wb3B1bGF0ZWQuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICB1bnBvcHVsYXRlZC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVucG9wdWxhdGVkLmFwcGVuZChpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzbG90TWFzayA+Pj0gMTsKICAgICB9CisgICAgaWYgKCF1bnBvcHVsYXRlZC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlZCB1bnBvcHVsYXRlZCBzbG90czogWyVzXSIsIHVucG9wdWxhdGVkLmNfc3RyKCkpOworICAgIH0KIH0KIAotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpkaXNjYXJkQnVmZmVySW5TbG90X2woR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2xvdF9pZCBpKSB7Citib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmRpc2NhcmRCdWZmZXJJblNsb3RfbChHcmFwaGljQnVmZmVyU291cmNlOjpzbG90X2lkIGkpIHsKICAgICBzc2l6ZV90IGJzaSA9IG1CdWZmZXJTbG90cy5pbmRleE9mS2V5KGkpOwogICAgIGlmIChic2kgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNpbmcgYW4gdW5wb3B1bGF0ZWQgc2xvdDogJWQiLCBpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sKGJzaSk7CiAgICAgICAgIG1CdWZmZXJTbG90cy5yZW1vdmVJdGVtc0F0KGJzaSk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCA4YzExNDFkLi4wOWM0MDE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMjIsMTUgKzIyLDEyIEBACiAKICNpbmNsdWRlIDxkbGZjbi5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9PTVguaCIKLQotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLQotI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgotI2luY2x1ZGUgIk9NWFV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTE4LDE1ICsxMTUsMjIgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogICAgIH0KICAgICBpbnN0YW5jZS0+c2V0SGFuZGxlKGhhbmRsZSk7Ci0gICAgc3RkOjp2ZWN0b3I8QVN0cmluZz4gcXVpcmtWZWN0b3I7Ci0gICAgaWYgKG1QYXJzZXIuZ2V0UXVpcmtzKG5hbWUsICZxdWlya1ZlY3RvcikgPT0gT0spIHsKKworICAgIC8vIEZpbmQgcXVpcmtzIGZyb20gbVBhcnNlcgorICAgIGNvbnN0IGF1dG8mIGNvZGVjID0gbVBhcnNlci5nZXRDb2RlY01hcCgpLmZpbmQobmFtZSk7CisgICAgaWYgKGNvZGVjID09IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5jZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBvYnRhaW4gcXVpcmtzIGZvciBvbXggY29tcG9uZW50ICclcycgZnJvbSBYTUwgZmlsZXMiLAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0gZWxzZSB7CiAgICAgICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7Ci0gICAgICAgIGZvciAoY29uc3QgQVN0cmluZyBxdWlyayA6IHF1aXJrVmVjdG9yKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcXVpcmsgOiBjb2RlYy0+c2Vjb25kLnF1aXJrU2V0KSB7CiAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgewotICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKKyAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7Ci0gICAgICAgICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKKyAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpbnN0YW5jZS0+c2V0UXVpcmtzKHF1aXJrcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCmluZGV4IGFjOWIwYzMuLmZkOTdmZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCkBAIC0xOCwxNSArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiT01YTWFzdGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiT01YTWFzdGVyLmgiCi0KLSNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogT01YTWFzdGVyOjpPTVhNYXN0ZXIoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCAwMzU5NDdlLi4yZTc4MTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjAsMjAgKzIwLDIwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCIKLSNpbmNsdWRlICJPTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICJPTVhVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+Ci0jaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiAjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAKQEAgLTI0Niw2ICsyNDYsMTUgQEAKICAgICB2aXJ0dWFsIH5DYWxsYmFja0Rpc3BhdGNoZXIoKTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIGJhdGNoaW5nLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwIGluIGEKKyAgICAgICAgLy8gc2luZ2xlIEFNZXNzYWdlIGluIE1lZGlhQ29kZWMgd2hlbiBpdCBpcyBzaWduYWxlZCB0byB0aGUgYXBwLiBBTWVzc2FnZSBjYW4gY29udGFpbgorICAgICAgICAvLyB1cC10byA2NCBrZXktdmFsdWUgcGFpcnMsIGFuZCBlYWNoIGZyYW1lX3JlbmRlcmVkIG1lc3NhZ2UgdXNlcyAyIGtleXMsIHNvIHRoZSBtYXgKKyAgICAgICAgLy8gdmFsdWUgZm9yIHRoaXMgd291bGQgYmUgMzIuIE5vbmV0aGVsZXNzLCBsaW1pdCB0aGlzIHRvIDEyIHRvIHdoaWNoIGdpdmVzIGF0IGxlYXN0IDEwCisgICAgICAgIC8vIG1zZWNvbmRzIG9mIGJhdGNoaW5nIGF0IDEyMEh6LgorICAgICAgICBrTWF4UXVldWVTaXplID0gMTIsCisgICAgfTsKKwogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgc3A8T01YTm9kZUluc3RhbmNlPiBjb25zdCBtT3duZXI7CkBAIC0yOTAsNyArMjk5LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgbVF1ZXVlLnB1c2hfYmFjayhtc2cpOwotICAgIGlmIChyZWFsVGltZSkgeworICAgIGlmIChyZWFsVGltZSB8fCBtUXVldWUuc2l6ZSgpID49IGtNYXhRdWV1ZVNpemUpIHsKICAgICAgICAgbVF1ZXVlQ2hhbmdlZC5zaWduYWwoKTsKICAgICB9CiB9CkBAIC02NzAsNiArNjc5LDExIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgaWYgKG1TYWlsZWQgfHwgbU51bVBvcnRCdWZmZXJzW3BvcnRJbmRleF0gPiAwKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIENMT0dfQ09ORklHKHNldFBvcnRNb2RlLCAiJXMoJWQpLCBwb3J0ICVkIiwgYXNTdHJpbmcobW9kZSksIG1vZGUsIHBvcnRJbmRleCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKQEAgLTExMDUsNyArMTExOSw2IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUJ1ZmZlcl9sKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgY29uc3Qgc3A8SUhpZGxNZW1vcnk+ICZoUGFyYW1zLCBJT01YOjpidWZmZXJfaWQgKmJ1ZmZlcikgewotCiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGE7CiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9FcnJvck5vbmU7CkBAIC0yMjM2LDggKzIyNDksOCBAQAogICAgICAgICAgICAgbXNnLmZlbmNlRmQgPSAtMTsKICAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLnRpbWVzdGFtcCA9IHJlbmRlckRhdGFbaV0ubk1lZGlhVGltZVVzOwogICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEubmFub1RpbWUgPSByZW5kZXJEYXRhW2ldLm5TeXN0ZW1UaW1lTnM7Ci0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tRGlzcGF0Y2hlci0+cG9zdChtc2csIGZhbHNlIC8qIHJlYWxUaW1lICovKTsKKyAgICAgICAgICAgIGJvb2wgcmVhbFRpbWUgPSBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPT0gSU5UNjRfTUFYOworICAgICAgICAgICAgaW5zdGFuY2UtPm1EaXNwYXRjaGVyLT5wb3N0KG1zZywgcmVhbFRpbWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTMzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPTVhTdG9yZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdHJ1Y3QgUm9sZVByb3BlcnRpZXMgeworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlOworICAgICAgICBib29sIGlzRW5jb2RlcjsKKyAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzOworICAgICAgICBzdGQ6Om11bHRpbWFwPHNpemVfdCwgSU9NWFN0b3JlOjpOb2RlSW5mbz4gbm9kZUxpc3Q7CisgICAgfTsKK30gIC8vIFVubmFtZWQgbmFtZXNwYWNlCisKK09NWFN0b3JlOjpPTVhTdG9yZSgKKyAgICAgICAgY29uc3QgY2hhciogb3duZXIsCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCkgeworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcigKKyAgICAgICAgICAgIHNlYXJjaERpcnMsCisgICAgICAgICAgICBtYWluWG1sTmFtZSwKKyAgICAgICAgICAgIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgICAgIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKKyAgICBtUGFyc2luZ1N0YXR1cyA9IHBhcnNlci5nZXRQYXJzaW5nU3RhdHVzKCk7CisKKyAgICBjb25zdCBhdXRvJiBzZXJ2aWNlQXR0cmlidXRlTWFwID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3QucmVzZXJ2ZShzZXJ2aWNlQXR0cmlidXRlTWFwLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogc2VydmljZUF0dHJpYnV0ZU1hcCkgeworICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlOworICAgICAgICBhdHRyaWJ1dGUua2V5ID0gYXR0cmlidXRlUGFpci5maXJzdDsKKyAgICAgICAgYXR0cmlidXRlLnZhbHVlID0gYXR0cmlidXRlUGFpci5zZWNvbmQ7CisgICAgICAgIG1TZXJ2aWNlQXR0cmlidXRlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKGF0dHJpYnV0ZSkpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8mIHJvbGVNYXAgPSBwYXJzZXIuZ2V0Um9sZU1hcCgpOworICAgIG1Sb2xlTGlzdC5yZXNlcnZlKHJvbGVNYXAuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJvbGVQYWlyIDogcm9sZU1hcCkgeworICAgICAgICBSb2xlSW5mbyByb2xlOworICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKKyAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CisgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKKyAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KKyAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAorICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgorICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHN0ZDo6dmVjdG9yPE5vZGVJbmZvPiYgbm9kZUxpc3QgPSByb2xlLm5vZGVzOworICAgICAgICBub2RlTGlzdC5yZXNlcnZlKHJvbGVQYWlyLnNlY29uZC5ub2RlTGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGVQYWlyIDogcm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0KSB7CisgICAgICAgICAgICBOb2RlSW5mbyBub2RlOworICAgICAgICAgICAgbm9kZS5uYW1lID0gbm9kZVBhaXIuc2Vjb25kLm5hbWU7CisgICAgICAgICAgICBub2RlLm93bmVyID0gb3duZXI7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+JiBhdHRyaWJ1dGVMaXN0ID0gbm9kZS5hdHRyaWJ1dGVzOworICAgICAgICAgICAgYXR0cmlidXRlTGlzdC5yZXNlcnZlKG5vZGVQYWlyLnNlY29uZC5hdHRyaWJ1dGVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZVBhaXIgOiBub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdCkgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlLmtleSA9IGF0dHJpYnV0ZVBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID0gYXR0cmlidXRlUGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShub2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgbVJvbGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUocm9sZSkpOworICAgIH0KKworICAgIG1QcmVmaXggPSBwYXJzZXIuZ2V0Q29tbW9uUHJlZml4KCk7Cit9CisKK3N0YXR1c190IE9NWFN0b3JlOjpsaXN0U2VydmljZUF0dHJpYnV0ZXMoc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgeworICAgICphdHRyaWJ1dGVzID0gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OworICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKK30KKworc3RhdHVzX3QgT01YU3RvcmU6OmdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgeworICAgICpwcmVmaXggPSBtUHJlZml4OworICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKK30KKworc3RhdHVzX3QgT01YU3RvcmU6Omxpc3RSb2xlcyhzdGQ6OnZlY3RvcjxSb2xlSW5mbz4qIHJvbGVMaXN0KSB7CisgICAgKnJvbGVMaXN0ID0gbVJvbGVMaXN0OworICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKK30KKworc3RhdHVzX3QgT01YU3RvcmU6OmdldE9teChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3A8SU9NWD4qIG9teCkgeworICAgICpvbXggPSBuZXcgT01YKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitPTVhTdG9yZTo6fk9NWFN0b3JlKCkgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAppbmRleCBhNjZkNTY1Li41ODk0ODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKQEAgLTE5LDEzICsxOSwxMyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLWJhc2UuaD4KLSNpbmNsdWRlICJPTVhVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBkODljYjk5Li44N2MyNDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggZGY5NzhmOC4uZWUyNjllMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMTgsOCArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJTb2Z0T01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCi0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAppbmRleCBmY2NiMTJiLi40OTQ2YWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC0xOCw4ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhQbHVnaW4iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTg1LDcgKzg1LDIxIEBACiAgICAgICAgIGxpYk5hbWUuYXBwZW5kKGtDb21wb25lbnRzW2ldLm1MaWJOYW1lU3VmZml4KTsKICAgICAgICAgbGliTmFtZS5hcHBlbmQoIi5zbyIpOwogCi0gICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJOYW1lLmNfc3RyKCksIFJUTERfTk9XKTsKKyAgICAgICAgLy8gUlRMRF9OT0RFTEVURSBtZWFucyB3ZSBrZWVwIHRoZSBzaGFyZWQgbGlicmFyeSBhcm91bmQgZm9yZXZlci4KKyAgICAgICAgLy8gdGhpcyBlbGltaW5hdGVzIHRocmFzaGluZyBkdXJpbmcgc2VxdWVuY2VzIGxpa2UgbG9hZGluZyBzb3VuZHBvb2xzLgorICAgICAgICAvLyBJdCBhbHNvIGxlYXZlcyB0aGUgcmVzdCBvZiB0aGUgbG9naWMgYXJvdW5kIHRoZSBkbG9wZW4oKS9kbGNsb3NlKCkKKyAgICAgICAgLy8gY2FsbHMgaW4gdGhpcyBmaWxlIHVuY2hhbmdlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW1wbGljYXRpb25zIG9mIHRoZSBjaGFuZ2U6CisgICAgICAgIC8vIC0tIHRoZSBjb2RlYyBwcm9jZXNzICh3aGVyZSB0aGlzIGhhcHBlbnMpIHdpbGwgaGF2ZSBhIHNsaWdodGx5IGxhcmdlcgorICAgICAgICAvLyAgICBsb25nLXRlcm0gbWVtb3J5IGZvb3RwcmludCBhcyBpdCBhY2N1bXVsYXRlcyB0aGUgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgICAgIC8vICAgIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5LgorICAgICAgICAvLyAtLSBwbHVnaW4gY29kZWNzIGNhbiBubyBsb25nZXIgKGFuZCBuZXZlciBzaG91bGQgaGF2ZSkgZGVwZW5kIG9uIGEKKyAgICAgICAgLy8gICAgZnJlZSByZXNldCBvZiBhbnkgc3RhdGljIGRhdGEgYXMgdGhlIGxpYnJhcnkgd291bGQgaGF2ZSBjcm9zc2VkCisgICAgICAgIC8vICAgIGEgZGxjbG9zZS9kbG9wZW4gY3ljbGUuCisgICAgICAgIC8vCisKKyAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CiAKICAgICAgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGRsb3BlbiAlczogJXMiLCBsaWJOYW1lLmNfc3RyKCksIGRsZXJyb3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOTIwZGQxOC4uY2I4MTFhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjAsMTQgKzIwLDE0IEBACiAjZGVmaW5lIExPR19UQUcgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTgyLDExICsxODIsMTEgQEAKIAogCiB1aW50MzJfdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvdXRwdXRCdWZmZXJXaWR0aCgpIHsKLSAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IG1XaWR0aDsKKyAgICByZXR1cm4gbWF4KG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4V2lkdGggOiAwLCBtV2lkdGgpOwogfQogCiB1aW50MzJfdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvdXRwdXRCdWZmZXJIZWlnaHQoKSB7Ci0gICAgcmV0dXJuIG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4SGVpZ2h0IDogbUhlaWdodDsKKyAgICByZXR1cm4gbWF4KG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4SGVpZ2h0IDogMCwgbUhlaWdodCk7CiB9CiAKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDQxZDYzNGEuLjZlNTYzYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTIxLDI1ICsyMSwyMiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiAjaW5jbHVkZSA8dWkvRmVuY2UuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAjaW5jbHVkZSA8dWkvUmVjdC5oPgogCiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCiAjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CiAKLSNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBzdGF0aWMgT01YX0NPTE9SX0ZPUk1BVFRZUEUga1N1cHBvcnRlZENvbG9yRm9ybWF0c1tdID0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggZmQ5MTU3NC4uOGQ4YTJkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+CiAjaW5jbHVkZSA8dWkvRmVuY2VUaW1lLmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+Ci0jaW5jbHVkZSA8VmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CkBAIC0yMDY0LDggKzIwNjQsMTAgQEAKICAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7CiAgICAgbnVtRmRzID0gYmFzZU51bUZkczsKICAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICBpZiAobmggIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShuaCk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAppbmRleCAyMzc4NGFhLi5hNmE5ZDNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKQEAgLTIwLDEwICsyMCw5IEBACiAjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCIKLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaAppbmRleCBmMzc3ZjVhLi4wMDZkMmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTQxLDE3ICs0MiwzMSBAQAogdXNpbmcgOjphbmRyb2lkOjp3cDsKIAogc3RydWN0IE9teFN0b3JlIDogcHVibGljIElPbXhTdG9yZSB7Ci0gICAgT214U3RvcmUoKTsKKyAgICBPbXhTdG9yZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyID0gImRlZmF1bHQiLAorICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlycywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdE1haW5YbWxOYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGVyZm9ybWFuY2VYbWxOYW1lCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKKwogICAgIHZpcnR1YWwgfk9teFN0b3JlKCk7CiAKLSAgICAvLyBNZXRob2RzIGZyb20gSU9teAorICAgIC8vIE1ldGhvZHMgZnJvbSBJT214U3RvcmUKICAgICBSZXR1cm48dm9pZD4gbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKGxpc3RTZXJ2aWNlQXR0cmlidXRlc19jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IGdldE5vZGVQcmVmaXgoZ2V0Tm9kZVByZWZpeF9jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IGxpc3RSb2xlcyhsaXN0Um9sZXNfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjxzcDxJT214Pj4gZ2V0T214KGhpZGxfc3RyaW5nIGNvbnN0Jikgb3ZlcnJpZGU7Ci19OwogCi1leHRlcm4gIkMiIElPbXhTdG9yZSogSElETF9GRVRDSF9JT214U3RvcmUoY29uc3QgY2hhciogbmFtZSk7Citwcm90ZWN0ZWQ6CisgICAgU3RhdHVzIG1QYXJzaW5nU3RhdHVzOworICAgIGhpZGxfc3RyaW5nIG1QcmVmaXg7CisgICAgaGlkbF92ZWM8U2VydmljZUF0dHJpYnV0ZT4gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OworICAgIGhpZGxfdmVjPFJvbGVJbmZvPiBtUm9sZUxpc3Q7Cit9OwogCiB9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KIH0gIC8vIG5hbWVzcGFjZSBWMV8wCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCA0NTQ5Yzk3Li5iOWYyMmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL0JuR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSAiLi4vR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaAppbmRleCBkNzE1Mzc0Li4zOGQ1ODg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhPYnNlcnZlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggMjliNTFhOC4uODRmZWU2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCi0jaW5jbHVkZSA8VmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CkBAIC0yNjQsOCArMjY0LDggQEAKICAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWRfbChjb25zdCBWaWRlb0J1ZmZlciAmYnVmZmVyKTsKIAogICAgIC8vIG1hcmtzIHRoZSBidWZmZXIgYXQgdGhlIHNsb3Qgbm8gbG9uZ2VyIGNhY2hlZCwgYW5kIGFjY291bnRzIGZvciB0aGUgb3V0c3RhbmRpbmcKLSAgICAvLyBhY3F1aXJlIGNvdW50Ci0gICAgdm9pZCBkaXNjYXJkQnVmZmVySW5TbG90X2woc2xvdF9pZCBpKTsKKyAgICAvLyBhY3F1aXJlIGNvdW50LiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsb3Qgd2FzIHBvcHVsYXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICBib29sIGRpc2NhcmRCdWZmZXJJblNsb3RfbChzbG90X2lkIGkpOwogCiAgICAgLy8gbWFya3MgdGhlIGJ1ZmZlciBhdCB0aGUgc2xvdCBpbmRleCBubyBsb25nZXIgY2FjaGVkLCBhbmQgYWNjb3VudHMgZm9yIHRoZSBvdXRzdGFuZGluZwogICAgIC8vIGFjcXVpcmUgY291bnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0lPbXhOb2RlV3JhcHBlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvSU9teE5vZGVXcmFwcGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCmluZGV4IDRhZjNkMzkuLjU5NGI0YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogI2luY2x1ZGUgIk9teE5vZGVPd25lci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggM2Y5YzBjYS4uODk3ZjI4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIE9NWF9NQVNURVJfSF8KIAotI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IDAwYzM3ZTEuLjEwNjVjYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCkBAIC05Miw2ICs5MiwxNSBAQAogICAgIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyTmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwogCisgICAgLy8gUXVpcmsgc3RpbGwgc3VwcG9ydGVkLCBldmVuIHRob3VnaCBkZXByZWNhdGVkCisgICAgZW51bSBRdWlya3MgeworICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cyAgID0gMSwKKyAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzICA9IDIsCisKKyAgICAgICAga1F1aXJrc01hc2sgPSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cworICAgICAgICAgICAgICAgICAgICB8IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cywKKyAgICB9OworCiAgICAgc3RhdHVzX3Qgc2V0UXVpcmtzKE9NWF9VMzIgcXVpcmtzKTsKIAogICAgIGJvb2wgaXNTZWN1cmUoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGQ3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX09NWFNUT1JFX0hfCisjZGVmaW5lIEFORFJPSURfT01YU1RPUkVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgT01YU3RvcmUgOiBwdWJsaWMgQm5PTVhTdG9yZSB7CitwdWJsaWM6CisgICAgT01YU3RvcmUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciA9ICJkZWZhdWx0IiwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aAorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisKKyAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlOworCisgICAgfk9NWFN0b3JlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKKyAgICBzdGQ6OnN0cmluZyBtUHJlZml4OworICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OworICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiBtUm9sZUxpc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfT01YU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaAppbmRleCBjODljZDg3Li44ZWM3MTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgU09GVF9PTVhfUExVR0lOX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8T01YUGx1Z2luQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL09NWFBsdWdpbkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcAppbmRleCBmOTY2YjVlLi5hOTI1ZGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcAppbmRleCAyNTk5NjA4Li4wYzIyYTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0T3ZlcnJpZGVzU3RyW10gPQpAQCAtMTE3LDcgKzExOSw3IEBACiAvLyBUT0RPOiB0aGUgY29kZWMgY29tcG9uZW50IG5ldmVyIHJldHVybnMgT01YX0V2ZW50Q21kQ29tcGxldGUgaW4gdW5pdCB0ZXN0LgogVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgRElTQUJMRURfcHJvZmlsZUNvZGVjcykgewogICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwotICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGluZm9zOworICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gaW5mb3M7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5jb3VudENvZGVjcygpOyArK2kpIHsKICAgICAgICAgaW5mb3MucHVzaF9iYWNrKGxpc3QtPmdldENvZGVjSW5mbyhpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvQW5kcm9pZC5icApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMmYxMGNiMS4uMzUwNzI4NCAxMDA2NDQKLS0tIGEvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMTQgKzEsMTYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIk1lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTcsNiArMTksNyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMzEsNiArMzQsMTAgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTA1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjc1htbFBhcnNlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogU2VhcmNoIGZvciBhIGZpbGUgaW4gYSBsaXN0IG9mIHNlYXJjaCBkaXJlY3Rvcmllcy4KKyAqCisgKiBGb3IgZWFjaCBzdHJpbmcgYHNlYXJjaERpcmAgaW4gYHNlYXJjaERpcnNgLCBgc2VhcmNoRGlyL2ZpbGVOYW1lYCB3aWxsIGJlCisgKiB0ZXN0ZWQgd2hldGhlciBpdCBpcyBhIHZhbGlkIGZpbGUgbmFtZSBvciBub3QuIElmIGl0IGlzIGEgdmFsaWQgZmlsZSBuYW1lLAorICogdGhlIGNvbmNhdGVuYXRlZCBuYW1lIChgc2VhcmNoRGlyL2ZpbGVOYW1lYCkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG91dHB1dAorICogdmFyaWFibGUgYG91dFBhdGhgLCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGB0cnVlYC4gT3RoZXJ3aXNlLCB0aGUKKyAqIHNlYXJjaCBjb250aW51ZXMgdW50aWwgdGhlIGBudWxscHRyYCBlbGVtZW50IGluIGBzZWFyY2hEaXJzYCBpcyByZWFjaGVkLCBhdAorICogd2hpY2ggcG9pbnQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC4KKyAqCisgKiBccGFyYW1baW5dIHNlYXJjaERpcnMgTnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIHNlYXJjaCBwYXRocy4KKyAqIFxwYXJhbVtpbl0gZmlsZU5hbWUgTmFtZSBvZiB0aGUgZmlsZSB0byBzZWFyY2guCisgKiBccGFyYW1bb3V0XSBvdXRQYXRoIEZ1bGwgcGF0aCBvZiB0aGUgZmlsZS4gYG91dFBhdGhgIHdpbGwgaG9sZCBhIHZhbGlkIGZpbGUKKyAqIG5hbWUgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGB0cnVlYC4KKyAqIFxyZXR1cm4gYHRydWVgIGlmIHNvbWUgZWxlbWVudCBpbiBgc2VhcmNoRGlyc2AgY29tYmluZWQgd2l0aCBgZmlsZU5hbWVgIGlzIGEKKyAqIHZhbGlkIGZpbGUgbmFtZTsgYGZhbHNlYCBvdGhlcndpc2UuCisgKi8KK2Jvb2wgZmluZEZpbGVJbkRpcnMoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgc3RkOjpzdHJpbmcgKm91dFBhdGgpIHsKKyAgICBmb3IgKDsgKnNlYXJjaERpcnMgIT0gbnVsbHB0cjsgKytzZWFyY2hEaXJzKSB7CisgICAgICAgICpvdXRQYXRoID0gc3RkOjpzdHJpbmcoKnNlYXJjaERpcnMpICsgIi8iICsgZmlsZU5hbWU7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworICAgICAgICBpZiAoc3RhdChvdXRQYXRoLT5jX3N0cigpLCAmZmlsZVN0YXQpID09IDAgJiYKKyAgICAgICAgICAgICAgICBTX0lTUkVHKGZpbGVTdGF0LnN0X21vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgc3RybkVxKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgc2l6ZV90IGNvdW50KSB7CisgICAgcmV0dXJuIHN0cm5jbXAoczEsIHMyLCBjb3VudCkgPT0gMDsKK30KKworYm9vbCBzdHJFcShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKK30KKworYm9vbCBzdHJpRXEoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgICAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKSA9PSAwOworfQorCitib29sIHN0ckhhc1ByZWZpeChjb25zdCBjaGFyKiB0ZXN0LCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICByZXR1cm4gc3RybkVxKHRlc3QsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyKiBzKSB7CisgICAgcmV0dXJuIHN0cmlFcShzLCAieSIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgInllcyIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgInQiKSB8fAorICAgICAgICAgICAgc3RyaUVxKHMsICJ0cnVlIikgfHwKKyAgICAgICAgICAgIHN0cmlFcShzLCAiMSIpOworfQorCitzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLAorICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0dXNfdCBsaW1pdEVycm9yKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgKm1zZykgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnICVzIiwgbmFtZSwgbXNnKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdHVzX3QgbGltaXRJbnZhbGlkQXR0cihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhdHRyLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggaW52YWxpZCAnJXMnIGF0dHJpYnV0ZSAoJXMpIiwgbmFtZSwKKyAgICAgICAgICAgIGF0dHIsIHZhbHVlKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworfTsgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlyc1tdOworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWU7Citjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWU7Citjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aDsKKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIDoKKyAgICBtUGFyc2luZ1N0YXR1cyhOT19JTklUKSwKKyAgICBtVXBkYXRlKGZhbHNlKSwKKyAgICBtQ29kZWNDb3VudGVyKDApIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBtYWluWG1sTmFtZSwgJnBhdGgpKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCAlcyIsIG1haW5YbWxOYW1lKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgaWYgKGZpbmRGaWxlSW5EaXJzKHNlYXJjaERpcnMsIHBlcmZvcm1hbmNlWG1sTmFtZSwgJnBhdGgpKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoLCB0cnVlKTsKKyAgICB9Cit9CisKK2Jvb2wgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKAorICAgICAgICBjb25zdCBjaGFyICpjb2RlY3NfeG1sLAorICAgICAgICBib29sIGlnbm9yZV9lcnJvcnMpIHsKKyAgICAvLyBnZXQgaHJlZl9iYXNlCisgICAgY29uc3QgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKKyAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBudWxscHRyKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IHN0ZDo6c3RyaW5nKGNvZGVjc194bWwsIGhyZWZfYmFzZV9lbmQgLSBjb2RlY3NfeG1sICsgMSk7CisgICAgfQorCisgICAgbVBhcnNpbmdTdGF0dXMgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQorICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisKKyAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7CisKKyAgICBpZiAobVBhcnNpbmdTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1coInBhcnNlVG9wTGV2ZWxYTUxGaWxlKCVzKSBmYWlsZWQiLCBjb2RlY3NfeG1sKTsKKyAgICAgICAgaWYgKGlnbm9yZV9lcnJvcnMpIHsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gT0s7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjTWFwLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjp+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKSB7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7CisgICAgRklMRSAqZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CisKKyAgICBpZiAoZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKG51bGxwdHIpOworICAgIExPR19GQVRBTF9JRihwYXJzZXIgPT0gbnVsbHB0ciwgIlhNTF9NZWRpYUNvZGVjc1htbFBhcnNlckNyZWF0ZSgpIGZhaWxlZC4iKTsKKworICAgIDo6WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdGhpcyk7CisgICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIoCisgICAgICAgICAgICBwYXJzZXIsIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQlVGRl9TSVpFID0gNTEyOworICAgIHdoaWxlIChtUGFyc2luZ1N0YXR1cyA9PSBPSykgeworICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKKyAgICAgICAgaWYgKGJ1ZmYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKKyAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOworICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKworICAgIGZjbG9zZShmaWxlKTsKKyAgICBmaWxlID0gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKKyAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyKj4obWUpLT5zdGFydEVsZW1lbnRIYW5kbGVyKG5hbWUsIGF0dHJzKTsKK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcio+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpocmVmID0gbnVsbHB0cjsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaHJlZiIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocmVmID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiaW5jbHVkZVhNTEZpbGU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCisgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCisgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBocmVmOworICAgIGlmIChmaWxlbmFtZS5jb21wYXJlKDAsIDEzLCAibWVkaWFfY29kZWNzXyIpICE9IDAgfHwKKyAgICAgICAgICAgIGZpbGVuYW1lLmNvbXBhcmUoZmlsZW5hbWUuc2l6ZSgpIC0gNCwgNCwgIi54bWwiKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG1IcmVmQmFzZSk7CisKKyAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobVBhcnNpbmdTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaW5UeXBlID0gdHJ1ZTsKKworICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gaW5jbHVkZVhNTEZpbGUoYXR0cnMpOworICAgICAgICBpZiAobVBhcnNpbmdTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7CisgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7CisgICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkVuY29kZXJzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5nIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlF1aXJrIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZFF1aXJrKGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPworICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5UeXBlID0gZmFsc2U7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKKyAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOworICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0ckVxKG5hbWUsICJMaW1pdCIpIHx8IHN0ckVxKG5hbWUsICJGZWF0dXJlIikpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTGltaXQiKSkgeworICAgICAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gYWRkTGltaXQoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRGZWF0dXJlKGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgeworICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIkVuY29kZXJzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpICYmIChtU2VjdGlvblN0YWNrLnNpemUoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVNlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICAgICAgbVNlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdmFsdWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCB2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byAiMCIgb3IgIjEiLgorICAgIGlmIChzdHJIYXNQcmVmaXgobmFtZSwgInN1cHBvcnRzLSIpKSB7CisgICAgICAgIHZhbHVlID0gcGFyc2VCb29sZWFuKHZhbHVlKSA/ICIxIiA6ICIwIjsKKyAgICB9CisKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IG1TZXJ2aWNlQXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKGF0dHJpYnV0ZSA9PSBtU2VydmljZUF0dHJpYnV0ZU1hcC5lbmQoKSkgeyAvLyBOZXcgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgaWYgKG1VcGRhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7CisgICAgfSBlbHNlIHsgLy8gRXhpc3RpbmcgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBhZGRpbmcgZXhpc3Rpbmcgc2V0dGluZyIpOworICAgICAgICB9CisgICAgICAgIGF0dHJpYnV0ZS0+c2Vjb25kID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAorICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ0eXBlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB0eXBlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7IC8vIE5ldyBjb2RlYyBuYW1lCisgICAgICAgIGlmIChtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgY29kZWMiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb2RlYyBpbiBtQ29kZWNNYXAKKyAgICAgICAgbUN1cnJlbnRDb2RlYyA9IG1Db2RlY01hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgQ29kZWMobmFtZSwgQ29kZWNQcm9wZXJ0aWVzKCkpKS5maXJzdDsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBUeXBlKHR5cGUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLm9yZGVyID0gbUNvZGVjQ291bnRlcisrOworICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGNvZGVjIG5hbWUKKyAgICAgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBhZGRpbmcgZXhpc3RpbmcgY29kZWMiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgorICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5pc0VuY29kZXIgPSBlbmNvZGVyOworICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgIGlmIChtQ3VycmVudFR5cGUgIT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHJlLWRlZmluaW5nIGV4aXN0aW5nIHR5cGUgd2l0aG91dCB1cGRhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKKyAgICAgICAgICAgICAgICBUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciogYV9uYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX2RlZmF1bHQgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfaW4gPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfbWF4ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX21pbiA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9yYW5nZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9yYW5nZXMgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfc2NhbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfdmFsdWUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogZGVmYXVsdCBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX2RlZmF1bHQgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImluIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGluIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfaW4gPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1heCIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtYXggaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9tYXggPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtaW4gaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9taW4gPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfcmFuZ2UgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlcyIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiByYW5nZXMgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInNjYWxlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHNjYWxlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfc2NhbGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHZhbHVlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdW5yZWNvZ25pemVkIGxpbWl0OiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCisgICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCisgICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQorICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAorICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coImlnbm9yaW5nIG51bGwgdHlwZSIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmFuZ2U7CisgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJiaXRyYXRlIikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2NrLWNvdW50IikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2Nrcy1wZXItc2Vjb25kIikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbXBsZXhpdHkiKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiZnJhbWUtcmF0ZSIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKKyAgICAgICAgLy8gInJhbmdlIiBpcyBzcGVjaWZpZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAgICAgLy8gMSkgbWluLW1heAorICAgICAgICAvLyAyKSB2YWx1ZS12YWx1ZQorICAgICAgICAvLyAzKSByYW5nZQorICAgICAgICBpZiAoYV9taW4gIT0gbnVsbHB0ciAmJiBhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBtaW4tbWF4CisgICAgICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyIHx8IGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmdlID0gYV9taW47CisgICAgICAgICAgICByYW5nZSArPSAnLSc7CisgICAgICAgICAgICByYW5nZSArPSBhX21heDsKKyAgICAgICAgfSBlbHNlIGlmIChhX21pbiAhPSBudWxscHRyIHx8IGFfbWF4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyBvbmx5ICdtaW4nIG9yICdtYXgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9IGVsc2UgaWYgKGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gdmFsdWUtdmFsdWUKKyAgICAgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgYm90aCAncmFuZ2UnIGFuZCAndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmdlID0gYV92YWx1ZTsKKyAgICAgICAgICAgIHJhbmdlICs9ICctJzsKKyAgICAgICAgICAgIHJhbmdlICs9IGFfdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoYV9yYW5nZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJ3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmFuZ2UKKyAgICAgICAgICAgIHJhbmdlID0gYV9yYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQuCisgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJhc3BlY3QtcmF0aW8iKSkgeworICAgICAgICAgICAgLy8gImFzcGVjdC1yYXRpbyIgbXVzdCBoYXZlICJpbiIuCisgICAgICAgICAgICBpZiAoYV9pbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJpbiIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICJpbiIgbXVzdCBiZSBlaXRoZXIgInBpeGVscyIgb3IgImJsb2NrcyIuCisgICAgICAgICAgICBpZiAoIXN0ckVxKGFfaW4sICJwaXhlbHMiKSAmJiAhc3RyRXEoYV9pbiwgImJsb2NrcyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIoYV9uYW1lLCAiaW4iLCBhX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5hbWUgd2lsbCBiZSAicGl4ZWwtYXNwZWN0LXJhdGlvLXJhbmdlIiBvcgorICAgICAgICAgICAgLy8gImJsb2NrLWFzcGVjdC1yYXRpby1yYW5nZSIuCisgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoYV9pbikuc3Vic3RyKDAsIHN0cmxlbihhX2luKSAtIDEpICsKKyAgICAgICAgICAgICAgICAgICAgIi1hc3BlY3QtcmF0aW8tcmFuZ2UiXSA9IHJhbmdlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZSAoYXBhcnQgZnJvbSAiYXNwZWN0LXJhdGlvIiksIHNpbXBseSBhcHBlbmQKKyAgICAgICAgICAgIC8vICItcmFuZ2UiIHRvIHRoZSBuYW1lIGZvciB0aGUgcmFuZ2UtdHlwZSBwcm9wZXJ0eS4KKyAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLXJhbmdlIl0gPSByYW5nZTsKKworICAgICAgICAgICAgLy8gT25seSAicXVhbGl0eSIgbWF5IGhhdmUgInNjYWxlIi4KKyAgICAgICAgICAgIGlmICghc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpICYmIGFfc2NhbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAic2NhbGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgInF1YWxpdHktc2NhbGUiIGlzICJsaW5lYXIiLgorICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kWyJxdWFsaXR5LXNjYWxlIl0gPSBhX3NjYWxlID09IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgImxpbmVhciIgOiBhX3NjYWxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAicXVhbGl0eSIgYW5kICJjb21wbGV4aXR5IiBtdXN0IGhhdmUgImRlZmF1bHQiLgorICAgICAgICAgICAgLy8gT3RoZXIgbGltaXRzIG11c3Qgbm90IGhhdmUgImRlZmF1bHQiLgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSB8fCBzdHJFcShhX25hbWUsICJjb21wbGV4aXR5IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYV9kZWZhdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJkZWZhdWx0IiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInF1YWxpdHktZGVmYXVsdCIgb3IgImNvbXBsZXhpdHktZGVmYXVsdCIuCisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoYV9uYW1lKSArICItZGVmYXVsdCJdID0gYV9kZWZhdWx0OworICAgICAgICAgICAgfSBlbHNlIGlmIChhX2RlZmF1bHQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFfZGVmYXVsdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImRlZmF1bHQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYV9pbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImluIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFfc2NhbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJzY2FsZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYV9taW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtaW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAibWF4IiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgImNoYW5uZWwtY291bnQiIG9yCisgICAgICAgICAgICAvLyAiY29uY3VycmVudC1pbnN0YW5jZXMiLgorICAgICAgICAgICAgLy8gIm1pbiIgaXMgbm90IG5jZXNzYXJ5LgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImNoYW5uZWwtY291bnQiKSB8fAorICAgICAgICAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJjb25jdXJyZW50LWluc3RhbmNlcyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoIm1heC0iKSArIGFfbmFtZV0gPSBhX21heDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtYXgiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAiY2hhbm5lbC1jb3VudCIpIHx8CisgICAgICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiY29uY3VycmVudC1pbnN0YW5jZXMiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtYXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhX3JhbmdlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAicmFuZ2VzIiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgInNhbXBsZS1yYXRlIi4KKyAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJzYW1wbGUtcmF0ZSIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbInNhbXBsZS1yYXRlLXJhbmdlcyJdID0gYV9yYW5nZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2VzIiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInNhbXBsZS1yYXRlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2VzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAidmFsdWUiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAiYWxpZ25tZW50IiBvcgorICAgICAgICAgICAgLy8gImJsb2NrLXNpemUiLgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFsaWdubWVudCIpIHx8IHN0ckVxKGFfbmFtZSwgImJsb2NrLXNpemUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW2FfbmFtZV0gPSBhX3ZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInZhbHVlIiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgImFsaWdubWVudCIpIHx8IHN0ckVxKGFfbmFtZSwgImJsb2NrLXNpemUiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJ2YWx1ZSIsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOworICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG51bGxwdHI7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IG9wdGlvbmFsIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdGlvbmFsID0gcGFyc2VCb29sZWFuKGF0dHJzW2ldKSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmVxdWlyZWQiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiByZXF1aXJlZCBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBFdmVyeSBmZWF0dXJlIG11c3QgaGF2ZSBhIG5hbWUuCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoKG9wdGlvbmFsICE9IC0xKSB8fCAocmVxdWlyZWQgIT0gLTEpKSB7CisgICAgICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCkgeworICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG9wdGlvbmFsID09IDEpIHx8IChyZXF1aXJlZCA9PSAxKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGNhbm5vdCBoYXZlIGV4dHJhICd2YWx1ZSciLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPQorICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCA9PSAxID8gIjAiIDogIjEiOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPSB2YWx1ZSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICIwIiA6IHZhbHVlOworICAgIHJldHVybiBPSzsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCYKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworfQorCitjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNNYXAmCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb2RlY01hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvZGVjTWFwOworfQorCitjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZU1hcCYKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFJvbGVNYXAoKSBjb25zdCB7CisgICAgaWYgKG1Sb2xlTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgZ2VuZXJhdGVSb2xlTWFwKCk7CisgICAgfQorICAgIHJldHVybiBtUm9sZU1hcDsKK30KKworY29uc3QgY2hhciogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldENvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICBpZiAobUNvbW1vblByZWZpeC5lbXB0eSgpKSB7CisgICAgICAgIGdlbmVyYXRlQ29tbW9uUHJlZml4KCk7CisgICAgfQorICAgIHJldHVybiBtQ29tbW9uUHJlZml4LmRhdGEoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZW5lcmF0ZVJvbGVNYXAoKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb2RlYyA6IG1Db2RlY01hcCkgeworICAgICAgICBjb25zdCBhdXRvJiBjb2RlY05hbWUgPSBjb2RlYy5maXJzdDsKKyAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBjb2RlYy5zZWNvbmQuaXNFbmNvZGVyOworICAgICAgICBzaXplX3Qgb3JkZXIgPSBjb2RlYy5zZWNvbmQub3JkZXI7CisgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVNYXAgPSBjb2RlYy5zZWNvbmQudHlwZU1hcDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogdHlwZU1hcCkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgdHlwZU5hbWUgPSB0eXBlLmZpcnN0OworICAgICAgICAgICAgY29uc3QgY2hhciogcm9sZU5hbWUgPSBHZXRDb21wb25lbnRSb2xlKGlzRW5jb2RlciwgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChyb2xlTmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHRoZSByb2xlIGZvciAlcyBvZiB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/ICJhbiBlbmNvZGVyIiA6ICJhIGRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVBdHRyaWJ1dGVNYXAgPSB0eXBlLnNlY29uZDsKKworICAgICAgICAgICAgYXV0byByb2xlSXRlcmF0b3IgPSBtUm9sZU1hcC5maW5kKHJvbGVOYW1lKTsKKyAgICAgICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBOb2RlSW5mbz4qIG5vZGVMaXN0OworICAgICAgICAgICAgaWYgKHJvbGVJdGVyYXRvciA9PSBtUm9sZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFJvbGVQcm9wZXJ0aWVzIHJvbGVQcm9wZXJ0aWVzOworICAgICAgICAgICAgICAgIHJvbGVQcm9wZXJ0aWVzLnR5cGUgPSB0eXBlTmFtZTsKKyAgICAgICAgICAgICAgICByb2xlUHJvcGVydGllcy5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgICAgICAgICAgICAgYXV0byBpbnNlcnRSZXN1bHQgPSBtUm9sZU1hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihyb2xlTmFtZSwgcm9sZVByb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluc2VydFJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBhZGQgcm9sZSAlcyIsIHJvbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGVMaXN0ID0gJmluc2VydFJlc3VsdC5maXJzdC0+c2Vjb25kLm5vZGVMaXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocm9sZUl0ZXJhdG9yLT5zZWNvbmQudHlwZSAhPSB0eXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUm9sZSAlcyBoYXMgbWlzbWF0Y2hpbmcgdHlwZXM6ICVzIGFuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZUl0ZXJhdG9yLT5zZWNvbmQudHlwZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb2xlSXRlcmF0b3ItPnNlY29uZC5pc0VuY29kZXIgIT0gaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSb2xlICVzIGNhbm5vdCBiZSBib3RoIGFuIGVuY29kZXIgYW5kIGEgZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZUxpc3QgPSAmcm9sZUl0ZXJhdG9yLT5zZWNvbmQubm9kZUxpc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vZGVJbmZvIG5vZGVJbmZvOworICAgICAgICAgICAgbm9kZUluZm8ubmFtZSA9IGNvZGVjTmFtZTsKKyAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucmVzZXJ2ZSh0eXBlQXR0cmlidXRlTWFwLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IHR5cGVBdHRyaWJ1dGVNYXApIHsKKyAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXthdHRyaWJ1dGUuZmlyc3QsIGF0dHJpYnV0ZS5zZWNvbmR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKG1Db2RlY01hcC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBpID0gbUNvZGVjTWFwLmNiZWdpbigpOworICAgIGF1dG8gZmlyc3QgPSBpLT5maXJzdC5jYmVnaW4oKTsKKyAgICBhdXRvIGxhc3QgPSBpLT5maXJzdC5jZW5kKCk7CisgICAgZm9yICgrK2k7IGkgIT0gbUNvZGVjTWFwLmNlbmQoKTsgKytpKSB7CisgICAgICAgIGxhc3QgPSBzdGQ6Om1pc21hdGNoKAorICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCBpLT5maXJzdC5jYmVnaW4oKSwgaS0+Zmlyc3QuY2VuZCgpKS5maXJzdDsKKyAgICB9CisgICAgbUNvbW1vblByZWZpeC5pbnNlcnQobUNvbW1vblByZWZpeC5iZWdpbigpLCBmaXJzdCwgbGFzdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzY5ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfWE1MUEFSU0VSX0hfCisjZGVmaW5lIE1FRElBX1NUQUdFRlJJR0hUX1hNTFBBUlNFUl9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHsKK3B1YmxpYzoKKworICAgIC8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRTZWFyY2hEaXJzW10gPQorICAgICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvZXRjIiwgbnVsbHB0cn07CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0TWFpblhtbE5hbWUgPQorICAgICAgICAgICAgIm1lZGlhX2NvZGVjcy54bWwiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSA9CisgICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPQorICAgICAgICAgICAgIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlcigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzID0gZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZSA9IGRlZmF1bHRNYWluWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSA9IGRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCA9IGRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgfk1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEF0dHJpYnV0ZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gQXR0cmlidXRlTWFwOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIEF0dHJpYnV0ZU1hcD4gVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBBdHRyaWJ1dGVNYXA+IFR5cGVNYXA7CisKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBRdWlya1NldDsKKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgb2YgYSBjb2RlYyAobm9kZSkKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29kZWNQcm9wZXJ0aWVzIHsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7ICAgIC8vLzwgV2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyCisgICAgICAgIHNpemVfdCBvcmRlcjsgICAgICAvLy88IE9yZGVyIG9mIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUgKHN0YXJ0aW5nIGZyb20gMCkKKyAgICAgICAgUXVpcmtTZXQgcXVpcmtTZXQ7IC8vLzwgU2V0IG9mIHF1aXJrcyByZXF1ZXN0ZWQgYnkgdGhpcyBjb2RlYworICAgICAgICBUeXBlTWFwIHR5cGVNYXA7ICAgLy8vPCBNYXAgb2YgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29kZWMKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZWNQcm9wZXJ0aWVzPiBDb2RlY01hcDsKKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgb2YgYSBub2RlIChmb3IgSU9teFN0b3JlKQorICAgICAqLworICAgIHN0cnVjdCBOb2RlSW5mbyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlTGlzdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUHJvcGVydGllcyBvZiBhIHJvbGUgKGZvciBJT214U3RvcmUpCisgICAgICovCisgICAgc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7CisgICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBOb2RlSW5mbz4gbm9kZUxpc3Q7CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBSb2xlUHJvcGVydGllcz4gUm9sZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBSb2xlUHJvcGVydGllcz4gUm9sZU1hcDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcCBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBzZXJ2aWNlLXNwZWNpZmljLgorICAgICAqLworICAgIGNvbnN0IEF0dHJpYnV0ZU1hcCYgZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbWFwIGZvciBjb2RlY3MgYW5kIHRoZWlyIHByb3BlcnRpZXMuCisgICAgICovCisgICAgY29uc3QgQ29kZWNNYXAmIGdldENvZGVjTWFwKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtYXAgZm9yIHJvbGVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAqIFRoaXMgbWFwIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBDb2RlY01hcC4KKyAgICAgKi8KKyAgICBjb25zdCBSb2xlTWFwJiBnZXRSb2xlTWFwKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb21tb24gcHJlZml4IG9mIGFsbCBub2RlIG5hbWVzLgorICAgICAqCisgICAgICogVGhlIHByZWZpeCBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIHhtbCwgc28gaXQgaGFzIHRvIGJlIGNvbXB1dGVkIGJ5IHRha2luZworICAgICAqIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggb2YgYWxsIG5vZGUgbmFtZXMuCisgICAgICovCisgICAgY29uc3QgY2hhciogZ2V0Q29tbW9uUHJlZml4KCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZW51bSBTZWN0aW9uIHsKKyAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKKyAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSUywKKyAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAorICAgIH07CisKKyAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKKyAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKKyAgICBib29sIG1VcGRhdGU7CisgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKKyAgICBzdGQ6OnN0cmluZyBtSHJlZkJhc2U7CisKKyAgICAvLyBTZXJ2aWNlIGF0dHJpYnV0ZXMKKyAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisKKyAgICAvLyBDb2RlYyBhdHRyaWJ1dGVzCisgICAgc3RkOjpzdHJpbmcgbUN1cnJlbnROYW1lOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQ29kZWNTZXQ7CisgICAgQ29kZWMgbUNvZGVjTGlzdFRlbXBbMjA0OF07CisgICAgQ29kZWNNYXAgbUNvZGVjTWFwOworICAgIHNpemVfdCBtQ29kZWNDb3VudGVyOworICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ3VycmVudENvZGVjOworICAgIFR5cGVNYXA6Oml0ZXJhdG9yIG1DdXJyZW50VHlwZTsKKworICAgIC8vIFJvbGUgbWFwCisgICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOworCisgICAgLy8gQ29tcHV0ZWQgbG9uZ2VzdCBjb21tb24gcHJlZml4CisgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtQ29tbW9uUHJlZml4OworCisgICAgYm9vbCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7CisKKyAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKKworICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAorICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CisKKyAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHIpOworCisgICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7CisgICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXImKSA9IGRlbGV0ZTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBNRURJQV9TVEFHRUZSSUdIVF9YTUxQQVJTRVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKaW5kZXggMWMwNGJjZi4uZDJlZGUxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERlYnVnLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCkBAIC0xMDIsNiArMTAyLDcgQEAKICAgICB7ICJNVFBfRk9STUFUX0pQMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgfSwKICAgICB7ICJNVFBfRk9STUFUX0pQWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgfSwKICAgICB7ICJNVFBfRk9STUFUX0RORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0hFSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTIgfSwKICAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSIsICAgICAgICAgICAgICAweEI4MDIgfSwKICAgICB7ICJNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUIiwgICAgICAgICAgICAweEI4ODEgfSwKICAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyIsICAgICAgICAgICAgICAgICAweEI5MDAgfSwKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggYzUwYWYyZi4uOTEzOTkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTYyLDYgKzYyLDggQEAKIGNvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfV1JJVEUgPSBNVFBfQlVGRkVSX1NJWkU7CiBjb25zdGV4cHIgaW50IFVTQl9GRlNfTUFYX1JFQUQgPSBNVFBfQlVGRkVSX1NJWkU7CiAKK2NvbnN0ZXhwciB1bnNpZ25lZCBGRlNfTlVNX0VWRU5UUyA9IDU7CisKIHN0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfV1JJVEUgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7CiBzdGF0aWNfYXNzZXJ0KFVTQl9GRlNfTUFYX1JFQUQgPiAwLCAiTWF4IHIvdyB2YWx1ZXMgbXVzdCBiZSA+IDAhIik7CiAKQEAgLTEwMiw4ICsxMDQsMTEgQEAKICAgICBfX2xlMzIgZnNfY291bnQ7CiAgICAgX19sZTMyIGhzX2NvdW50OwogICAgIF9fbGUzMiBzc19jb3VudDsKKyAgICBfX2xlMzIgb3NfY291bnQ7CiAgICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7CiAgICAgc3RydWN0IHNzX2Z1bmNfZGVzYyBzc19kZXNjczsKKyAgICBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG9zX2hlYWRlcjsKKyAgICBzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBvc19kZXNjOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7CkBAIC0yODcsNiArMjkyLDM2IEBACiAgICAgfSwKIH07CiAKK3N0cnVjdCB1c2Jfb3NfZGVzY19oZWFkZXIgbXRwX29zX2Rlc2NfaGVhZGVyID0geworICAgIC5pbnRlcmZhY2UgPSBodG9sZTMyKDEpLAorICAgIC5kd0xlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHVzYl9vc19kZXNjX2hlYWRlcikgKyBzaXplb2YodXNiX2V4dF9jb21wYXRfZGVzYykpLAorICAgIC5iY2RWZXJzaW9uID0gaHRvbGUxNigxKSwKKyAgICAud0luZGV4ID0gaHRvbGUxNig0KSwKKyAgICAuYkNvdW50ID0gaHRvbGUxNigxKSwKKyAgICAuUmVzZXJ2ZWQgPSBodG9sZTE2KDApLAorfTsKKworc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgbXRwX29zX2Rlc2NfY29tcGF0ID0geworICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAorICAgIC5Db21wYXRpYmxlSUQgPSB7ICdNJywgJ1QnLCAnUCcgfSwKKyAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAorICAgIC5SZXNlcnZlZDIgPSB7MH0sCit9OworCitzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBwdHBfb3NfZGVzY19jb21wYXQgPSB7CisgICAgLmJGaXJzdEludGVyZmFjZU51bWJlciA9IDAsCisgICAgLlJlc2VydmVkMSA9IGh0b2xlMzIoMSksCisgICAgLkNvbXBhdGlibGVJRCA9IHsgJ1AnLCAnVCcsICdQJyB9LAorICAgIC5TdWJDb21wYXRpYmxlSUQgPSB7MH0sCisgICAgLlJlc2VydmVkMiA9IHswfSwKK307CisKK3N0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cyB7CisgICAgdWludDE2X3QgIHdMZW5ndGg7CisgICAgdWludDE2X3QgIHdDb2RlOworfTsKKwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMxMSwxMyArMzQ2LDE2IEBACiAgICAgdjJfZGVzY3JpcHRvci5oZWFkZXIubWFnaWMgPSBjcHVfdG9fbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDX1YyKTsKICAgICB2Ml9kZXNjcmlwdG9yLmhlYWRlci5sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2YodjJfZGVzY3JpcHRvcikpOwogICAgIHYyX2Rlc2NyaXB0b3IuaGVhZGVyLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT05GU19IQVNfU1NfREVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19NU19PU19ERVNDOwogICAgIHYyX2Rlc2NyaXB0b3IuZnNfY291bnQgPSA0OwogICAgIHYyX2Rlc2NyaXB0b3IuaHNfY291bnQgPSA0OwogICAgIHYyX2Rlc2NyaXB0b3Iuc3NfY291bnQgPSA3OworICAgIHYyX2Rlc2NyaXB0b3Iub3NfY291bnQgPSAxOwogICAgIHYyX2Rlc2NyaXB0b3IuZnNfZGVzY3MgPSBtUHRwID8gcHRwX2ZzX2Rlc2NyaXB0b3JzIDogbXRwX2ZzX2Rlc2NyaXB0b3JzOwogICAgIHYyX2Rlc2NyaXB0b3IuaHNfZGVzY3MgPSBtUHRwID8gcHRwX2hzX2Rlc2NyaXB0b3JzIDogbXRwX2hzX2Rlc2NyaXB0b3JzOwogICAgIHYyX2Rlc2NyaXB0b3Iuc3NfZGVzY3MgPSBtUHRwID8gcHRwX3NzX2Rlc2NyaXB0b3JzIDogbXRwX3NzX2Rlc2NyaXB0b3JzOworICAgIHYyX2Rlc2NyaXB0b3Iub3NfaGVhZGVyID0gbXRwX29zX2Rlc2NfaGVhZGVyOworICAgIHYyX2Rlc2NyaXB0b3Iub3NfZGVzYyA9IG1QdHAgPyBwdHBfb3NfZGVzY19jb21wYXQgOiBtdHBfb3NfZGVzY19jb21wYXQ7CiAKICAgICBpZiAobUNvbnRyb2wgPCAwKSB7IC8vIG1pZ2h0IGhhdmUgYWxyZWFkeSBkb25lIHRoaXMgYmVmb3JlCiAgICAgICAgIG1Db250cm9sLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKEZGU19NVFBfRVAwLCBPX1JEV1IpKSk7CkBAIC0zNjEsNiArMzk5LDg4IEBACiAgICAgbUNvbnRyb2wucmVzZXQoKTsKIH0KIAordm9pZCBNdHBGZnNIYW5kbGU6OmNvbnRyb2xMb29wKCkgeworICAgIHdoaWxlICghaGFuZGxlRXZlbnQoKSkge30KKyAgICBMT0coREVCVUcpIDw8ICJNdHAgc2VydmVyIHNodXR0aW5nIGRvd24iOworfQorCitpbnQgTXRwRmZzSGFuZGxlOjpoYW5kbGVFdmVudCgpIHsKKyAgICBzdGQ6OnZlY3Rvcjx1c2JfZnVuY3Rpb25mc19ldmVudD4gZXZlbnRzKEZGU19OVU1fRVZFTlRTKTsKKyAgICB1c2JfZnVuY3Rpb25mc19ldmVudCAqZXZlbnQgPSBldmVudHMuZGF0YSgpOworICAgIGludCBuYnl0ZXMgPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKG1Db250cm9sLCBldmVudCwKKyAgICAgICAgICAgICAgICBldmVudHMuc2l6ZSgpICogc2l6ZW9mKHVzYl9mdW5jdGlvbmZzX2V2ZW50KSkpOworICAgIGlmIChuYnl0ZXMgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgcmV0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBuID0gbmJ5dGVzIC8gc2l6ZW9mICpldmVudDsgbjsgLS1uLCArK2V2ZW50KSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX0JJTkQ6CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19FTkFCTEU6CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19SRVNVTUU6CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19TVVNQRU5EOgorICAgICAgICBjYXNlIEZVTkNUSU9ORlNfVU5CSU5EOgorICAgICAgICBjYXNlIEZVTkNUSU9ORlNfRElTQUJMRToKKyAgICAgICAgICAgIGVycm5vID0gRVNIVVRET1dOOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX1NFVFVQOgorICAgICAgICAgICAgaWYgKGhhbmRsZUNvbnRyb2xSZXF1ZXN0KCZldmVudC0+dS5zZXR1cCkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIk10cCBFdmVudCAiIDw8IGV2ZW50LT50eXBlIDw8ICIgKHVua25vd24pIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRmZzSGFuZGxlOjpoYW5kbGVDb250cm9sUmVxdWVzdChjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpzZXR1cCkgeworICAgIHVpbnQ4X3QgdHlwZSA9IHNldHVwLT5iUmVxdWVzdFR5cGU7CisgICAgdWludDhfdCBjb2RlID0gc2V0dXAtPmJSZXF1ZXN0OworICAgIHVpbnQxNl90IGxlbmd0aCA9IHNldHVwLT53TGVuZ3RoOworICAgIHVpbnQxNl90IGluZGV4ID0gc2V0dXAtPndJbmRleDsKKyAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CisgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOworICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKKworICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgeworICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgeworICAgICAgICAgICAgUExPRyhERUJVRykgPDwgIk10cCBlcnJvciBjdHJscmVxIHJlYWQgZGF0YSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9DTEFTUyAmJiBpbmRleCA9PSAwICYmIHZhbHVlID09IDApIHsKKyAgICAgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMgKnN0ID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMqPihidWYuZGF0YSgpKTsKKyAgICAgICAgICAgIHN0LT53TGVuZ3RoID0gaHRvbGUxNihzaXplb2Yoc3QpKTsKKyAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0LT53TGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBNdHAgY2xhc3MgcmVxdWVzdCEgIiA8PCBjb2RlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIHJlcXVlc3QgdHlwZSAiIDw8IHR5cGU7CisgICAgfQorCisgICAgaWYgKHR5cGUgJiBVU0JfRElSX0lOKSB7CisgICAgICAgIGlmICg6OndyaXRlKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgeworICAgICAgICAgICAgUExPRyhERUJVRykgPDwgIk10cCBlcnJvciBjdHJscmVxIHdyaXRlIGRhdGEiOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBpbnQgTXRwRmZzSGFuZGxlOjp3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQqIGRhdGEsIGludCBsZW4pIHsKICAgICBMT0coVkVSQk9TRSkgPDwgIk1UUCBhYm91dCB0byB3cml0ZSBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwogICAgIGludCByZXQgPSAwOwpAQCAtNDYwLDYgKzU4MCwxMCBAQAogICAgIHBvc2l4X21hZHZpc2UobUJ1ZmZlcjIuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAogICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCk7CiAKKyAgICAvLyBIYW5kbGUgY29udHJvbCByZXF1ZXN0cy4KKyAgICBzdGQ6OnRocmVhZCB0KFt0aGlzXSgpIHsgdGhpcy0+Y29udHJvbExvb3AoKTsgfSk7CisgICAgdC5kZXRhY2goKTsKKwogICAgIC8vIEdldCBkZXZpY2Ugc3BlY2lmaWMgci93IHNpemUKICAgICBtTWF4V3JpdGUgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgic3lzLnVzYi5mZnMubWF4X3dyaXRlIiwgVVNCX0ZGU19NQVhfV1JJVEUpOwogICAgIG1NYXhSZWFkID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInN5cy51c2IuZmZzLm1heF9yZWFkIiwgVVNCX0ZGU19NQVhfUkVBRCk7CkBAIC00OTAsNyArNjE0LDcgQEAKIAogaW50IE10cEZmc0hhbmRsZTo6Y29uZmlndXJlKGJvb2wgdXNlUHRwKSB7CiAgICAgLy8gV2FpdCB0aWxsIHByZXZpb3VzIHNlcnZlciBpbnZvY2F0aW9uIGhhcyBjbG9zZWQKLSAgICBpZiAoIW1Mb2NrLnRyeV9sb2NrX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMDApKSkgeworICAgIGlmICghbUxvY2sudHJ5X2xvY2tfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwKSkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTXRwU2VydmVyIHdhcyB1bmFibGUgdG8gZ2V0IGNvbmZpZ3VyZSBsb2NrIjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTU0Miw2ICs2NjYsNyBAQAogICAgIHNpemVfdCBsZW5ndGg7CiAgICAgYm9vbCByZWFkID0gZmFsc2U7CiAgICAgYm9vbCB3cml0ZSA9IGZhbHNlOworICAgIGJvb2wgc2hvcnRfcGFja2V0ID0gZmFsc2U7CiAKICAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKIApAQCAtNTg2LDYgKzcxMSw3IEBACiAgICAgICAgICAgICAgICAgLy8gRm9yIGxhcmdlciBmaWxlcywgcmVjZWl2ZSB1bnRpbCBhIHNob3J0IHBhY2tldCBpcyByZWNlaXZlZC4KICAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnRfcGFja2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFJlY2VpdmUgYW4gZW1wdHkgcGFja2V0IGlmIHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW5kcG9pbnQgc2l6ZS4KQEAgLTYwNSw3ICs3MzEsNyBAQAogICAgICAgICAgICAgcmVhZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwIHx8IHplcm9fcGFja2V0KSB7CisgICAgaWYgKChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwICYmICFzaG9ydF9wYWNrZXQpIHx8IHplcm9fcGFja2V0KSB7CiAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKG1CdWxrT3V0LCBkYXRhLCBwYWNrZXRfc2l6ZSkpICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNzE5LDkgKzg0NSwyMiBAQAogfQogCiBpbnQgTXRwRmZzSGFuZGxlOjpzZW5kRXZlbnQobXRwX2V2ZW50IG1lKSB7CisgICAgLy8gTWltaWMgdGhlIGJlaGF2aW9yIG9mIGZfbXRwIGJ5IHNlbmRpbmcgdGhlIGV2ZW50IGFzeW5jLgorICAgIC8vIEV2ZW50cyBhcmVuJ3QgY3JpdGljYWwgdG8gdGhlIGNvbm5lY3Rpb24sIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZS4KKyAgICBjaGFyICp0ZW1wID0gbmV3IGNoYXJbbWUubGVuZ3RoXTsKKyAgICBtZW1jcHkodGVtcCwgbWUuZGF0YSwgbWUubGVuZ3RoKTsKKyAgICBtZS5kYXRhID0gdGVtcDsKKyAgICBzdGQ6OnRocmVhZCB0KFt0aGlzLCBtZV0oKSB7IHJldHVybiB0aGlzLT5kb1NlbmRFdmVudChtZSk7IH0pOworICAgIHQuZGV0YWNoKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTXRwRmZzSGFuZGxlOjpkb1NlbmRFdmVudChtdHBfZXZlbnQgbWUpIHsKICAgICB1bnNpZ25lZCBsZW5ndGggPSBtZS5sZW5ndGg7Ci0gICAgaW50IHJldCA9IHdyaXRlSGFuZGxlKG1JbnRyLCBtZS5kYXRhLCBsZW5ndGgpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocmV0KSA9PSBsZW5ndGggPyAwIDogLTE7CisgICAgaW50IHJldCA9IDo6d3JpdGUobUludHIsIG1lLmRhdGEsIGxlbmd0aCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihyZXQpICE9IGxlbmd0aCkKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBzZW5kaW5nIGV2ZW50IHRocmVhZCEiOworICAgIGRlbGV0ZVtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1lLmRhdGEpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKaW5kZXggOTg2NjlmZi4uZGEwY2Q5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaApAQCAtMzMsNiArMzMsMTEgQEAKICAgICBib29sIGluaXRGdW5jdGlvbmZzKCk7CiAgICAgdm9pZCBjbG9zZUNvbmZpZygpOwogICAgIHZvaWQgY2xvc2VFbmRwb2ludHMoKTsKKyAgICB2b2lkIGRvU2VuZEV2ZW50KG10cF9ldmVudCBtZSk7CisKKyAgICB2b2lkIGNvbnRyb2xMb29wKCk7CisgICAgaW50IGhhbmRsZUV2ZW50KCk7CisgICAgaW50IGhhbmRsZUNvbnRyb2xSZXF1ZXN0KGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwKTsKIAogICAgIGJvb2wgbVB0cDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCAyMTgwNDYyLi42N2ZkMjIxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtMTMyLDcgKzEzMiw3IEBACiAKICAgICBpbnQgcmV0ID0gc0hhbmRsZS0+Y29uZmlndXJlKHVzZVB0cCk7CiAgICAgaWYgKHJldCkgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgTVRQIGRyaXZlciEiKTsKLSAgICBlbHNlIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzeXMudXNiLmZmcy5tdHAucmVhZHkiLCAiMSIpOworICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzeXMudXNiLmZmcy5tdHAucmVhZHkiLCAiMSIpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHAuaCBiL21lZGlhL210cC9tdHAuaAppbmRleCBhZGZiMTAyLi4xYzc4MjlkIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvbXRwLmgKKysrIGIvbWVkaWEvbXRwL210cC5oCkBAIC05NCw2ICs5NCw3IEBACiAjZGVmaW5lIE1UUF9GT1JNQVRfSlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiAgIC8vIEpQRUcyMDAwIEJhc2VsaW5lIEZpbGUgRm9ybWF0CiAjZGVmaW5lIE1UUF9GT1JNQVRfSlBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCAgIC8vIEpQRUcyMDAwIEV4dGVuZGVkIEZpbGUgRm9ybWF0CiAjZGVmaW5lIE1UUF9GT1JNQVRfRE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMSAgIC8vIERpZ2l0YWwgTmVnYXRpdmUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9IRUlGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEyICAgLy8gSEVJRiBpbWFnZXMKICNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgICAgICAgICAgICAgICAgICAgMHhCODAyCiAjZGVmaW5lIE1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgICAgICAgICAgICAgICAgIDB4Qjg4MQogI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyAgICAgICAgICAgICAgICAgICAgICAweEI5MDAKQEAgLTQ5Myw0ICs0OTQsMTAgQEAKICNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEICAgICAgICAgICAgICAweDAwMDAKICNkZWZpbmUgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgICAgICAgICAweDAwMDEKIAorLy8gTVRQIGNsYXNzIHJlcWV1c3RzCisjZGVmaW5lIE1UUF9SRVFfQ0FOQ0VMICAgICAgICAgICAgICAweDY0CisjZGVmaW5lIE1UUF9SRVFfR0VUX0VYVF9FVkVOVF9EQVRBICAweDY1CisjZGVmaW5lIE1UUF9SRVFfUkVTRVQgICAgICAgICAgICAgICAweDY2CisjZGVmaW5lIE1UUF9SRVFfR0VUX0RFVklDRV9TVEFUVVMgICAweDY3CisKICNlbmRpZiAvLyBfTVRQX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNDA5NzRmMy4uMGQ0OGRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTkwLDMgKzkwLDkgQEAKICAgICAgICAgfSwKICAgICB9LAogfQorCitsbG5ka19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFuZGsiLAorICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAppbmRleCA2ZDI4ZDFiLi5jNGZmNTM3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKQEAgLTU4LDExICs1OCwxMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPEFJbWFnZVJlYWRlcj4gcmVhZGVyID0gbVJlYWRlci5wcm9tb3RlKCk7Ci0gICAgaWYgKHJlYWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkVycm9yOiBBSW1hZ2Ugbm90IGNsb3NlZCBiZWZvcmUgQUltYWdlUmVhZGVyIGNsb3NlISIpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKHJlYWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIHJlYWRlci0+cmVsZWFzZUltYWdlTG9ja2VkKHRoaXMsIHJlbGVhc2VGZW5jZUZkKTsKKyAgICB9IGVsc2UgaWYgKG1CdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogcGFyZW50IEFJbWFnZVJlYWRlciBjbG9zZWQgd2l0aG91dCByZWxlYXNpbmcgaW1hZ2UgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGhpcyk7CiAgICAgfQotICAgIHJlYWRlci0+cmVsZWFzZUltYWdlTG9ja2VkKHRoaXMsIHJlbGVhc2VGZW5jZUZkKTsKKwogICAgIC8vIFNob3VsZCBoYXZlIGJlZW4gc2V0IHRvIG51bGxwdHIgaW4gcmVsZWFzZUltYWdlTG9ja2VkCiAgICAgLy8gU2V0IHRvIG51bGxwdHIgaGVyZSBmb3IgZXh0cmEgc2FmZXR5IG9ubHkKICAgICBtQnVmZmVyID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IDVkMWEyMGIuLmZkNmVjYjUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtNDQsNyArNDQsMTEgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0dyYXBoaWNCdWZmZXJLZXkgPSAiR3JhcGhpY0J1ZmZlciI7CiAKIGJvb2wKLUFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXQoaW50MzJfdCBmb3JtYXQpIHsKK0FJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UpIHsKKyAgICAvLyBDaGVjayB3aGV0aGVyIHVzYWdlIGhhcyBlaXRoZXIgQ1BVX1JFQURfT0ZURU4gb3IgQ1BVX1JFQUQgc2V0LiBOb3RlIHRoYXQgY2hlY2sgYWdhaW5zdAorICAgIC8vIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiAoMHg2KSBpcyBzdWZmaWNpZW50IGFzIGl0IGltcGxpZXMKKyAgICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQUQgKDB4MikuCisgICAgYm9vbCBoYXNDcHVVc2FnZSA9IHVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOOwogICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODg6CkBAIC02MCw2ICs2NCw5IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CisgICAgICAgICAgICAvLyBGb3IgcHJpdmF0ZSBmb3JtYXQsIGNwdSB1c2FnZSBpcyBwcm9oaWJpdGVkLgorICAgICAgICAgICAgcmV0dXJuICFoYXNDcHVVc2FnZTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC04Myw2ICs5MCw4IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CiAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zNDAsNyArMzQ5LDggQEAKICAgICBmb3IgKGF1dG8gaXQgPSBtQWNxdWlyZWRJbWFnZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7Ci0gICAgICAgIGltYWdlLT5jbG9zZSgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woaW1hZ2UtPm1Mb2NrKTsKKyAgICAgICAgcmVsZWFzZUltYWdlTG9ja2VkKGltYWdlLCAvKnJlbGVhc2VGZW5jZUZkKi8tMSk7CiAgICAgfQogCiAgICAgLy8gRGVsZXRlIEJ1ZmZlciBJdGVtcwpAQCAtNDkyLDYgKzUwMiw4IEBACiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigqYnVmZmVyLCBidWZmZXJGZW5jZSk7CiAgICAgcmV0dXJuQnVmZmVySXRlbUxvY2tlZChidWZmZXIpOwogICAgIGltYWdlLT5tQnVmZmVyID0gbnVsbHB0cjsKKyAgICBpbWFnZS0+bUxvY2tlZEJ1ZmZlciA9IG51bGxwdHI7CisgICAgaW1hZ2UtPm1Jc0Nsb3NlZCA9IHRydWU7CiAKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgLy8gY2xlYW51cCBhY3F1aXJlZCBpbWFnZSBsaXN0CkBAIC02MDYsOSArNjE4LDkgQEAKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9CiAKLSAgICBpZiAoIUFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiJXM6IGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFJbWFnZVJlYWRlciIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmb3JtYXQpOworICAgIGlmICghQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGZvcm1hdCwgdXNhZ2UpKSB7CisgICAgICAgIEFMT0dFKCIlczogZm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB1c2FnZSAweCUiIFBSSXg2NCAiIGJ5IEFJbWFnZVJlYWRlciIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmb3JtYXQsIHVzYWdlKTsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCA5ODljMWZkLi5iZWQ4YTIxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0cnVjdCBBSW1hZ2VSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgIHB1YmxpYzoKLSAgICBzdGF0aWMgYm9vbCBpc1N1cHBvcnRlZEZvcm1hdChpbnQzMl90IGZvcm1hdCk7CisgICAgc3RhdGljIGJvb2wgaXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UwKTsKICAgICBzdGF0aWMgaW50IGdldE51bVBsYW5lc0ZvckZvcm1hdChpbnQzMl90IGZvcm1hdCk7CiAKICAgICBBSW1hZ2VSZWFkZXIoaW50MzJfdCB3aWR0aCwKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAvLyBDYWxsZWQgYnkgQUltYWdlUmVhZGVyX2FjcXVpcmVYWFggdG8gYWNxdWlyZSBhIEJ1ZmZlciBhbmQgc2V0dXAgQUltYWdlLgogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVJbWFnZUxvY2tlZCgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCi0gICAgLy8gQ2FsbGVkIGJ5IEFJbWFnZSB0byBjbG9zZSBpbWFnZQorICAgIC8vIENhbGxlZCBieSBBSW1hZ2UvfkFJbWFnZVJlYWRlciB0byBjbG9zZSBpbWFnZS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdyYWIgQUltYWdlOjptTG9jawogICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7CiAKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCA1MTE0M2FjLi5lZWNjODU4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubUtleSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7Ci0gICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubVZhbHVlID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5rZXlBdChpKS5zdHJpbmcoKTsKKyAgICAgICAga2V5VmFsdWVQYWlyc1tpXS5tVmFsdWUgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLnZhbHVlQXQoaSkuc3RyaW5nKCk7CiAgICAgfQogICAgICpudW1QYWlycyA9IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOwogICAgIHJldHVybiBBTUVESUFfT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAppbmRleCBkNzQ0M2JlLi4xOTMxNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKQEAgLTQ5NSw3ICs0OTUsMTMgQEAKICAgICAvKioKICAgICAgKiBBbmRyb2lkIHByaXZhdGUgb3BhcXVlIGltYWdlIGZvcm1hdC4KICAgICAgKgotICAgICAqIDxwPlRoaXMgZm9ybWF0IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LjwvcD4KKyAgICAgKiA8cD5UaGUgY2hvaWNlcyBvZiB0aGUgYWN0dWFsIGZvcm1hdCBhbmQgcGl4ZWwgZGF0YSBsYXlvdXQgYXJlIGVudGlyZWx5IHVwIHRvIHRoZQorICAgICAqIGRldmljZS1zcGVjaWZpYyBhbmQgZnJhbWV3b3JrIGludGVybmFsIGltcGxlbWVudGF0aW9ucywgYW5kIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB1c2UgY2FzZXMKKyAgICAgKiBldmVuIGZvciB0aGUgc2FtZSBkZXZpY2UuIEFsc28gbm90ZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGVzZSBidWZmZXJzIGFyZSBub3QgZGlyZWN0bHkKKyAgICAgKiBhY2Nlc3NpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5XaGVuIGFuIHtAbGluayBBSW1hZ2V9IG9mIHRoaXMgZm9ybWF0IGlzIG9idGFpbmVkIGZyb20gYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0gb3IKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzKCl9IG1ldGhvZCB3aWxsIHJldHVybiB6ZXJvLjwvcD4KICAgICAgKi8KICAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMgogfTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDU5YWU1MDcuLjdhMGMxN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtNzAsNyArNzAsOSBAQAogICogQHBhcmFtIGhlaWdodCBUaGUgZGVmYXVsdCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCiAgKiBAcGFyYW0gZm9ybWF0IFRoZSBmb3JtYXQgb2YgdGhlIEltYWdlIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLiBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQogICogICAgICAgICAgICBBSU1BR0VfRk9STUFUXyogZW51bSB2YWx1ZSBkZWZpbmVkIGluIHtAbGluayBBSU1BR0VfRk9STUFUU30uIE5vdGUgdGhhdCBub3QgYWxsCi0gKiAgICAgICAgICAgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgbGlrZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfS4KKyAqICAgICAgICAgICAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLiBPbmUgZXhhbXBsZSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgYXMgaXQgaXMgbm90CisgKiAgICAgICAgICAgIGludGVuZGVkIHRvIGJlIHJlYWQgYnkgYXBwbGljYXRpb25zIGRpcmVjdGx5LiBUaGF0IGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkKKyAqICAgICAgICAgICAge0BsaW5rIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2V9IGludHJvZHVjZWQgaW4gQVBJIDI2LgogICogQHBhcmFtIG1heEltYWdlcyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIHRoZSB1c2VyIHdpbGwgd2FudCB0byBhY2Nlc3Mgc2ltdWx0YW5lb3VzbHkuIFRoaXMKICAqICAgICAgICAgICAgc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlIHRvIGxpbWl0IG1lbW9yeSB1c2UuIE9uY2UgbWF4SW1hZ2VzIEltYWdlcyBhcmUgb2J0YWluZWQKICAqICAgICAgICAgICAgYnkgdGhlIHVzZXIsIG9uZSBvZiB0aGVtIGhhcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgYSBuZXcge0BsaW5rIEFJbWFnZX0gd2lsbCBiZWNvbWUKQEAgLTMwNyw2ICszMDksMjggQEAKICAqIGZvciB0aGUgY29uc3VtZXIgdXNhZ2UuIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIHBhc3NlZAogICogdG8ge0BsaW5lIEFJbWFnZVJlYWRlcl9uZXd9LgogICoKKyAqIDxwPklmIHRoZSB7QGNvZGUgZm9ybWF0fSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwgdGhlIGNyZWF0ZWQge0BsaW5rIEFJbWFnZVJlYWRlcn0KKyAqIHdpbGwgcHJvZHVjZSBpbWFnZXMgd2hvc2UgY29udGVudHMgYXJlIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIGNhbgorICogc3RpbGwgYWNxdWlyZSBpbWFnZXMgZnJvbSB0aGlzIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGFuZCBhY2Nlc3Mge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gdmlhCisgKiB7QGxpbmsgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKCl9LiBUaGUge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gZ2FpbmVkIHRoaXMgd2F5IGNhbiB0aGVuCisgKiBiZSBwYXNzZWQgYmFjayB0byBoYXJkd2FyZSAoc3VjaCBhcyBHUFUgb3IgaGFyZHdhcmUgZW5jb2RlciBpZiBzdXBwb3J0ZWQpIGZvciBmdXR1cmUgcHJvY2Vzc2luZy4KKyAqIEZvciBleGFtcGxlLCB5b3UgY2FuIG9idGFpbiBhbiB7QGxpbmsgRUdMQ2xpZW50QnVmZmVyfSBmcm9tIHRoZSB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSBieSB1c2luZworICoge0BsaW5rIGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUR9IGV4dGVuc2lvbiBhbmQgcGFzcyB0aGF0IHtAbGluayBFR0xDbGllbnRCdWZmZXJ9IHRvIHtAbGluaworICogZWdsQ3JlYXRlSW1hZ2VLSFJ9IHRvIGNyZWF0ZSBhbiB7QGxpbmsgRUdMSW1hZ2V9IHJlc291cmNlIHR5cGUsIHdoaWNoIG1heSB0aGVuIGJlIGJvdW5kIHRvIGEKKyAqIHRleHR1cmUgdmlhIHtAbGluayBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTfSBvbiBzdXBwb3J0ZWQgZGV2aWNlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvcgorICogdHJhbnNwb3J0aW5nIHRleHR1cmVzIHRoYXQgbWF5IGJlIHNoYXJlZCBjcm9zcy1wcm9jZXNzLjwvcD4KKyAqIDxwPkluIGdlbmVyYWwsIHdoZW4gc29mdHdhcmUgYWNjZXNzIHRvIGltYWdlIGRhdGEgaXMgbm90IG5lY2Vzc2FyeSwgYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0KKyAqIGNyZWF0ZWQgd2l0aCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSBmb3JtYXQgaXMgbW9yZSBlZmZpY2llbnQsIGNvbXBhcmVkIHdpdGgge0BsaW5rCisgKiBBSW1hZ2VSZWFkZXJ9cyB1c2luZyBvdGhlciBmb3JtYXQgc3VjaCBhcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OH0uPC9wPgorICoKKyAqIDxwPk5vdGUgdGhhdCBub3QgYWxsIGZvcm1hdCBhbmQgdXNhZ2UgZmxhZyBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJ9LAorICogZXNwZWNpYWxseSBpZiB7QGNvZGUgZm9ybWF0fSBpcyB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFfSwge0Bjb2RlIHVzYWdlfSBtdXN0IG5vdCBpbmNsdWRlIGVpdGhlcgorICoge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX1JBUkVMWX0gb3Ige0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX09GVEVOfTwvcD4KKyAqCisgKiBAcGFyYW0gd2lkdGggVGhlIGRlZmF1bHQgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCisgKiBAcGFyYW0gaGVpZ2h0IFRoZSBkZWZhdWx0IGhlaWdodCBpbiBwaXhlbHMgb2YgdGhlIEltYWdlcyB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4KKyAqIEBwYXJhbSBmb3JtYXQgVGhlIGZvcm1hdCBvZiB0aGUgSW1hZ2UgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgIEFJTUFHRV9GT1JNQVRfKiBlbnVtIHZhbHVlIGRlZmluZWQgaW4ge0BsaW5rIEFJTUFHRV9GT1JNQVRTfS4KICAqIEBwYXJhbSB1c2FnZSBzcGVjaWZpZXMgaG93IHRoZSBjb25zdW1lciB3aWxsIGFjY2VzcyB0aGUgQUltYWdlLCB1c2luZyBjb21iaW5hdGlvbiBvZiB0aGUKICAqICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFIGZsYWdzIGRlc2NyaWJlZCBpbiB7QGxpbmsgaGFyZHdhcmVfYnVmZmVyLmh9LgogICogICAgICAgICAgICBQYXNzaW5nIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU59IGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwpAQCAtMzMxLDYgKzM1NSwxMSBAQAogICogICB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFfSwgb3IgY29tYmluZWQ8L3RkPgogICogPC90cj4KICAqIDwvdGFibGU+CisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIGlzIE5VTEwsIG9yIG9uZSBvciBtb3JlIG9mIHdpZHRoLAorICogICAgICAgICAgICAgICAgIGhlaWdodCwgZm9ybWF0LCBtYXhJbWFnZXMsIG9yIHVzYWdlIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29ucy48L2xpPjwvdWw+CiAgKgogICogQHNlZSBBSW1hZ2UKICAqIEBzZWUgQUltYWdlUmVhZGVyX25ldwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCmluZGV4IDYzN2JmOWIuLjdlN2U4MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19ICiAjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfSAogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgpAQCAtMTMwLDE3ICsxMzEsNDUgQEAKICAqLwogc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBpbnQ2NF90IHRpbWVvdXRVcyk7CiAKLS8qKgotICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCisvKgorICogX19VU0VfRklMRV9PRkZTRVQ2NCBjaGFuZ2VzIHRoZSB0eXBlIG9mIG9mZl90IGluIExQMzIsIHdoaWNoIGNoYW5nZXMgdGhlIEFCSQorICogb2YgdGhlc2UgZGVjbGFyYXRpb25zIHRvICBub3QgbWF0Y2ggdGhlIHBsYXRmb3JtLiBJbiB0aGF0IGNhc2UsIGRlZmluZSB0aGVzZQorICogQVBJcyBpbiB0ZXJtcyBvZiBpbnQzMl90IGluc3RlYWQuIFBhc3NpbmcgYW4gb2ZmX3QgaW4gdGhpcyBzaXR1YXRpb24gd2lsbAorICogcmVzdWx0IGluIHNpbGVudCB0cnVuY2F0aW9uIHVubGVzcyB0aGUgdXNlciBidWlsZHMgd2l0aCAtV2NvbnZlcnNpb24sIGJ1dCB0aGUKKyAqIG9ubHkgYWx0ZXJuYXRpdmUgaXQgdG8gbm90IGV4cG9zZSB0aGVtIGF0IGFsbCBmb3IgdGhpcyBjb25maWd1cmF0aW9uLCB3aGljaAorICogbWFrZXMgdGhlIHdob2xlIEFQSSB1bnVzYWJsZS4KKyAqCisgKiBodHRwczovL2dpdGh1Yi5jb20vYW5kcm9pZC1uZGsvbmRrL2lzc3Vlcy80NTkKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCi0gICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKyNpZiBkZWZpbmVkKF9fVVNFX0ZJTEVfT0ZGU0VUNjQpICYmICFkZWZpbmVkKF9fTFA2NF9fKQorI2RlZmluZSBfb2ZmX3RfY29tcGF0IGludDMyX3QKKyNlbHNlCisjZGVmaW5lIF9vZmZfdF9jb21wYXQgb2ZmX3QKKyNlbmRpZiAgLyogZGVmaW5lZChfX1VTRV9GSUxFX09GRlNFVDY0KSAmJiAhZGVmaW5lZChfX0xQNjRfXykgKi8KKworI2lmIChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSB8fCBcCisgICAgX19TVERDX1ZFUlNJT05fXyA+PSAyMDExMTJMCitzdGF0aWNfYXNzZXJ0KHNpemVvZihfb2ZmX3RfY29tcGF0KSA9PSBzaXplb2YobG9uZyksCisgICAgICAgICAgICAgICJfb2ZmX3RfY29tcGF0IGRvZXMgbm90IG1hdGNoIHRoZSBOREsgQUJJLiBTZWUgIgorICAgICAgICAgICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2FuZHJvaWQtbmRrL25kay9pc3N1ZXMvNDU5LiIpOworI2VuZGlmCiAKIC8qKgogICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLAotICAgICAgICBzaXplX3QgaWR4LCBvZmZfdCBvZmZzZXQsIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZmZfdF9jb21wYXQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisKKyN1bmRlZiBfb2ZmX3RfY29tcGF0CiAKIC8qKgogICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyIG9mIHByb2Nlc3NlZCBkYXRhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvdm5kay9BbmRyb2lkLmJwIGIvbWVkaWEvdm5kay9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTNmZDE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL3ZuZGsvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAieG1scGFyc2VyLzEuMCIsCi1dCi0KZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGU1NTE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjc1htbFBhcnNlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxleHBhdC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2RlZmluZSBNRURJQV9DT0RFQ1NfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDI1NgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7IC8vIExvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCi0KLWNvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzID0KLSAgICAgICAgIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7Ci0KLS8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KLWNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9Ci0gICAgICAgIHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL2V0YyJ9OwotY29uc3RleHByIGludCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZSA9Ci0gICAgICAgIChzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdCkgLyBzaXplb2Yoa0NvbmZpZ0xvY2F0aW9uTGlzdFswXSkpOwotCi1ib29sIGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lLCBzdGQ6OnN0cmluZyAqb3V0X3BhdGgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgKm91dF9wYXRoID0gc3RkOjpzdHJpbmcoa0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSkgKyAiLyIgKyBmaWxlX25hbWU7Ci0gICAgICAgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGgtPmNfc3RyKCksICZmaWxlX3N0YXQpID09IDAgJiYKLSAgICAgICAgICAgICAgICBTX0lTUkVHKGZpbGVfc3RhdC5zdF9tb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBGaW5kIFR5cGVJbmZvIGJ5IG5hbWUuCi1zdGQ6OnZlY3RvcjxUeXBlSW5mbz46Oml0ZXJhdG9yIGZpbmRUeXBlSW5mbygKLSAgICAgICAgQ29kZWNJbmZvICZjb2RlY0luZm8sIGNvbnN0IEFTdHJpbmcgJnR5cGVOYW1lKSB7Ci0gICAgcmV0dXJuIHN0ZDo6ZmluZF9pZigKLSAgICAgICAgICAgIGNvZGVjSW5mby5tVHlwZXMuYmVnaW4oKSwgY29kZWNJbmZvLm1UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgIFt0eXBlTmFtZV0oY29uc3QgYXV0byAmdHlwZUluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUluZm8ubU5hbWUgPT0gdHlwZU5hbWU7Ci0gICAgICAgICAgICB9KTsKLX0KLQotLy8gQ29udmVydCBhIHN0cmluZyBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KLWJvb2wgUGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKLSAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2hhciAqZW5kOwotICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7Ci0gICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Ci19Ci0KLX0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKLQotTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKCkgOgotICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgbVVwZGF0ZShmYWxzZSkgewotICAgIHN0ZDo6c3RyaW5nIGNvbmZpZ19maWxlX3BhdGg7Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3MueG1sIiwgJmNvbmZpZ19maWxlX3BhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwgZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgaWYgKGZpbmRNZWRpYUNvZGVjTGlzdEZpbGVGdWxsUGF0aCgKLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIiwgJmNvbmZpZ19maWxlX3BhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlKTsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VUb3BMZXZlbFhNTEZpbGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjc194bWwsIGJvb2wgaWdub3JlX2Vycm9ycykgewotICAgIC8vIGdldCBocmVmX2Jhc2UKLSAgICBjb25zdCBjaGFyICpocmVmX2Jhc2VfZW5kID0gc3RycmNocihjb2RlY3NfeG1sLCAnLycpOwotICAgIGlmIChocmVmX2Jhc2VfZW5kICE9IE5VTEwpIHsKLSAgICAgICAgbUhyZWZCYXNlID0gQVN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KLQotICAgIG1Jbml0Q2hlY2sgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQotICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgbURlcHRoID0gMDsKLQotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIGlmIChpZ25vcmVfZXJyb3JzKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotTWVkaWFDb2RlY3NYbWxQYXJzZXI6On5NZWRpYUNvZGVjc1htbFBhcnNlcigpIHsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKLQotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOwotICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiU3RhcnQgcGFyc2luZyAlcyIsIHBhdGgpOwotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOwotICAgIENIRUNLKHBhcnNlciAhPSBOVUxMKTsKLQotICAgIDo6WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdGhpcyk7Ci0gICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIoCi0gICAgICAgICAgICBwYXJzZXIsIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOwotCi0gICAgY29uc3QgaW50IEJVRkZfU0laRSA9IDUxMjsKLSAgICB3aGlsZSAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKLSAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBieXRlc19yZWFkID0gOjpmcmVhZChidWZmLCAxLCBCVUZGX1NJWkUsIGZpbGUpOwotICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byByZWFkIik7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfSU87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOwotICAgICAgICBpZiAoc3RhdHVzICE9IFhNTF9TVEFUVVNfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgKCVzKSIsIDo6WE1MX0Vycm9yU3RyaW5nKDo6WE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKLQotICAgIGZjbG9zZShmaWxlKTsKLSAgICBmaWxlID0gTlVMTDsKLX0KLQotLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKLSAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyICo+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOwotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImluY2x1ZGVYTUxGaWxlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgotICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAotICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7Ci0gICAgICAgIGlmIChocmVmW2ldID09ICcuJyB8fCBocmVmW2ldID09ICdfJyB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICcwJyAmJiBocmVmW2ldIDw9ICc5JykgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnQScgJiYgaHJlZltpXSA8PSAnWicpIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ2EnICYmIGhyZWZbaV0gPD0gJ3onKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIEFTdHJpbmcgZmlsZW5hbWUgPSBocmVmOwotICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aCgibWVkaWFfY29kZWNzXyIpIHx8Ci0gICAgICAgICFmaWxlbmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZmlsZW5hbWUuaW5zZXJ0KG1IcmVmQmFzZSwgMCk7Ci0KLSAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnN0YXJ0RWxlbWVudEhhbmRsZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIGluVHlwZSA9IHRydWU7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBpbmNsdWRlWE1MRmlsZShhdHRycyk7Ci0gICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnB1c2gobUN1cnJlbnRTZWN0aW9uKTsKLSAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fSU5DTFVERTsKLSAgICAgICAgfQotICAgICAgICArK21EZXB0aDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVJTOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmciKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGZhbHNlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6Ci0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiUXVpcmsiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRRdWlyayhhdHRycyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluVHlwZSA9IGZhbHNlOwotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCi0gICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmIG1DdXJyZW50VHlwZSA9PSBtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdLm1UeXBlcy5lbmQoKTsKLSAgICAgICAgICAgIGlmIChvdXRzaWRlICYmICghc3RyY21wKG5hbWUsICJMaW1pdCIpIHx8ICFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkTGltaXQoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkRmVhdHVyZShhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICArK21EZXB0aDsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSIDogU0VDVElPTl9FTkNPREVSKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikgJiYgbVBhc3RTZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVBhc3RTZWN0aW9ucy50b3AoKTsKLSAgICAgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnBvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLS1tRGVwdGg7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBvciB2YWx1ZSB1bnNwZWNpZmllZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBQYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBpZiAobVVwZGF0ZSAhPSAobUdsb2JhbFNldHRpbmdzLmNvdW50KG5hbWUpID4gMCkpIHsKLSAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHNldHRpbmciKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIG1HbG9iYWxTZXR0aW5nc1tuYW1lXSA9IHZhbHVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidHlwZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB0eXBlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IE5VTEwpICYmIFBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIGlmIChtVXBkYXRlICE9IChtQ29kZWNJbmZvcy5jb3VudChuYW1lKSA+IDApKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBjb2RlYyBvciB2aWNlIHZlcnNhIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvc1tuYW1lXTsKLSAgICBpZiAobVVwZGF0ZSkgewotICAgICAgICAvLyBleGlzdGluZyBjb2RlYwotICAgICAgICBtQ3VycmVudE5hbWUgPSBuYW1lOwotICAgICAgICBtQ3VycmVudFR5cGUgPSBpbmZvLT5tVHlwZXMuYmVnaW4oKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gZXhpc3RpbmcgdHlwZQotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gZmluZFR5cGVJbmZvKCppbmZvLCB0eXBlKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gaW5mby0+bVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5ldyBjb2RlYwotICAgICAgICBtQ3VycmVudE5hbWUgPSBuYW1lOwotICAgICAgICBtUXVpcmtzW25hbWVdLmNsZWFyKCk7Ci0gICAgICAgIGluZm8tPm1UeXBlcy5jbGVhcigpOwotICAgICAgICBpbmZvLT5tVHlwZXMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgIG1DdXJyZW50VHlwZSA9IC0taW5mby0+bVR5cGVzLmVuZCgpOwotICAgICAgICBtQ3VycmVudFR5cGUtPm1OYW1lID0gdHlwZTsKLSAgICAgICAgaW5mby0+bUlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFF1aXJrOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtUXVpcmtzW21DdXJyZW50TmFtZV0uZW1wbGFjZV9iYWNrKG5hbWUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2RlcikgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IE5VTEw7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zW21DdXJyZW50TmFtZV07Ci0gICAgaW5mby0+bUlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgbUN1cnJlbnRUeXBlID0gZmluZFR5cGVJbmZvKCppbmZvLCBuYW1lKTsKLSAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBpbmZvLT5tVHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHJlLWRlZmluaW5nIGV4aXN0aW5nIHR5cGUgd2l0aG91dCB1cGRhdGUiKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1UeXBlcy5lbXBsYWNlX2JhY2soKTsKLSAgICAgICAgbUN1cnJlbnRUeXBlID0gLS1pbmZvLT5tVHlwZXMuZW5kKCk7Ci0gICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gaW5mby0+bVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0Rm91bmRNaXNzaW5nQXR0cihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLmNfc3RyKCksIG1zZyk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IEFTdHJpbmcgJnZhbHVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICBhdHRyLCB2YWx1ZS5jX3N0cigpKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbGltaXQgaXMgbm90IGdpdmVuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiZGVmYXVsdCIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImluIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWF4IikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWluIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2UiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZXMiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJzY2FsZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGF0dHJzW2ldLCBhdHRyc1tpICsgMV0pOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiB1bnJlY29nbml6ZWQgbGltaXQ6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIEFTdHJpbmcgbmFtZTsKLSAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygibmFtZSIsICZuYW1lKSkgewotICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbywKLSAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKLSAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCi0gICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgYm9vbCBmb3VuZDsKLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iIHx8IG5hbWUgPT0gImJpdHJhdGUiIHx8IG5hbWUgPT0gImJsb2NrLWNvdW50IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiCi0gICAgICAgICAgICB8fCBuYW1lID09ICJmcmFtZS1yYXRlIiB8fCBuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJzaXplIgotICAgICAgICAgICAgfHwgbmFtZSA9PSAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUuc3RhcnRzV2l0aCgibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewotICAgICAgICBBU3RyaW5nIG1pbiwgbWF4OwotICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW4iLCAmbWluKSAmJiBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSB7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7Ci0gICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSB8fCBtc2ctPmNvbnRhaW5zKCJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikgfHwgbXNnLT5jb250YWlucygibWF4IikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJm1heCkpIHsKLSAgICAgICAgICAgIG1pbiA9IG1heDsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKLSAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgcmFuZ2UsIHNjYWxlID0gImxpbmVhciIsIGRlZiwgaW5fOwotICAgICAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygicmFuZ2UiLCAmcmFuZ2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImRlZmF1bHQiLCAmZGVmKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiLCBmb3VuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgIT0gInF1YWxpdHkiICYmIG1zZy0+ZmluZFN0cmluZygic2NhbGUiLCAmc2NhbGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgXiAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImluIiwgJmluXykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIsIGZvdW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSB7Ci0gICAgICAgICAgICBpZiAoIShpbl8gPT0gInBpeGVscyIpICYmICEoaW5fID09ICJibG9ja3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKG5hbWUsICJpbiIsIGluXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbl8uZXJhc2UoNSwgMSk7IC8vIChwaXhlbHxibG9jayktYXNwZWN0LXJhdGlvCi0gICAgICAgICAgICBpbl8uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBpbl8uYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgbmFtZSA9IGluXzsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbInF1YWxpdHktc2NhbGUiXSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgewotICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICAgICAgdGFnLmFwcGVuZCgiLWRlZmF1bHQiKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbdGFnXSA9IGRlZjsKLSAgICAgICAgfQotICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZSIpOwotICAgICAgICBtQ3VycmVudFR5cGUtPm1EZXRhaWxzW3RhZ10gPSByYW5nZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIG1heCwgdmFsdWUsIHJhbmdlczsKLSAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoImRlZmF1bHQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoImluIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiIHx8IG5hbWUgPT0gImNvbmN1cnJlbnQtaW5zdGFuY2VzIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtYXgiLCBmb3VuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgIm1pbiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInJhbmdlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gInNhbXBsZS1yYXRlIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygicmFuZ2VzIiwgJnJhbmdlcykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZXMiLCBmb3VuZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygic2NhbGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAiYWxpZ25tZW50IiB8fCBuYW1lID09ICJibG9jay1zaXplIikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygidmFsdWUiLCAmdmFsdWUpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAidmFsdWUiLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4LnNpemUoKSkgewotICAgICAgICAgICAgQVN0cmluZyB0YWcgPSAibWF4LSI7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5tRGV0YWlsc1t0YWddID0gbWF4OwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5tRGV0YWlsc1tuYW1lXSA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHJhbmdlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZXMiKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbdGFnXSA9IHJhbmdlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyB1bnJlY29nbml6ZWQgbGltaXQgJyVzJyIsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNpemVfdCBpID0gMDsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7Ci0gICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLQotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IGZlYXR1cmUgaXMgbm90IGdpdmVuIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGludCB2YWx1ZSA9IChpbnQpUGFyc2VCb29sZWFuKGF0dHJzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25hbCA9IHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkICYmIG9wdGlvbmFsICE9IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1Db2RlY0luZm9zW21DdXJyZW50TmFtZV0ubVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICBtQ3VycmVudFR5cGUtPm1TdHJpbmdGZWF0dXJlc1tuYW1lXSA9IHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DdXJyZW50VHlwZS0+bUJvb2xGZWF0dXJlc1tuYW1lXSA9IChyZXF1aXJlZCA9PSAxKSB8fCAob3B0aW9uYWwgPT0gMCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0R2xvYmFsU2V0dGluZ3MoCi0gICAgICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+ICpzZXR0aW5ncykgY29uc3QgewotICAgIHNldHRpbmdzLT5jbGVhcigpOwotICAgIHNldHRpbmdzLT5pbnNlcnQobUdsb2JhbFNldHRpbmdzLmJlZ2luKCksIG1HbG9iYWxTZXR0aW5ncy5lbmQoKSk7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb2RlY0luZm8oY29uc3QgY2hhciAqbmFtZSwgQ29kZWNJbmZvICppbmZvKSBjb25zdCB7Ci0gICAgaWYgKG1Db2RlY0luZm9zLmNvdW50KG5hbWUpID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIG5vdCBmb3VuZCB3aXRoIG5hbWUgJyVzJyIsIG5hbWUpOwotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgICppbmZvID0gbUNvZGVjSW5mb3MuYXQobmFtZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0UXVpcmtzKGNvbnN0IGNoYXIgKm5hbWUsIHN0ZDo6dmVjdG9yPEFTdHJpbmc+ICpxdWlya3MpIGNvbnN0IHsKLSAgICBpZiAobVF1aXJrcy5jb3VudChuYW1lKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBub3QgZm91bmQgd2l0aCBuYW1lICclcyciLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIH0KLSAgICBxdWlya3MtPmNsZWFyKCk7Ci0gICAgcXVpcmtzLT5pbnNlcnQocXVpcmtzLT5lbmQoKSwgbVF1aXJrcy5hdChuYW1lKS5iZWdpbigpLCBtUXVpcmtzLmF0KG5hbWUpLmVuZCgpKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLmJwIGIvcmFkaW8vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTRmMi4uMDAwMDAwMAotLS0gYS9yYWRpby9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJyYWRpbyIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvLmNwcCIsCi0gICAgICAgICJJUmFkaW9DbGllbnQuY3BwIiwKLSAgICAgICAgIklSYWRpb1NlcnZpY2UuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnJhZGlvX21ldGFkYXRhIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvLmNwcCBiL3JhZGlvL0lSYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjNiNjguLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklSYWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9DT05GSUdVUkFUSU9OLAotICAgIEdFVF9DT05GSUdVUkFUSU9OLAotICAgIFNFVF9NVVRFLAotICAgIEdFVF9NVVRFLAotICAgIFNDQU4sCi0gICAgU1RFUCwKLSAgICBUVU5FLAotICAgIENBTkNFTCwKLSAgICBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTiwKLSAgICBIQVNfQ09OVFJPTAotfTsKLQotY2xhc3MgQnBSYWRpbzogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpbz4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcFJhZGlvKGNvbnN0IHNwPElCaW5kZXI+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+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGQyMjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vUmFkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0jaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCi0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7Ci0KLSAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOwotICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOwotfTsgLy8gbmFtZXNwYWNlIGFub255bW91cwotCi1jb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBSYWRpbzo6Z2V0UmFkaW9TZXJ2aWNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgIGlmIChnUmFkaW9TZXJ2aWNlLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtSYWRpb1NlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJSYWRpb1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgdXNsZWVwKGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkpOwotICAgICAgICB9IHdoaWxlKHRydWUpOwotICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOwotICAgICAgICBnUmFkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0gICAgQUxPR0VfSUYoZ1JhZGlvU2VydmljZSA9PSAwLCAibm8gUmFkaW9TZXJ2aWNlIT8iKTsKLSAgICByZXR1cm4gZ1JhZGlvU2VydmljZTsKLX0KLQotLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFJhZGlvOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMocHJvcGVydGllcywgbnVtTW9kdWxlcyk7Ci19Ci0KLXNwPFJhZGlvPiBSYWRpbzo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi17Ci0gICAgQUxPR1YoImF0dGFjaCgpIik7Ci0gICAgc3A8UmFkaW8+IHJhZGlvOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0gICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7Ci0gICAgICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByYWRpbzsKLX0KLQotCi0KLS8vIFJhZGlvCi1SYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgLypoYW5kbGUqLywgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi1SYWRpbzo6flJhZGlvKCkKLXsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvOjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUlSYWRpbyA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKLX0KLQotCi0vLyBCcFJhZGlvQ2xpZW50Ci12b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9ICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQotICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKLSAgICB9Ci19Ci0KLQotLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotdm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOwotICAgIG1JUmFkaW8gPSAwOwotICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOwotICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9PV05FUlMgYi9zZXJ2aWNlcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwMGRjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK2V0YWx2YWxhQGdvb2dsZS5jb20KK2drYXN0ZW5AYW5kcm9pZC5jb20KK2h1bmdhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMTExMTkzYy4uZmY1Zjc0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTMyNiw5ICszMjYsMTQgQEAKICAgICBzcDxNbWFwVGhyZWFkPiB0aHJlYWQgPSBtTW1hcFRocmVhZHMudmFsdWVGb3IoaW8pOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpbnRlcmZhY2UgPSBuZXcgTW1hcFRocmVhZEhhbmRsZSh0aHJlYWQpOwotICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQsIGNhbGxiYWNrLCBwb3J0SWQpOworICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBzZXNzaW9uSWQsIGNhbGxiYWNrLCAqZGV2aWNlSWQsIHBvcnRJZCk7CiAgICAgICAgICpoYW5kbGUgPSBwb3J0SWQ7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChpbywgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW8sIHNlc3Npb25JZCk7CisgICAgICAgIH0KICAgICAgICAgcmV0ID0gTk9fSU5JVDsKICAgICB9CiAKQEAgLTEzOTcsMTEgKzE0MDIsMTEgQEAKICAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCiAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19PVVRQVVRfT1BFTkVELCBwaWQpOworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX09VVFBVVF9SRUdJU1RFUkVELCBwaWQpOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fSU5QVVRfT1BFTkVELCBwaWQpOworICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19JTlBVVF9SRUdJU1RFUkVELCBwaWQpOwogICAgIH0KIH0KIApAQCAtMjYwMyw3ICsyNjA4LDcgQEAKICAgICAgICAgICAgIHdoaWxlIChlYy0+bUVmZmVjdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBlYy0+bUVmZmVjdHNbMF07CiAgICAgICAgICAgICAgICAgZWZmZWN0LT51blBpbigpOwotICAgICAgICAgICAgICAgIHQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgdC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0LCAvKnJlbGVhc2UqLyB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LT5wdXJnZUhhbmRsZXMoKSkgewogICAgICAgICAgICAgICAgICAgICB0LT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWRfbChlZmZlY3QsIGZhbHNlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggOTAyM2IyZC4uNjM4OThhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNjA0LDcgKzYwNCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgc3A8TW1hcFRocmVhZD4gbVRocmVhZDsKKyAgICAgICAgY29uc3Qgc3A8TW1hcFRocmVhZD4gbVRocmVhZDsKICAgICB9OwogCiAgICAgICAgICAgICAgIFRocmVhZEJhc2UgKmNoZWNrVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGYyYzFjNGYuLmJkNWYxNDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CiAKQEAgLTEwOSw3ICsxMTAsMTAgQEAKIHsKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlICE9IDApIHsKLSAgICAgICAgQUxPR1coIkVmZmVjdE1vZHVsZSAlcCBkZXN0cnVjdG9yIGNhbGxlZCB3aXRoIHVucmVsZWFzZWQgaW50ZXJmYWNlIiwgdGhpcyk7CisgICAgICAgIGNoYXIgdXVpZFN0cls2NF07CisgICAgICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnV1aWQsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7CisgICAgICAgIEFMT0dXKCJFZmZlY3RNb2R1bGUgJXAgZGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCB1bnJlbGVhc2VkIGludGVyZmFjZSwgZWZmZWN0ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1dWlkU3RyKTsKICAgICAgICAgcmVsZWFzZV9sKCk7CiAgICAgfQogCkBAIC0xMDgxLDE4ICsxMDg1LDEyIEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQudGltZUxvdywgbURlc2NyaXB0b3IudXVpZC50aW1lTWlkLCBtRGVzY3JpcHRvci51dWlkLnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLmNsb2NrU2VxLCBtRGVzY3JpcHRvci51dWlkLm5vZGVbMF0sIG1EZXNjcmlwdG9yLnV1aWQubm9kZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudXVpZC5ub2RlWzJdLAotICAgICAgICAgICAgbURlc2NyaXB0b3IudXVpZC5ub2RlWzNdLG1EZXNjcmlwdG9yLnV1aWQubm9kZVs0XSxtRGVzY3JpcHRvci51dWlkLm5vZGVbNV0pOworICAgIGNoYXIgdXVpZFN0cls2NF07CisgICAgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZygmbURlc2NyaXB0b3IudXVpZCwgdXVpZFN0ciwgc2l6ZW9mKHV1aWRTdHIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlc1xuIiwgdXVpZFN0cik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUudGltZUxvdywgbURlc2NyaXB0b3IudHlwZS50aW1lTWlkLAotICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLnRpbWVIaUFuZFZlcnNpb24sCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5jbG9ja1NlcSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzBdLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMV0sCi0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CisgICAgQXVkaW9FZmZlY3Q6Omd1aWRUb1N0cmluZygmbURlc2NyaXB0b3IudHlwZSwgdXVpZFN0ciwgc2l6ZW9mKHV1aWRTdHIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBUWVBFOiAlc1xuIiwgdXVpZFN0cik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYICglcylcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLApAQCAtMTMwNiwxMSArMTMwNCwxMCBAQAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICB0aHJlYWQtPmRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwogICAgICAgICAvLyB0cnkgdG8gY2xlYW51cCBhcyBtdWNoIGFzIHdlIGNhbgogICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgIGVmZmVjdC0+ZGlzY29ubmVjdEhhbmRsZSh0aGlzLCB1bnBpbklmTGFzdCk7CisgICAgICAgIGlmIChlZmZlY3QgIT0gMCAmJiBlZmZlY3QtPmRpc2Nvbm5lY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpID4gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzIEVmZmVjdCBoYW5kbGUgJXAgZGlzY29ubmVjdGVkIGFmdGVyIHRocmVhZCBkZXN0cnVjdGlvbiIsIF9fRlVOQ1RJT05fXywgdGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggYzRmMWFmMy4uYzEwZmEwNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTEzOCw3ICsxMzgsOCBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgTE9HX0hJU1RfRkxVU0goKTsKKyAgICAvLyBsb2cgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorICAgIExPR19BVURJT19TVEFURSgpOwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1QcmV2aW91czsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCAyYTI3ZGZkLi4zNjZhMTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksNyArNDAsNyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTW1hcFRocmVhZDsKQEAgLTU1LDUgKzU2LDYgQEAKICAgICB2aXJ0dWFsIGludDY0X3QgZnJhbWVzUmVsZWFzZWQoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgb25UaW1lc3RhbXAoY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKKyAgICBwaWRfdCBtUGlkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNlNGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2h1bmdhQGdvb2dsZS5jb20KK2ptdHJpdmlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGQ3YzA3MjguLjI3YzZkMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ3NCw2ICs0NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCAzZjFhMGMwLi4xYzFhOTg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMzAsNiArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTQwLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0yNDAsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDNmODNjYTguLmY4ZGE3ODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC01MCw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwpAQCAtMTAyLDYgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggM2M3MzU0My4uYzEwNDRlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMTEzLDEwICsxMTMsMTUgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCisgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CisgICAgfQogICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CiAgICAgcmV0dXJuIG9rOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggOGIxYmMwMC4uMDRjYjljZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yMiw3ICsyMiw3IEBACiBib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKIGJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCk7Citib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOwogYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggNjVlY2NiNi4uZTIwMmNhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMTk3LDcgKzE5Nyw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHgyMDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNTQ0LDYgKzE1NDQsNyBAQAogICAgICAgICBBTE9HVygiQWN0aXZlVHJhY2tzPFQ+OjphZGQgdHJhY2sgJXAgYWxyZWFkeSB0aGVyZSIsIHRyYWNrLmdldCgpKTsKICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgIH0KKyAgICBsb2dUcmFjaygiYWRkIiwgdHJhY2spOwogICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrID0gdHJhY2s7CiAgICAgKyttQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CkBAIC0xNTU3LDYgKzE1NTgsNyBAQAogICAgICAgICBBTE9HVygiQWN0aXZlVHJhY2tzPFQ+OjpyZW1vdmUgbm9uZXhpc3RlbnQgdHJhY2sgJXAiLCB0cmFjay5nZXQoKSk7CiAgICAgICAgIHJldHVybiBpbmRleDsKICAgICB9CisgICAgbG9nVHJhY2soInJlbW92ZSIsIHRyYWNrKTsKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgpAQCAtMTU2Nyw2ICsxNTY5LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpBY3RpdmVUcmFja3M8VD46OmNsZWFyKCkgewogICAgIGZvciAoY29uc3Qgc3A8VD4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BBdWRpbyh0cmFjay0+dWlkKCkpOworICAgICAgICBsb2dUcmFjaygiY2xlYXIiLCB0cmFjayk7CiAgICAgfQogICAgIG1MYXN0QWN0aXZlVHJhY2tzR2VuZXJhdGlvbiA9IG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgIG1BY3RpdmVUcmFja3MuY2xlYXIoKTsKQEAgLTE2MDUsNiArMTYwOCwxNiBAQAogICAgIH0KIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+Ojpsb2dUcmFjaygKKyAgICAgICAgY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3QgeworICAgIGlmIChtTG9jYWxMb2cgIT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgICAgICBtTG9jYWxMb2ctPmxvZygiQVQ6OiUtMTBzKCVwKSAlcyIsIGZ1bmNOYW1lLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpicm9hZGNhc3RfbCgpCiB7CiAgICAgLy8gVGhyZWFkIGNvdWxkIGJlIGJsb2NrZWQgd2FpdGluZyBmb3IgYXN5bmMKQEAgLTE2NDAsNiArMTY1Myw3IEBACiAgICAgICAgIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCiAgICAgICAgIG1GcmFtZXNXcml0dGVuKDApLAogICAgICAgICBtU3VzcGVuZGVkRnJhbWVzKDApLAorICAgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKICAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLApAQCAtMTY1NCw3ICsxNjY4LDggQEAKICAgICAgICAgbVNjcmVlblN0YXRlKEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlKSwKICAgICAgICAgLy8gaW5kZXggMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbE1hc2soKCgxIDw8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcykgLSAxKSAmIH4xKSwKLSAgICAgICAgbUh3U3VwcG9ydHNQYXVzZShmYWxzZSksIG1Id1BhdXNlZChmYWxzZSksIG1GbHVzaFBlbmRpbmcoZmFsc2UpCisgICAgICAgIG1Id1N1cHBvcnRzUGF1c2UoZmFsc2UpLCBtSHdQYXVzZWQoZmFsc2UpLCBtRmx1c2hQZW5kaW5nKGZhbHNlKSwKKyAgICAgICAgbUxlZnRWb2xGbG9hdCgtMS4wKSwgbVJpZ2h0Vm9sRmxvYXQoLTEuMCkKIHsKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb091dF8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CkBAIC0xNzA3LDggKzE3MjIsNiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CkBAIC0xNzM1LDggKzE3NDgsMTAgQEAKICAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgZHByaW50ZihmZCwgIiAgJXp1IFRyYWNrcyIsIG51bXRyYWNrcyk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKQEAgLTE3NDUsOCArMTc2MCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNzU0LDE1ICsxNzY5LDE1IEBACiAgICAgfQogICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgewogICAgICAgICAvLyBzb21lIHRyYWNrcyBpbiB0aGUgYWN0aXZlIGxpc3Qgd2VyZSBub3QgaW4gdGhlIHRyYWNrcyBsaXN0Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIwMTMsNyArMjAyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwpAQCAtMjE3MiwxMCArMjE4OCw2IEBACiAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgIG1Mb2NhbExvZy5sb2coImFkZFRyYWNrX2wgICAgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcwotCiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjIwMiw5ICsyMjE0LDkgQEAKIHsKICAgICB0cmFjay0+dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOwogCi0gICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICB0cmFjay0+ZHVtcChidWZmZXIsIGFycmF5c2l6ZShidWZmZXIpLCBmYWxzZSAvKiBhY3RpdmUgKi8pOwotICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCBidWZmZXIgKyA0KTsgLy8gbG9nIGZvciBhbmFseXNpcworICAgIFN0cmluZzggcmVzdWx0OworICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKIAogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKQEAgLTIyNDIsNiArMjI1NCw3IEBACiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwpAQCAtMzQwNCwxMCArMzQxNyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBpbmFjdGl2ZSBidXQgbm90IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tzX2woJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDI4Nyw2ICs0Mjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOworICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdHJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIGZpcnN0IGZyYW1lIHdhcyBtaXhlZCwKQEAgLTQyOTcsNiArNDMwNywxMCBAQAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2cjsgICAgICAgLy8gaW4gVTguMjQgaW50ZWdlciBmb3JtYXQKICAgICAgICAgICAgIGZsb2F0IHZsZiwgdnJmLCB2YWY7ICAgLy8gaW4gWzAuMCwgMS4wXSBmbG9hdCBmb3JtYXQKKyAgICAgICAgICAgIC8vIHJlYWQgb3JpZ2luYWwgdm9sdW1lcyB3aXRoIHZvbHVtZSBjb250cm9sCisgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKKyAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOworCiAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7CiAgICAgICAgICAgICAgICAgdmwgPSB2ciA9IDA7CiAgICAgICAgICAgICAgICAgdmxmID0gdnJmID0gdmFmID0gMC47CkBAIC00MzA0LDEwICs0MzE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWFkIG9yaWdpbmFsIHZvbHVtZXMgd2l0aCB2b2x1bWUgY29udHJvbAotICAgICAgICAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwotICAgICAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOwogICAgICAgICAgICAgICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CkBAIC00MzU5LDYgKzQzNjksMjUgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gRm9yIGRlZGljYXRlZCBWb0lQIG91dHB1dHMsIGxldCB0aGUgSEFMIGFwcGx5IHRoZSBzdHJlYW0gdm9sdW1lLiBUcmFjayB2b2x1bWUgaXMKKyAgICAgICAgICAgIC8vIHN0aWxsIGFwcGxpZWQgYnkgdGhlIG1peGVyLgorICAgICAgICAgICAgaWYgKChtT3V0cHV0LT5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpICE9IDApIHsKKyAgICAgICAgICAgICAgICB2ID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUgPyAwLjBmIDogdjsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBtTGVmdFZvbEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKHYsIHYpOworICAgICAgICAgICAgICAgICAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgb3V0cHV0IHN0cmVhbSB2b2x1bWU6ICVkIiwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IHY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaWYgc3RyZWFtIHZvbHVtZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIEhBTCwgbUxlZnRWb2xGbG9hdCA9PSB2IGhlcmUgYW5kIHdlCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0cmVhbSB2b2x1bWUgY29udHJpYnV0aW9uIGZyb20gc29mdHdhcmUgdm9sdW1lLgorICAgICAgICAgICAgICAgIGlmICh2ICE9IDAuMGYgJiYgbUxlZnRWb2xGbG9hdCA9PSB2KSB7CisgICAgICAgICAgICAgICAgICAgdmxmID0gbWluKDEuMGYsIHZsZiAvIHYpOworICAgICAgICAgICAgICAgICAgIHZyZiA9IG1pbigxLjBmLCB2cmYgLyB2KTsKKyAgICAgICAgICAgICAgICAgICB2YWYgPSBtaW4oMS4wZiwgdmFmIC8gdik7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKQEAgLTQ4MDAsNyArNDgyOSw2IEBACiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QsIHN5c3RlbVJlYWR5KQotICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogewogfQogCkBAIC00ODA4LDcgKzQ4MzYsNiBAQAogICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLAogICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQotICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogICAgICAgICAsIG1Wb2x1bWVTaGFwZXJBY3RpdmUoZmFsc2UpCiB7CiB9CkBAIC01OTI1LDcgKzU5NTIsOSBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCi0gICAgbUlucHV0KGlucHV0KSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKKyAgICBtSW5wdXQoaW5wdXQpLAorICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCisgICAgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzLCBtUnNtcEluRnJhbWVzUDIsIGFuZCBtUnNtcEluRnJhbWVzT0EgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCiAjaWZkZWYgVEVFX1NJTksKQEAgLTY2OTYsNyArNjcyNSw4IEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzZXNzaW9uSWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CkBAIC02ODg4LDYgKzY5MTgsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVtb3ZlVHJhY2tfbChjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHRyYWNrKQogeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgZmFsc2UgLyogYWN0aXZlICovKTsKKyAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKKwogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAvLyBuZWVkIGFueXRoaW5nIHJlbGF0ZWQgdG8gZWZmZWN0cyBoZXJlPwogICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewpAQCAtNjkwMSw2ICs2OTM1LDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtNjkxNCw2ICs2OTUwLDEyIEBACiAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9CisKKyAgICBpZiAoaW5wdXQgIT0gbnVsbHB0cikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYWwgc3RyZWFtIGR1bXA6XG4iKTsKKyAgICAgICAgKHZvaWQpaW5wdXQtPnN0cmVhbS0+ZHVtcChmZCk7CisgICAgfQorCiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCBjYXB0dXJlIHRocmVhZDogJXNcbiIsIGhhc0Zhc3RDYXB0dXJlKCkgPyAieWVzIiA6ICJubyIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxhYmxlOiAlc1xuIiwgbUZhc3RUcmFja0F2YWlsID8gInllcyIgOiAibm8iKTsKIApAQCAtNjkyOCwxNiArNjk3MCwxNSBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKICAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOwogICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CkBAIC02OTQ2LDggKzY5ODcsOCBAQAogICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGFjdGl2ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNjk1NSwxNSArNjk5NiwxNSBAQAogICAgIH0KIAogICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgorICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIHRydWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCB0cnVlIC8qIGFjdGl2ZSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzIyMSw2ICs3MjYyLDcgQEAKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDoKICAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwogICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7CkBAIC03NDgyLDM0ICs3NTI0LDIyIEBACiBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6Ok1tYXBUaHJlYWRIYW5kbGUoY29uc3Qgc3A8TW1hcFRocmVhZD4mIHRocmVhZCkKICAgICA6IG1UaHJlYWQodGhyZWFkKQogeworICAgIGFzc2VydCh0aHJlYWQgIT0gMCk7IC8vIHRocmVhZCBtdXN0IHN0YXJ0IG5vbi1udWxsIGFuZCBzdGF5IG5vbi1udWxsCiB9CiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6fk1tYXBUaHJlYWRIYW5kbGUoKQogewotICAgIE1tYXBUaHJlYWQgKnRocmVhZCA9IG1UaHJlYWQuZ2V0KCk7Ci0gICAgLy8gY2xlYXIgb3VyIHN0cm9uZyByZWZlcmVuY2UgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgdGhlIHRocmVhZDogdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgIC8vIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIGNsb3NlSW5wdXQvY2xvc2VPdXRwdXQgaXMgZXhlY3V0ZWQgdXBvbiBjYWxsIGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIKLSAgICAvLyBhbmQgdGhlIHRocmVhZCByZW1vdmVkIGZyb20gbU1NYXBUaHJlYWRzIGxpc3QgY2F1c2luZyB0aGUgdGhyZWFkIGRlc3RydWN0aW9uLgotICAgIG1UaHJlYWQuY2xlYXIoKTsKLSAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKLSAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0KCk7Ci0gICAgfQorICAgIG1UaHJlYWQtPmRpc2Nvbm5lY3QoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykKIHsKLSAgICBpZiAobVRocmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KICAgICByZXR1cm4gbVRocmVhZC0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCBpbmZvKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5nZXRNbWFwUG9zaXRpb24ocG9zaXRpb24pOwogfQogCkBAIC03NTE3LDI1ICs3NTQ3LDE2IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKIAogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5zdGFydChjbGllbnQsIGhhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6c3RvcChhdWRpb19wb3J0X2hhbmRsZV90IGhhbmRsZSkKIHsKLSAgICBpZiAobVRocmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KICAgICByZXR1cm4gbVRocmVhZC0+c3RvcChoYW5kbGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6OnN0YW5kYnkoKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5zdGFuZGJ5KCk7CiB9CiAKQEAgLTc1NDUsNyArNzU2NiwxMCBAQAogICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAotICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpCisgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCisgICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCisgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpCiB7CiAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKQEAgLTc1NjYsNyArNzU5MCw3IEBACiAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewogICAgICAgICBzdG9wKHQtPnBvcnRJZCgpKTsKICAgICB9Ci0gICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KKyAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOwogICAgIH0gZWxzZSB7CkBAIC03NTc5LDExICs3NjAzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgbUF0dHIgPSAqYXR0cjsKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIG1Qb3J0SWQgPSBwb3J0SWQ7CiB9CiAKQEAgLTc2MjgsNiArNzY1NCwxMCBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgaWYgKCFpc091dHB1dCgpICYmICFyZWNvcmRpbmdBbGxvd2VkKGNsaWVudC5wYWNrYWdlTmFtZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gbUlkOwpAQCAtNzYzOSw3ICs3NjY5LDcgQEAKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlKCk7CiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC03NjUzLDcgKzc2ODMsNyBAQAogICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKQEAgLTc2OTMsNyArNzcyMyw3IEBACiAgICAgfQogCiAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKQEAgLTc5MDQsOCArNzkzNCwxMCBAQAogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fSU5QVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKKyAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgogICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CiAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKQEAgLTc5OTAsMTcgKzgwMjIsMTkgQEAKICAgICAgICAgbVByZXZPdXREZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2FsbGJhY2sgIT0gMCkgeworICAgICAgICBpZiAobURldmljZUlkICE9IGRldmljZUlkICYmIGNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgIGNhbGxiYWNrLT5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKICAgICAgICAgfQorICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9CiAgICAgaWYgKCFpc091dHB1dCgpICYmIG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlKSB7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGlmIChtRGV2aWNlSWQgIT0gZGV2aWNlSWQgJiYgY2FsbGJhY2sgIT0gMCkgewogICAgICAgICAgICAgY2FsbGJhY2stPm9uUm91dGluZ0NoYW5nZWQoZGV2aWNlSWQpOwogICAgICAgICB9CisgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtODExNCwxMCArODE0OCw4IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0aHJlYWRMb29wX2V4aXQoKQogewotICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIGNhbGxiYWNrLT5vblRlYXJEb3duKCk7Ci0gICAgfQorICAgIC8vIERvIG5vdCBjYWxsIGNhbGxiYWNrLT5vblRlYXJEb3duKCkgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZm9yIHRocmVhZCBleGl0CisgICAgLy8gYW5kIGJlY2F1c2UgaXQgY2FuIGNhdXNlIGEgcmVjdXJzaXZlIG11dGV4IGxvY2sgb24gc3RvcCgpLgogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkKQEAgLTgxNzgsNiArODIxMCw4IEBACiAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7CiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC04MTk0LDE4ICs4MjI4LDE3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIHNpemVfdCBudW10cmFja3MgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKLSAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzXG4iLCBudW10cmFja3MpOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwpAQCAtODI0MCw5ICs4MjczLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgTW1hcFRocmVhZDo6Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCwgY2FsbGJhY2ssIHBvcnRJZCk7CisgICAgTW1hcFRocmVhZDo6Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCwgY2FsbGJhY2ssIGRldmljZUlkLCBwb3J0SWQpOwogICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggMDYyYmFkNi4uZGQyYjg5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC01MDgsOSArNTA4LDEwIEBACiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgY2xhc3MgQWN0aXZlVHJhY2tzIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2ZVRyYWNrcygpCisgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0IEFjdGl2ZVRyYWNrcyhTaW1wbGVMb2cgKmxvY2FsTG9nID0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgIDogbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKICAgICAgICAgICAgICAgICAgICAgICAgICwgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uKDApCisgICAgICAgICAgICAgICAgICAgICAgICAsIG1Mb2NhbExvZyhsb2NhbExvZykKICAgICAgICAgICAgICAgICAgICAgeyB9CiAKICAgICAgICAgICAgICAgICAgICAgfkFjdGl2ZVRyYWNrcygpIHsKQEAgLTU2Miw2ICs1NjMsOCBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdXBkYXRlUG93ZXJTdGF0ZShzcDxUaHJlYWRCYXNlPiB0aHJlYWQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgbG9nVHJhY2soY29uc3QgY2hhciAqZnVuY05hbWUsIGNvbnN0IHNwPFQ+ICZ0cmFjaykgY29uc3Q7CisKICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPHVpZF90PiBnZXRXYWtlTG9ja1VpZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IHdha2VMb2NrVWlkczsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VD4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewpAQCAtNTc2LDYgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgICAgICAgICAgICAgICAgICB3cDxUPiAgICAgICAgICAgICAgIG1MYXRlc3RBY3RpdmVUcmFjazsgLy8gbGF0ZXN0IHRyYWNrIGFkZGVkIHRvIEFjdGl2ZVRyYWNrcworICAgICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgKiBjb25zdCAgIG1Mb2NhbExvZzsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgU2ltcGxlTG9nIG1Mb2NhbExvZzsKQEAgLTk5NSw2ICs5OTksOSBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1Id1N1cHBvcnRzUGF1c2U7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUh3UGF1c2VkOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1GbHVzaFBlbmRpbmc7CisgICAgICAgICAgICAgICAgLy8gdm9sdW1lcyBsYXN0IHNlbnQgdG8gYXVkaW8gSEFMIHdpdGggc3RyZWFtLT5zZXRWb2x1bWUoKQorICAgICAgICAgICAgICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7CisgICAgICAgICAgICAgICAgZmxvYXQgbVJpZ2h0Vm9sRmxvYXQ7CiB9OwogCiBjbGFzcyBNaXhlclRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CkBAIC0xMTEyLDkgKzExMTksNiBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKLSAgICAvLyB2b2x1bWVzIGxhc3Qgc2VudCB0byBhdWRpbyBIQUwgd2l0aCBzdHJlYW0tPnNldF92b2x1bWUoKQotICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7Ci0gICAgZmxvYXQgbVJpZ2h0Vm9sRmxvYXQ7CiAgICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlOwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKQEAgLTE0NzUsNiArMTQ3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTE1MzYsNiArMTU0MSw3IEBACiAKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cjsKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZDsKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOwogCiAgICAgICAgICAgICAgICAgd3A8TW1hcFN0cmVhbUNhbGxiYWNrPiAgbUNhbGxiYWNrOwpAQCAtMTU1OCw2ICsxNTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGNsZWFyT3V0cHV0KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2I1NDBjYS4uZDRjZTBiNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtNjEsNiArNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKQEAgLTgyLDYgKzgzLDcgQEAKIAogICAgICAgICAgICAgc3A8SU1lbW9yeT4gZ2V0QnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJNZW1vcnk7IH0KICAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCA9IDA7CiAgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CkBAIC0xMzMsNiArMTM1LDQwIEBACiAgICAgICAgIG1UZXJtaW5hdGVkID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvLyBVcHBlciBjYXNlIGNoYXJhY3RlcnMgYXJlIGZpbmFsIHN0YXRlcy4KKyAgICAvLyBMb3dlciBjYXNlIGNoYXJhY3RlcnMgYXJlIHRyYW5zaXRvcnkuCisgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tTdGF0ZVN0cmluZygpIGNvbnN0IHsKKyAgICAgICAgaWYgKGlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIlQgIjsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICByZXR1cm4gIkkgIjsKKyAgICAgICAgY2FzZSBTVE9QUElOR18xOiAvLyBmb3IgRmFzdCBhbmQgT2ZmbG9hZAorICAgICAgICAgICAgcmV0dXJuICJzMSI7CisgICAgICAgIGNhc2UgU1RPUFBJTkdfMjogLy8gZm9yIEZhc3QgYW5kIE9mZmxvYWQKKyAgICAgICAgICAgIHJldHVybiAiczIiOworICAgICAgICBjYXNlIFNUT1BQRUQ6CisgICAgICAgICAgICByZXR1cm4gIlMgIjsKKyAgICAgICAgY2FzZSBSRVNVTUlORzoKKyAgICAgICAgICAgIHJldHVybiAiciAiOworICAgICAgICBjYXNlIEFDVElWRToKKyAgICAgICAgICAgIHJldHVybiAiQSAiOworICAgICAgICBjYXNlIFBBVVNJTkc6CisgICAgICAgICAgICByZXR1cm4gInAgIjsKKyAgICAgICAgY2FzZSBQQVVTRUQ6CisgICAgICAgICAgICByZXR1cm4gIlAgIjsKKyAgICAgICAgY2FzZSBGTFVTSEVEOgorICAgICAgICAgICAgcmV0dXJuICJGICI7CisgICAgICAgIGNhc2UgU1RBUlRJTkdfMTogLy8gZm9yIFJlY29yZFRyYWNrCisgICAgICAgICAgICByZXR1cm4gInIxIjsKKyAgICAgICAgY2FzZSBTVEFSVElOR18yOiAvLyBmb3IgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgIHJldHVybiAicjIiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICI/ICI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBib29sIGlzT3V0KCkgY29uc3QgeyByZXR1cm4gbUlzT3V0OyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGZvciBUcmFjaywgZmFsc2UgZm9yIFJlY29yZFRyYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhIHRyYWNrIHR5cGUgaWYgbmVlZGVkIGxhdGVyCkBAIC0xNDQsNiArMTgwLDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1CdWZmZXJNZW1vcnk7ICAvLyBjdXJyZW50bHkgbm9uLTAgZm9yIGZhc3QgUmVjb3JkVHJhY2sgb25seQogICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcjsgICAgLy8gc3RhcnQgb2YgdHJhY2sgYnVmZmVyLCB0eXBpY2FsbHkgaW4gc2hhcmVkIG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBPdXRwdXRUcmFjayB3aGVuIGl0IGlzIGluIGxvY2FsIG1lbW9yeQorICAgIHNpemVfdCAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7IC8vIHNpemUgb2YgbUJ1ZmZlciBpbiBieXRlcwogICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKICAgICB0cmFja19zdGF0ZSAgICAgICAgIG1TdGF0ZTsKICAgICBjb25zdCB1aW50MzJfdCAgICAgIG1TYW1wbGVSYXRlOyAgICAvLyBpbml0aWFsIHNhbXBsZSByYXRlIG9ubHk7IGZvciB0cmFja3Mgd2hpY2gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggOTc2M2JmMi4uMGYyNTE1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTUwLDEwICs1MCw2IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0vLyBUT0RPIG1vdmUgdG8gYSBjb21tb24gaGVhZGVyICAoQWxzbyBzaGFyZWQgd2l0aCBBdWRpb1RyYWNrLmNwcCkKLSNkZWZpbmUgTkFOT1NfUEVSX1NFQ09ORCAgICAxMDAwMDAwMDAwCi0jZGVmaW5lIFRJTUVfVE9fTkFOT1ModGltZSkgKCh1aW50NjRfdCkodGltZSkudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCArICh0aW1lKS50dl9uc2VjKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxLDYgKzY3LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBib29sIGlzT3V0LApAQCAtODEsNyArNzgsNyBAQAogICAgICAgICBtVGhyZWFkKHRocmVhZCksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgICAgbUNibGsoTlVMTCksCi0gICAgICAgIC8vIG1CdWZmZXIKKyAgICAgICAgLy8gbUJ1ZmZlciwgbUJ1ZmZlclNpemUKICAgICAgICAgbVN0YXRlKElETEUpLAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgICAgbUZvcm1hdChmb3JtYXQpLApAQCAtMTEzLDE1ICsxMTAsMjIgQEAKIAogICAgIC8vIEFMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKIAotICAgIHNpemVfdCBidWZmZXJTaXplID0gYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudDsKKyAgICBzaXplX3QgbWluQnVmZmVyU2l6ZSA9IGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQ7CiAgICAgLy8gY2hlY2sgb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgYnVmZmVyU2l6ZSBkdWUgdG8gbXVsdGlwbGljYXRpb24gYnkgbUZyYW1lU2l6ZS4KLSAgICBpZiAoYnVmZmVyU2l6ZSA8IGZyYW1lQ291bnQgIC8vIHJvdW5kdXAgcm91bmRzIGRvd24gZm9yIHZhbHVlcyBhYm92ZSBVSU5UX01BWCAvIDIKKyAgICBpZiAobWluQnVmZmVyU2l6ZSA8IGZyYW1lQ291bnQgIC8vIHJvdW5kdXAgcm91bmRzIGRvd24gZm9yIHZhbHVlcyBhYm92ZSBVSU5UX01BWCAvIDIKICAgICAgICAgICAgIHx8IG1GcmFtZVNpemUgPT0gMCAgIC8vIGZvcm1hdCBuZWVkcyB0byBiZSBjb3JyZWN0Ci0gICAgICAgICAgICB8fCBidWZmZXJTaXplID4gU0laRV9NQVggLyBtRnJhbWVTaXplKSB7CisgICAgICAgICAgICB8fCBtaW5CdWZmZXJTaXplID4gU0laRV9NQVggLyBtRnJhbWVTaXplKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzQ3NDk1NzEiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBidWZmZXJTaXplICo9IG1GcmFtZVNpemU7CisgICAgbWluQnVmZmVyU2l6ZSAqPSBtRnJhbWVTaXplOworCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlclNpemUgPSBtaW5CdWZmZXJTaXplOyAvLyBhbGxvY2F0ZWQgaGVyZS4KKyAgICB9IGVsc2UgaWYgKG1pbkJ1ZmZlclNpemUgPiBidWZmZXJTaXplKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzgzNDAxMTciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMICYmIGFsbG9jID09IEFMTE9DX0NCTEspIHsKQEAgLTE3Nyw2ICsxODEsNyBAQAogICAgICAgICAgICAgLy8gSXQgc2hvdWxkIHJlZmVyZW5jZXMgdGhlIGJ1ZmZlciB2aWEgdGhlIHBpcGUuCiAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNhZ2Ugb2YgdGhlIGJ1ZmZlciwgd2Ugc2V0IG1CdWZmZXIgdG8gTlVMTC4KICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBTExPQ19DQkxLOgogICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKQEAgLTE5Niw3ICsyMDEsMTAgQEAKICAgICAgICAgY2FzZSBBTExPQ19OT05FOgogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CiAgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOwogCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7CkBAIC0zNjgsNiArMzc2LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMzc2LDYgKzM4NSw3IEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpIDogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIDogYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCB0cnVlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfUEFUQ0gpID8gKCBidWZmZXIgPT0gTlVMTCA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSkgOiBBTExPQ19DQkxLLAogICAgICAgICAgICAgICAgICAgdHlwZSwgcG9ydElkKSwKQEAgLTQxMSwyMSArNDIxLDYgQEAKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpLCBzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBJcyB0aGUgc2hhcmVkIGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemU/Ci0gICAgICAgIC8vIChmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSkgaXMgPD0gU0laRV9NQVgsIGNoZWNrZWQgaW4gVHJhY2tCYXNlLgotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyLT5zaXplKCkgPCBmcmFtZUNvdW50ICogbUZyYW1lU2l6ZSkgewotICAgICAgICAgICAgLy8gV29ya2Fyb3VuZDogY2xlYXIgb3V0IG1DYmxrIHRvIGluZGljYXRlIHRyYWNrIGhhc24ndCBiZWVuIHByb3Blcmx5IGNyZWF0ZWQuCi0gICAgICAgICAgICBtQ2Jsay0+fmF1ZGlvX3RyYWNrX2NibGtfdCgpOyAgIC8vIGRlc3Ryb3kgb3VyIHNoYXJlZC1zdHJ1Y3R1cmUuCi0gICAgICAgICAgICBpZiAobUNsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2Jsayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2JsayA9IE5VTEw7Ci0KLSAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsgLy8gcmVsZWFzZSBzaGFyZWQgYnVmZmVyIGVhcmx5Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM4MzQwMTE3Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKICAgICB9CkBAIC01MDMsNTggKzQ5OCw0MCBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBOYW1lIEFjdGl2ZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKLSAgICAgICAgICAgICAgICAgICJMIGRCICBSIGRCICBWUyBkQiAgICBTZXJ2ZXIgTWFpbiBidWYgIEF1eCBidWYgRmxhZ3MgVW5kRnJtQ250ICBGbHVzaGVkXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKKyAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgorICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgorICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIEYgJTJkIiwgbUZhc3RJbmRleCk7Ci0gICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIG5vbmUiKTsKLSAgICB9Ci0gICAgdHJhY2tfc3RhdGUgc3RhdGUgPSBtU3RhdGU7Ci0gICAgY2hhciBzdGF0ZUNoYXI7Ci0gICAgaWYgKGlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgIHN0YXRlQ2hhciA9ICdUJzsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgSURMRToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdJJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQSU5HXzE6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAncyc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUElOR18yOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJzUnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdTJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFU1VNSU5HOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1InOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUNUSVZFOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0EnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFVU0lORzoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdwJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBBVVNFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdQJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZMVVNIRUQ6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnRic7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICc/JzsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGNoYXIgdHJhY2tUeXBlOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICBjYXNlIFRZUEVfREVGQVVMVDoKKyAgICBjYXNlIFRZUEVfT1VUUFVUOgorICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB0cmFja1R5cGUgPSAnUyc7IC8vIHN0YXRpYworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2tUeXBlID0gJyAnOyAvLyBub3JtYWwKICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfUEFUQ0g6CisgICAgICAgIHRyYWNrVHlwZSA9ICdQJzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdHJhY2tUeXBlID0gJz8nOwogICAgIH0KKworICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOworICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIG5vbmUiLCB0cmFja1R5cGUpOworICAgIH0KKwogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKICAgICBzd2l0Y2ggKG1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50KSB7CiAgICAgY2FzZSBVTkRFUlJVTl9GVUxMOgpAQCAtNTcxLDMxICs1NDgsNzUgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3RkOjpwYWlyPGZsb2F0IC8qIHZvbHVtZSAqLywgYm9vbCAvKiBhY3RpdmUgKi8+IHZzVm9sdW1lID0gbVZvbHVtZUhhbmRsZXItPmdldExhc3RWb2x1bWUoKTsKLSAgICBzbnByaW50ZigmYnVmZmVyWzhdLCBzaXplIC0gOCwgIiAlNnMgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2enUgJTFjICUxZCAlNXUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmclYyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDh6WCAlMDh6WCAweCUwM1ggJTl1JWMgJTd1XG4iLAorICAgIGNoYXIgZmlsbGluZ1N0YXR1czsKKyAgICBzd2l0Y2ggKG1GaWxsaW5nVXBTdGF0dXMpIHsKKyAgICBjYXNlIEZTX0lOVkFMSUQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnSSc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfRklMTElORzoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdmJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19GSUxMRUQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnRic7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlNfQUNUSVZFOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ0EnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJz8nOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBjbGlwIGZyYW1lc1JlYWR5U2FmZSB0byBtYXggcmVwcmVzZW50YXRpb24gaW4gZHVtcAorICAgIGNvbnN0IHNpemVfdCBmcmFtZXNSZWFkeVNhZmUgPQorICAgICAgICAgICAgc3RkOjptaW4obUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksIChzaXplX3QpOTk5OTk5OTkpOworCisgICAgLy8gb2J0YWluIHZvbHVtZXMKKyAgICBjb25zdCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOworICAgIGNvbnN0IHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPiB2c1ZvbHVtZSA9CisgICAgICAgICAgICBtVm9sdW1lSGFuZGxlci0+Z2V0TGFzdFZvbHVtZSgpOworCisgICAgLy8gT3VyIGVmZmVjdGl2ZSBmcmFtZSBjb3VudCBpcyBvYnRhaW5lZCBieSBTZXJ2ZXJQcm94eTo6Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkKKyAgICAvLyBhcyBpdCBtYXkgYmUgcmVkdWNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemVJbkZyYW1lcyA9IChzaXplX3QpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0QnVmZmVyU2l6ZUluRnJhbWVzKCk7CisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIHNpemUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhlIGFwcC4KKyAgICBjb25zdCBjaGFyIG1vZGlmaWVkQnVmZmVyQ2hhciA9IGJ1ZmZlclNpemVJbkZyYW1lcyA8IG1GcmFtZUNvdW50CisgICAgICAgICAgICA/ICdyJyAvKiBidWZmZXIgcmVkdWNlZCAqLzogYnVmZmVyU2l6ZUluRnJhbWVzID4gbUZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAgICAgPyAnZScgLyogZXJyb3IgKi8gOiAnICcgLyogaWRlbnRpY2FsICovOworCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICU1LjJnICU1LjJnICU1LjJnJWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh6WCAlMDh6WFxuIiwKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAorICAgICAgICAgICAgbUNibGstPm1GbGFncywKKwogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCwKLSAgICAgICAgICAgIHN0YXRlQ2hhciwKLSAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCiAgICAgICAgICAgICB2c1ZvbHVtZS5zZWNvbmQgPyAnQScgOiAnICcsICAvLyBpZiBhbnkgVm9sdW1lU2hhcGVycyBhY3RpdmUKKwogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciwgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAotICAgICAgICAgICAgbUNibGstPm1GbGFncywKKyAgICAgICAgICAgIGJ1ZmZlclNpemVJbkZyYW1lcywKKyAgICAgICAgICAgIG1vZGlmaWVkQnVmZmVyQ2hhciwKKyAgICAgICAgICAgIGZyYW1lc1JlYWR5U2FmZSwKKyAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCk7IC8vIDcgZGlnaXRzCisgICAgICAgICAgICAodW5zaWduZWQpbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzRmx1c2hlZCgpICUgMTAwMDAwMDAsCisKKyAgICAgICAgICAgIChzaXplX3QpbU1haW5CdWZmZXIsIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHNpemVfdCltQXV4QnVmZmVyICAgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4CisgICAgICAgICAgICApOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTEyMzUsNyArMTI1Niw4IEBACiAgICAgICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fUEFUQ0gsCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgIE5VTEwsIDAsIEFVRElPX1NFU1NJT05fTk9ORSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgVFlQRV9PVVRQVVQpLAogICAgIG1BY3RpdmUoZmFsc2UpLCBtU291cmNlVGhyZWFkKHNvdXJjZVRocmVhZCkKIHsKQEAgLTEzNTEsNyArMTM3Myw5IEBACiAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSkgewogICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5yZW1vdmVBdCgwKTsKICAgICAgICAgICAgICAgICBmcmVlKHBJbkJ1ZmZlci0+bUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MzAsMTAgKzE0NTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICBidWZmZXIsIDAsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCkBAIC0xNTY3LDEzICsxNTkzLDE0IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBidWZmZXJTaXplLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovLAogICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9ERUZBVUxUKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpID8gQUxMT0NfUElQRSA6IEFMTE9DX0NCTEspIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChidWZmZXIgPT0gTlVMTCkgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpLApAQCAtMTcwMSwyMiArMTcyOCwyOCBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICAgQWN0aXZlIENsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudCBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnRcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICU2cyAlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enUgJTV1XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAiJTA4WCAlNnp1XG4iLAorICAgICAgICAgICAgaXNGYXN0VHJhY2soKSA/ICdGJyA6ICcgJywKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKKyAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCisKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgbVN0YXRlLAotICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogCisgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKKyAgICAgICAgICAgIG1GcmFtZUNvdW50CisgICAgICAgICAgICApOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xNzY3LDkgKzE4MDAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKICAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKIHsKICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTgzNCwxMSArMTg2OCwxNSBAQAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgMCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIChzaXplX3QpMCAvKiBmcmFtZUNvdW50ICovLAorICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qIGlzT3V0ICovLAogICAgICAgICAgICAgICAgICAgQUxMT0NfTk9ORSwKLSAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKQorICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAorICAgICAgICBtUGlkKHBpZCkKIHsKIH0KIApAQCAtMTg4NSwxNyArMTkyMywxNyBAQAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDbGllbnQgRm10IENobiBtYXNrICBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAgICAgICAgICU2dSAlM3UgICAgJTA4WCAlNXVcbiIsCi0gICAgICAgICAgICBtVWlkLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKLQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDJkODQwMjguLjkwOWFmMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC04OCwxMSArODgsMTEgQEAKIAogLy8gV3JpdGUgaGlzdG9ncmFtIHRpbWVzdGFtcCBlbnRyeQogI2RlZmluZSBMT0dfSElTVF9UUygpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC0+bG9nSGlzdFRTKGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKKyAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCi0vLyBmbHVzaCBhbGwgaGlzdG9ncmFtCi0jZGVmaW5lIExPR19ISVNUX0ZMVVNIKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5sb2dIaXN0Rmx1c2goaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQorLy8gUmVjb3JkIHRoYXQgYXVkaW8gd2FzIHR1cm5lZCBvbi9vZmYKKyNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawppbmRleCBhZDM0MGU1Li42NTU3MWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDggQEAKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAogICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGliZWZmZWN0c2NvbmZpZwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IGM4NjgyMDYuLjdiMTlmNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtMzQ5LDggKzM0OSw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ODNmYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2ptdHJpdmlAZ29vZ2xlLmNvbQora3JvY2FyZEBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKaW5kZXggMjAyYjQxNy4uM2EyYTdhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CiAjaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ1LDE0ICs0NiwxNCBAQAogCiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uOyB9Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1JbnB1dFNvdXJjZTsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQorICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1VaWQgPSB1aWQ7IH0KKyAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KKyAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9CiAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CiAgICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7CkBAIC02NiwxMSArNjcsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1JbnB1dFNvdXJjZTsKKyAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtUmVjb3JkQ2xpZW50SW5mbzsKICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNvbmZpZzsKICAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKLSAgICB1aWRfdCBtVWlkOwogICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKICAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKICAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKaW5kZXggMmM0NTgzMy4uOGM0NzMzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCkBAIC0zOSw5ICszOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU291bmRUcmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1JbnB1dFNvdXJjZShpbnB1dFNvdXJjZSksCisgICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAogICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtVWlkKHVpZCksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCisgICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKICAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKIHsKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6CiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBtU2Vzc2lvbiwgbUlucHV0U291cmNlLAorICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmbVJlY29yZENsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCiBib29sIEF1ZGlvU2Vzc2lvbjo6bWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3QKIHsKLSAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtU2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtSW5wdXRTb3VyY2UgJiYKKyAgICBpZiAob3RoZXItPnNlc3Npb24oKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uICYmCisgICAgICAgIG90aGVyLT5pbnB1dFNvdXJjZSgpID09IG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSAmJgogICAgICAgICBvdGhlci0+Zm9ybWF0KCkgPT0gbUNvbmZpZy5mb3JtYXQgJiYKICAgICAgICAgb3RoZXItPnNhbXBsZVJhdGUoKSA9PSBtQ29uZmlnLnNhbXBsZV9yYXRlICYmCiAgICAgICAgIG90aGVyLT5jaGFubmVsTWFzaygpID09IG1Db25maWcuY2hhbm5lbF9tYXNrICYmCiAgICAgICAgIG90aGVyLT5mbGFncygpID09IG1GbGFncyAmJgotICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVVpZCkgeworICAgICAgICBvdGhlci0+dWlkKCkgPT0gbVJlY29yZENsaWVudEluZm8udWlkKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzIsOCArMTMyLDcgQEAKICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTQ2LDExICsxNDUsMTEgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHNlc3Npb24gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbUlucHV0U291cmNlKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLmZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGJmNTA4YWMuLjViN2FlN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTEzLDcgKzEzLDcgQEAKICAgICAgICAgPC9taXhQb3J0PgogICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KICAgICAgICAgPC9taXhQb3J0PgogICAgPC9taXhQb3J0cz4KICAgIDxkZXZpY2VQb3J0cz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IGI2MDA5NDAuLmVkN2EyM2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMTMxOSw5ICsxMzE5LDkgQEAKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIG91dHB1dERlc2MtPmRldmljZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKQEAgLTE0OTksNjIgKzE0OTksMTMgQEAKICAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAogICAgICAgICAgIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncyk7CiAKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1tYXAgY2FwdHVyZTogaWYgYW4gaW5wdXQgSU8gaGFuZGxlIGlzIHNwZWNpZmllZCwgd2UgcmV1c2UgdGhpcyBpbnB1dCBpZgotICAgIC8vIHBvc3NpYmxlCi0gICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgPT0gQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRICYmCi0gICAgICAgICAgICAqaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleSgqaW5wdXQpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBNTUFQIGlucHV0ICVkIiwgKmlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBNTUFQIG1vZGUsIHRoZSBmaXJzdCBjYWxsIHRvIGdldElucHV0Rm9yQXR0cigpIGlzIG1hZGUgb24gYmVoYWxmIG9mIGF1ZGlvZmxpbmdlci4KLSAgICAgICAgLy8gVGhlIHNlY29uZCBjYWxsIGlzIGZvciB0aGUgZmlyc3QgYWN0aXZlIGNsaWVudCBhbmQgc2V0cyB0aGUgVUlELiBBbnkgZnVydGhlciBjYWxsCi0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGEgbmV3IGNsaWVudCBhbmQgaXMgb25seSBwZXJtaXR0ZWQgZnJvbSB0aGUgc2FtZSBVSWQuCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBzZXNzaW9uICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KDEpOwotICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGlucHV0RGVzYy0+bURldmljZSk7Ci0gICAgICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBNTUFQIGlucHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19GVU5DVElPTl9fLCAqaW5wdXQsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOwotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZTsKKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwotCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLSAgICB9Ci0gICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQorICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXM7CiAKICAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CkBAIC0xNTY4LDExICsxNTE5LDY3IEBACiAgICAgfQogICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKIAorICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCisgICAgLy8gcG9zc2libGUKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSA9PSBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEgJiYKKyAgICAgICAgICAgICppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KCppbnB1dCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSB1bmtub3duIE1NQVAgaW5wdXQgJWQiLCAqaW5wdXQpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIE1NQVAgbW9kZSwgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgaXMgbWFkZSBvbiBiZWhhbGYgb2YgYXVkaW9mbGluZ2VyLgorICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKKyAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJZC4KKyAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CisgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOworICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQorICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOworCisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9CisgICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKworICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAorICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKwogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgogICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CkBAIC0xNTgxLDcgKzE1ODgsOCBAQAogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7CiAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgewogICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CkBAIC0xNjEwLDExICsxNjE4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgpOwogICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CiAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIApAQCAtMTYyMiw2ICsxNjMwLDEwIEBACiAgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyb3I6CisgICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIApAQCAtNDcyMywxMCArNDczNSwxMCBAQAogICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQogICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKICAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkKICAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKQEAgLTQ3NDMsMTAgKzQ3NTUsMTAgQEAKICAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKICAgICAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CiAgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKQEAgLTQ5MjgsMTIgKzQ5NDAsMTMgQEAKICAgICAvLyBzY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCwgZm9yIGVhY2ggZW50cnksIGNvbnZlcnQgdGhlIHN0cmVhbSB0eXBlIHRvIGEgc3RyYXRlZ3kKICAgICAvLyAoZ2V0U3RyYXRlZ3koc3RyZWFtKSkuCiAgICAgLy8gaWYgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIHN0cmVhbSB0eXBlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCi0gICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvCi0gICAgLy8gdGhlIGRldmljZSA9IHRoZSBkZXZpY2UgZnJvbSB0aGUgZGVzY3JpcHRvciBpbiB0aGUgUm91dGVNYXAsIGFuZCBleGl0LgorICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKKyAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KICAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1PdXRwdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKICAgICAgICAgcm91dGluZ19zdHJhdGVneSByb3V0ZVN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKTsKLSAgICAgICAgaWYgKChyb3V0ZVN0cmF0ZWd5ID09IHN0cmF0ZWd5KSAmJiByb3V0ZS0+aXNBY3RpdmUoKSkgeworICAgICAgICBpZiAoKHJvdXRlU3RyYXRlZ3kgPT0gc3RyYXRlZ3kpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwogICAgICAgICB9CiAgICAgfQpAQCAtNTMyOCw5ICs1MzQxLDE1IEBACiAKIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQogeworICAgIC8vIFJvdXRpbmcKKyAgICAvLyBTY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCByb3V0ZToKKyAgICAvLyBpZiB0aGUgaW5wdXQgc291cmNlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCisgICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvIGFuZCB0aGUgZGV2aWNlIGluIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQorICAgIC8vIHRoZW4gc2VsZWN0IHRoaXMgZGV2aWNlLgogICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbUlucHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7CiAgICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7Ci0gICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UgJiYgcm91dGUtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewogICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKICAgICAgICAgIH0KICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGRiY2MwNzAuLjMxYzk1NzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTIyMCwxMSArMjIwLDExIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNjU0NDY1ZC4uODRiMTA3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzksMTEgKzQxLDE3IEBACiAKIEF1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKIHsKLSAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcwotICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICBzdGF0dXNfdCBsb2FkUmVzdWx0ID0gbG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCk7CisgICAgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CisgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgICAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9hZFJlc3VsdCA+IDApIHsKKyAgICAgICAgQUxPR0UoIkVmZmVjdCBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJWQgZWxlbWVudHMiLCBsb2FkUmVzdWx0KTsKICAgICB9CiB9CiAKQEAgLTY4NSw2ICs2OTMsMjggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0WG1sQ29uZmlnKCkgeworICAgIGF1dG8gcmVzdWx0ID0gZWZmZWN0c0NvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGF1dG8gbG9hZFByb2Nlc3NpbmdDaGFpbiA9IFtdKGF1dG8mIHByb2Nlc3NpbmdDaGFpbiwgYXV0byYgc3RyZWFtcykgeworICAgICAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICAgICAgYXV0byBlZmZlY3REZXNjcyA9IHN0ZDo6bWFrZV91bmlxdWU8RWZmZWN0RGVzY1ZlY3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgZWZmZWN0IDogc3RyZWFtLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKHN0cmVhbS50eXBlLCBlZmZlY3REZXNjcy5yZWxlYXNlKCkpOworICAgICAgICB9CisgICAgfTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOworICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjbm9kZSAqcm9vdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDBjNzRkODcuLjU5ZDVkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTU1LDcgKzE1NSw4IEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsgLy8gVE9ETzogYWRkIGxlZ2FjeSBpbiB0aGUgbmFtZQorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOyAvLyBUT0RPOiByZW1vdmUgIlhtbCIgaW4gdGhlIG5hbWUKIAogICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggZjYwMDMwZC4uYjdiY2U1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMjg5LDEzICsyODksNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7Ci0KICAgICBib29sIHVwZGF0ZVBpZCA9IChwaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CkBAIC0zMTMsNyArMzA2LDE1IEBACiAgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCisgICAgaWYgKChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkLCB1aWQpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CisKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCiAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGM0ZjYzNjcuLmI0MTc2MzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTE4NSwyMSArMTg1LDIxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgc2Vzc2lvbiwgc291cmNlLAorICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICB9CiB9CkBAIC0yNjcsMTIgKzI2NywxMiBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTU0NCw4ICs1NDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCBkYXRhLT5tU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tU291cmNlLCAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCAmZGF0YS0+bUNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsICZkYXRhLT5tRGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKQEAgLTgxMCw3ICs4MTAsNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CkBAIC04MTgsMTQgKzgxOCwxMyBAQAogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOwogICAgIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhICpkYXRhID0gbmV3IFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhKCk7CiAgICAgZGF0YS0+bUV2ZW50ID0gZXZlbnQ7Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGRhdGEtPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgZGF0YS0+bUNsaWVudEluZm8gPSAqY2xpZW50SW5mbzsKICAgICBkYXRhLT5tQ2xpZW50Q29uZmlnID0gKmNsaWVudENvbmZpZzsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgZXZlbnQsIHNvdXJjZSk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAorICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMzU1NDJmMS4uMzhkNGIxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogCiAgICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCiBwcml2YXRlOgpAQCAtMzA2LDggKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKQEAgLTQwNCw4ICs0MDQsNyBAQAogICAgICAgICBjbGFzcyBSZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgaW50IG1FdmVudDsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1EZXZpY2VDb25maWc7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CkBAIC01MTgsNyArNTE3LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwogCkBAIC01NDAsOCArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL09XTkVSUyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhY2ZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjeWNoZW5AZ29vZ2xlLmNvbQorZXBlZXZAZ29vZ2xlLmNvbQorZXRhbHZhbGFAZ29vZ2xlLmNvbQorc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoreWluY2hpYXllaEBnb29nbGUuY29tCit6aGlqdW5oZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBmMWNkZWEzLi43ZWMzY2NiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTc3LDcgKzc3LDggQEAKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zCiAKIExPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBhMjg1MThlLi41ODVkMmViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTcyLDYgKzcyLDIwIEBACiAgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIpOwogfQogCitib29sIENhbWVyYTJDbGllbnQ6OmlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpIHsKKyAgICBib29sIHpzbEVuYWJsZWQgPSBmYWxzZTsKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGlsbFRlbXBsYXRlOworICAgIHN0YXR1c190IHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW5hYmxlWnNsID0gc3RpbGxUZW1wbGF0ZS5maW5kKEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMKTsKKyAgICAgICAgaWYgKGVuYWJsZVpzbC5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICB6c2xFbmFibGVkID0gKGVuYWJsZVpzbC5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMX1RSVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHpzbEVuYWJsZWQ7Cit9CisKIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cikKIHsKQEAgLTkzLDYgKzEwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CisKKyAgICAgICAgbC5tUGFyYW1ldGVycy5pc0RldmljZVpzbFN1cHBvcnRlZCA9IGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogICAgIH0KIAogICAgIFN0cmluZzggdGhyZWFkTmFtZTsKQEAgLTg0Myw2ICs4NTksMTIgQEAKIAogICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRQcmV2aWV3U3RyZWFtSWQoKSk7CiAKKyAgICBpZiAocGFyYW1zLmlzRGV2aWNlWnNsU3VwcG9ydGVkKSB7CisgICAgICAgIC8vIElmIGRldmljZSBaU0wgaXMgc3VwcG9ydGVkLCByZXN1bWUgcHJldmlldyBidWZmZXJzIHRoYXQgbWF5IGJlIHBhdXNlZAorICAgICAgICAvLyBkdXJpbmcgbGFzdCB0YWtlUGljdHVyZSgpLgorICAgICAgICBtRGV2aWNlLT5kcm9wU3RyZWFtQnVmZmVycyhmYWxzZSwgZ2V0UHJldmlld1N0cmVhbUlkKCkpOworICAgIH0KKwogICAgIGlmICghcGFyYW1zLnJlY29yZGluZ0hpbnQpIHsKICAgICAgICAgaWYgKCFyZXN0YXJ0KSB7CiAgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT51cGRhdGVQcmV2aWV3UmVxdWVzdChwYXJhbXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCA3MjMxNWQ0Li41YWY3NGViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtMjI0LDYgKzIyNCw4IEBACiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUUHJvdmlkZXJQdHI+CiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKTsKKworICAgIGJvb2wgaXNac2xFbmFibGVkSW5TdGlsbFRlbXBsYXRlKCk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKaW5kZXggM2Y0MDE3Zi4uMGQyZGJhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCkBAIC0xMjEsMTggKzEyMSwxNyBAQAogCiAgICAgaWYgKG1DYWxsYmFja1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQotICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRGb3JtYXQ7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FsbGJhY2tTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgJmN1cnJlbnRGb3JtYXQsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FsbGJhY2tTdHJlYW1JZCwgJnN0cmVhbUluZm8pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgY2FsbGJhY2sgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucHJldmlld1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQgfHwKLSAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ICE9ICh1aW50MzJfdCljYWxsYmFja0Zvcm1hdCkgeworICAgICAgICBpZiAoc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdXaWR0aCB8fAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMucHJldmlld0hlaWdodCB8fAorICAgICAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdCljYWxsYmFja0Zvcm1hdCkpIHsKICAgICAgICAgICAgIC8vIFNpbmNlIHNpemUgc2hvdWxkIG9ubHkgY2hhbmdlIHdoaWxlIHByZXZpZXcgaXMgbm90IHJ1bm5pbmcsCiAgICAgICAgICAgICAvLyBhc3N1bWluZyB0aGF0IGFsbCBleGlzdGluZyB1c2Ugb2Ygb2xkIGNhbGxiYWNrIHN0cmVhbSBpcwogICAgICAgICAgICAgLy8gY29tcGxldGVkLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IGI2NWYxYzcuLjFlZTIxNmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTU1Myw2ICs1NTMsMTIgQEAKICAgICAgICAgcmV0dXJuIERPTkU7CiAgICAgfQogCisgICAgaWYgKGwubVBhcmFtZXRlcnMuaXNEZXZpY2Vac2xTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gSWYgZGV2aWNlIFpTTCBpcyBzdXBwb3J0ZWQsIGRyb3AgYWxsIHBlbmRpbmcgcHJldmlldyBidWZmZXJzIHRvIHJlZHVjZSB0aGUgY2hhbmNlIG9mCisgICAgICAgIC8vIHJlbmRlcmluZyBwcmV2aWV3IGZyYW1lcyBuZXdlciB0aGFuIHRoZSBzdGlsbCBmcmFtZS4KKyAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS0+ZHJvcFN0cmVhbUJ1ZmZlcnModHJ1ZSwgY2xpZW50LT5nZXRQcmV2aWV3U3RyZWFtSWQoKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ2xlYXIgdGhlIHN0cmVhbWluZyByZXF1ZXN0IGZvciBzdGlsbC1jYXB0dXJlIHBpY3R1cmVzCiAgICAgICogICAoYXMgb3Bwb3NlZCB0byBpLmUuIHZpZGVvIHNuYXBzaG90cykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBkNmQ4ZGRlLi5kOGI3YWYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC0xMzYsMTcgKzEzNiwxNiBAQAogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYXB0dXJlU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FwdHVyZVN0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnBpY3R1cmVXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CisgICAgICAgIGlmIChzdHJlYW1JbmZvLndpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucGljdHVyZVdpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRGVsZXRpbmcgc3RyZWFtICVkIHNpbmNlIHRoZSBidWZmZXIgZGltZW5zaW9ucyBjaGFuZ2VkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCBhMzA1YmM3Li42ZmI1YzIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC05NTQsNyArOTU0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJWQ6IERpc2FibGluZyBaU0wgbW9kZSIsIGNhbWVyYUlkKTsKICAgICAgICAgYWxsb3dac2xNb2RlID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKQEAgLTE5OTcsNyArMTk5OCw4IEBACiAgICAgaWYgKHByZXZpZXdGcHNSYW5nZVsxXSA+IDFlOS9taW5GcmFtZUR1cmF0aW9uTnMgKyBGUFNfTUFSR0lOKSB7CiAgICAgICAgIHNsb3dKcGVnTW9kZSA9IHRydWU7CiAgICAgfQotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGlzWnNsUmVwcm9jZXNzUHJlc2VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IGJlYTg2N2EuLjE3ZTNkNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTc1LDYgKzE3NSw4IEBACiAgICAgYm9vbCBzbG93SnBlZ01vZGU7CiAgICAgLy8gV2hldGhlciBaU0wgcmVwcm9jZXNzIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgogICAgIGJvb2wgaXNac2xSZXByb2Nlc3NQcmVzZW50OworICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBlbmFibGVac2wuCisgICAgYm9vbCBpc0RldmljZVpzbFN1cHBvcnRlZDsKIAogICAgIC8vIE92ZXJhbGwgY2FtZXJhIHN0YXRlCiAgICAgZW51bSBTdGF0ZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IGQ3OWU0MzAuLjczZGNhNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC0xNjEsMTggKzE2MSwxNyBAQAogCiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1QcmV2aWV3U3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUHJldmlld1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBwcmV2aWV3IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucHJldmlld1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcmV2aWV3IHNpemUgc3dpdGNoOiAlZCB4ICVkIC0+ICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0KTsKICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMzEyLDEwICszMTEsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwotICAgIGFuZHJvaWRfZGF0YXNwYWNlIGN1cnJlbnREYXRhU3BhY2U7Ci0gICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgIENhbWVyYURldmljZUJhc2U6OlN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKyAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zMjQsMTAgKzMyMSwxMCBAQAogICAgIH0KIAogICAgIGlmIChtUmVjb3JkaW5nV2luZG93ID09IG51bGxwdHIgfHwKLSAgICAgICAgICAgIGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAotICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICBjdXJyZW50RGF0YVNwYWNlICE9IHBhcmFtcy52aWRlb0RhdGFTcGFjZSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwKKyAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAhc3RyZWFtSW5mby5tYXRjaERhdGFTcGFjZShwYXJhbXMudmlkZW9EYXRhU3BhY2UpKSB7CiAgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMzQ4LDIyICszNDUsMTggQEAKIAogICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgdWludDMyX3QgY3VycmVudEZvcm1hdDsKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwKLSAgICAgICAgICAgICAgICAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUmVjb3JkaW5nU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBwYXJhbXMudmlkZW9EYXRhU3BhY2UpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAorICAgICAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAgICAgIXN0cmVhbUluZm8ubWF0Y2hEYXRhU3BhY2UocGFyYW1zLnZpZGVvRGF0YVNwYWNlKSkgewogICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdhaXQgdG8gYmUgc3VyZSBwcmV2aW91cyByZWNvcmRpbmcgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtUmVjb3JkaW5nU3RyZWFtSWQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDliYzMxYjkuLmIwNjA3ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0yMzMsMTcgKzIzMywxNiBAQAogCiAgICAgaWYgKChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB8fCAobUlucHV0U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQotICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCkgeworICAgICAgICBpZiAoc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0KSB7CiAgICAgICAgICAgICBpZiAobVpzbFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW0gJWQgc2luY2UgdGhlIGJ1ZmZlciAiCiAgICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbnMgY2hhbmdlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggMDQyOWU3Zi4uYzAzZThhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMzEzLDExICszMTMsMTMgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJWQgaW5wdXQgc3RyZWFtLCAlenUgb3V0cHV0IHN1cmZhY2VzKSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID8gMSA6IDAsCiAgICAgICAgICAgICBtU3RyZWFtTWFwLnNpemUoKSk7CkBAIC01NjgsNyArNTcwLDcgQEAKICAgICAgICAgLypvdXQqLwogICAgICAgICBpbnQqIG5ld1N0cmVhbUlkKSB7CiAgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc3VyZmFjZVR5cGU7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgIHN0YXR1c190IGVycjsKICAgICBiaW5kZXI6OlN0YXR1cyByZXM7CkBAIC03NjQsMjQgKzc2NiwyMyBAQAogICAgIC8vIFF1ZXJ5IGNvbnN1bWVyIHVzYWdlIGJpdHMgdG8gc2V0IGFzeW5jIG9wZXJhdGlvbiBtb2RlIGZvcgogICAgIC8vIEdMQ29uc3VtZXIgdXNpbmcgY29udHJvbGxlZEJ5QXBwIHBhcmFtZXRlci4KICAgICBib29sIHVzZUFzeW5jID0gZmFsc2U7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IGdicC0+cXVlcnkoTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgJmNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gZ2JwLT5nZXRDb25zdW1lclVzYWdlKCZjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgY29uc3VtZXIgdXNhZ2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmIChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgewotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlcyB3aXRoIGNvbnN1bWVyIHVzYWdlIGZsYWc6IDB4JXg6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGNvbnN1bWVyVXNhZ2UpOwogICAgICAgICB1c2VBc3luYyA9IHRydWU7CiAgICAgfQogCi0gICAgaW50MzJfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKKyAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOwotICAgIGludDMyX3QgYWxsb3dlZEZsYWdzID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9NQVNLIHwKKyAgICB1aW50NjRfdCBhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKICAgICBib29sIGZsZXhpYmxlQ29uc3VtZXIgPSAoY29uc3VtZXJVc2FnZSAmIGRpc2FsbG93ZWRGbGFncykgPT0gMCAmJgpAQCAtODc0LDcgKzg3NSw3IEBACiAgICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7CiAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAweCV4IHZzIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOlN1cmZhY2UgdXNhZ2UgZmxhZyBkb2Vzbid0IG1hdGNoICUiIFBSSXU2NCAiIHZzICUiIFBSSXU2NCAiIiwKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBjb25zdW1lclVzYWdlLCBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKQEAgLTEzNTMsNyArMTM1NCw3IEBACiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICByZW1vdGVDYi0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCBtU3RyZWFtaW5nUmVxdWVzdElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWRMb2NrKG1TdHJlYW1pbmdSZXF1ZXN0SWRMb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGU4ZmMwODAuLjUwNjYxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjEzLDEzICsyMTMsMTMgQEAKICAgICAgICAgaW50IGhlaWdodDsKICAgICAgICAgaW50IGZvcm1hdDsKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwotICAgICAgICBpbnQzMl90IGNvbnN1bWVyVXNhZ2U7CisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgICAgIGJvb2wgZmluYWxpemVkID0gZmFsc2U7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6CiAgICAgICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIGludDMyX3QgX2NvbnN1bWVyVXNhZ2UpIDoKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBfY29uc3VtZXJVc2FnZSkgOgogICAgICAgICAgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKICAgICAgICAgICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSB7fQogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBkOTA1OWYzLi5hOTAwNTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlcXVlc3RlZCBzaXplLCBmb3JtYXQsIHJvdGF0aW9uIGFuZApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KQEAgLTE0MiwxMiArMTQyLDUxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsIC8qb3V0Ki8gaW50MzJfdCAqaWQpID0gMDsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIGJvb2wgZm9ybWF0T3ZlcnJpZGRlbjsKKyAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxGb3JtYXQ7CisKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOworICAgICAgICBib29sIGRhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG9yaWdpbmFsRGF0YVNwYWNlOworCisgICAgICAgIFN0cmVhbUluZm8oKSA6IHdpZHRoKDApLCBoZWlnaHQoMCksIGZvcm1hdCgwKSwgZm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksIG9yaWdpbmFsRm9ybWF0KDApLAorICAgICAgICAgICAgICAgIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLCBkYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHt9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBmb3JtYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRm9ybWF0KHVpbnQzMl90IGNsaWVudEZvcm1hdCkgY29uc3QgeworICAgICAgICAgICAgaWYgKChmb3JtYXRPdmVycmlkZGVuICYmIChvcmlnaW5hbEZvcm1hdCA9PSBjbGllbnRGb3JtYXQpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IGNsaWVudEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBkYXRhc3BhY2UgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGNsaWVudERhdGFTcGFjZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChkYXRhU3BhY2VPdmVycmlkZGVuICYmIChvcmlnaW5hbERhdGFTcGFjZSA9PSBjbGllbnREYXRhU3BhY2UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZGF0YVNwYWNlID09IGNsaWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfTsKKwogICAgIC8qKgogICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0cmVhbS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCBzdHJlYW0gZ3JhbGxvYyBidWZmZXIgdHJhbnNmb3JtCkBAIC0zMTAsNiArMzQ5LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25zdW1lclN1cmZhY2VzKGludCBzdHJlYW1JZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBEcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZCBpZiBkcm9wcGluZyBpcyB0cnVlLiBJZiBkcm9wcGluZyBpcyBmYWxzZSwgZG8gbm90CisgICAgICogZHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcm9wU3RyZWFtQnVmZmVycyhib29sIC8qZHJvcHBpbmcqLywgaW50IC8qc3RyZWFtSWQqLykgPSAwOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggNWFkZGFmMS4uZTZhNmEyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwMiwxMiArMjAyLDE3IEBACiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBwcm92aWRlci0+bUludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdXRvIHJldCA9IHByb3ZpZGVyLT5tSW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKICAgICAgICAgICAgICAgICBbJnN1cHBvcnRdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ZWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3VwcG9ydDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAKaW5kZXggNDY5Yzg2Yy4uNTIyZDUyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAKQEAgLTI5LDExICsyOSw2IEBACiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCkKIHsKICAgICBBTE9HSSgiRGVzdHJveWluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKG1EZXZpY2UpIHsKLSAgICAgICAgaW50IHJjID0gbURldmljZS0+Y29tbW9uLmNsb3NlKCZtRGV2aWNlLT5jb21tb24pOwotICAgICAgICBpZiAocmMgIT0gT0spCi0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNsb3NlIGNhbWVyYSAlczogJWQiLCBtTmFtZS5zdHJpbmcoKSwgcmMpOwotICAgIH0KICAgICBpZiAobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICBtSGlkbERldmljZS0+Y2xvc2UoKTsKICAgICAgICAgbUhpZGxEZXZpY2UuY2xlYXIoKTsKQEAgLTQyLDEyICszNyw2IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgewotICAgIGlmIChtRGV2aWNlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBsaWJoYXJkd2FyZSBwYXRoISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogICAgIEFMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcyIsIG1OYW1lLnN0cmluZygpKTsKIAogICAgIHN0YXR1c190IHJldCA9IG1hbmFnZXItPm9wZW5TZXNzaW9uKG1OYW1lLnN0cmluZygpLCB0aGlzLCAmbUhpZGxEZXZpY2UpOwpAQCAtMTA4LDU4ICs5Nyw3OCBAQAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYUhlYXBNZW1vcnkgaGFzIEZEICVkIChleHBlY3QgPj0gMCkiLCBfX0ZVTkNUSU9OX18sIG1lbVBvb2xJZCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKICAgICBtSGlkbE1lbVBvb2xNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1lbVBvb2xJZCwgbWVtKSk7CiAgICAgcmV0dXJuIG1lbVBvb2xJZDsKIH0KIAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6dW5yZWdpc3Rlck1lbW9yeSh1aW50MzJfdCBtZW1JZCkgewotICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQobWVtSWQpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIG1lbUlkKTsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7CisgICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQobWVtSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBtZW1JZCk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBtZW0gPSBtSGlkbE1lbVBvb2xNYXAuYXQobWVtSWQpOworICAgICAgICBtSGlkbE1lbVBvb2xNYXAuZXJhc2UobWVtSWQpOwogICAgIH0KLSAgICBjYW1lcmFfbWVtb3J5X3QqIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChtZW1JZCk7CiAgICAgc1B1dE1lbW9yeShtZW0pOwotICAgIG1IaWRsTWVtUG9vbE1hcC5lcmFzZShtZW1JZCk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CiAKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmRhdGFDYWxsYmFjaygKICAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGJ1ZmZlckluZGV4LAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkNhbWVyYUZyYW1lTWV0YWRhdGEmIG1ldGFkYXRhKSB7Ci0gICAgaWYgKG1IaWRsTWVtUG9vbE1hcC5jb3VudChkYXRhKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7CisgICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpOwogICAgIH0KICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCBtZDsKICAgICBtZC5udW1iZXJfb2ZfZmFjZXMgPSBtZXRhZGF0YS5mYWNlcy5zaXplKCk7CiAgICAgbWQuZmFjZXMgPSAoY2FtZXJhX2ZhY2VfdCopIG1ldGFkYXRhLmZhY2VzLmRhdGEoKTsKLSAgICBzRGF0YUNiKChpbnQzMl90KSBtc2dUeXBlLCBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSksIGJ1ZmZlckluZGV4LCAmbWQsIHRoaXMpOworICAgIHNEYXRhQ2IoKGludDMyX3QpIG1zZ1R5cGUsIG1lbSwgYnVmZmVySW5kZXgsICZtZCwgdGhpcyk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CiAKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgKICAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsIHVpbnQzMl90IGRhdGEsCiAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCkgewotICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOworICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKTsKICAgICB9Ci0gICAgc0RhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIChpbnQzMl90KSBtc2dUeXBlLCBtSGlkbE1lbVBvb2xNYXAuYXQoZGF0YSksIGJ1ZmZlckluZGV4LCB0aGlzKTsKKyAgICBzRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgKGludDMyX3QpIG1zZ1R5cGUsIG1lbSwgYnVmZmVySW5kZXgsIHRoaXMpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpoYW5kbGVDYWxsYmFja1RpbWVzdGFtcCgKICAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsIGNvbnN0IGhpZGxfaGFuZGxlJiBmcmFtZURhdGEsIHVpbnQzMl90IGRhdGEsCiAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCkgewotICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgZGF0YSk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOworICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKTsKICAgICB9Ci0gICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpLT5oYW5kbGUpKTsKKyAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBoZWFwTWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obWVtLT5oYW5kbGUpKTsKICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikKLSAgICAgICAgICAgIG1lbS0+bUJ1ZmZlcnNbYnVmZmVySW5kZXhdLT5wb2ludGVyKCk7CisgICAgICAgICAgICBoZWFwTWVtLT5tQnVmZmVyc1tidWZmZXJJbmRleF0tPnBvaW50ZXIoKTsKICAgICBtZC0+cEhhbmRsZSA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oZnJhbWVEYXRhLmdldE5hdGl2ZUhhbmRsZSgpKTsKLSAgICBzRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgKGludDMyX3QpIG1zZ1R5cGUsIG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKSwgYnVmZmVySW5kZXgsIHRoaXMpOworICAgIHNEYXRhQ2JUaW1lc3RhbXAodGltZXN0YW1wLCAoaW50MzJfdCkgbXNnVHlwZSwgbWVtLCBidWZmZXJJbmRleCwgdGhpcyk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CiAKQEAgLTE2OCwyNyArMTc3LDI4IEBACiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+JiBtZXNzYWdlcykgewogICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OkhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+IG1zZ3M7CiAgICAgbXNncy5yZXNlcnZlKG1lc3NhZ2VzLnNpemUoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBoaWRsX21zZyA6IG1lc3NhZ2VzKSB7CisgICAgICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGhpZGxfbXNnLmRhdGEpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgaGlkbF9tc2cuZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBtZW0oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obUhpZGxNZW1Qb29sTWFwLmF0KGhpZGxfbXNnLmRhdGEpLT5oYW5kbGUpKTsKIAotICAgIGZvciAoY29uc3QgYXV0byYgaGlkbF9tc2cgOiBtZXNzYWdlcykgewotICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGhpZGxfbXNnLmRhdGEpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBoaWRsX21zZy5kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICAgICAgaWYgKGhpZGxfbXNnLmJ1ZmZlckluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgIGhpZGxfbXNnLmJ1ZmZlckluZGV4LCBtZW0tPm1OdW1CdWZzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqIG1kID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKQorICAgICAgICAgICAgICAgICAgICBtZW0tPm1CdWZmZXJzW2hpZGxfbXNnLmJ1ZmZlckluZGV4XS0+cG9pbnRlcigpOworICAgICAgICAgICAgbWQtPnBIYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGhpZGxfbXNnLmZyYW1lRGF0YS5nZXROYXRpdmVIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIG1zZ3MucHVzaF9iYWNrKHtoaWRsX21zZy50aW1lc3RhbXAsIG1lbS0+bUJ1ZmZlcnNbaGlkbF9tc2cuYnVmZmVySW5kZXhdfSk7CiAgICAgICAgIH0KLSAgICAgICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obUhpZGxNZW1Qb29sTWFwLmF0KGhpZGxfbXNnLmRhdGEpLT5oYW5kbGUpKTsKLQotICAgICAgICBpZiAoaGlkbF9tc2cuYnVmZmVySW5kZXggPj0gbWVtLT5tTnVtQnVmcykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCAlZCwgbWF4IGFsbG93ZWQgaXMgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgIGhpZGxfbXNnLmJ1ZmZlckluZGV4LCBtZW0tPm1OdW1CdWZzKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqIG1kID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKQotICAgICAgICAgICAgICAgIG1lbS0+bUJ1ZmZlcnNbaGlkbF9tc2cuYnVmZmVySW5kZXhdLT5wb2ludGVyKCk7Ci0gICAgICAgIG1kLT5wSGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihoaWRsX21zZy5mcmFtZURhdGEuZ2V0TmF0aXZlSGFuZGxlKCkpOwotCi0gICAgICAgIG1zZ3MucHVzaF9iYWNrKHtoaWRsX21zZy50aW1lc3RhbXAsIG1lbS0+bUJ1ZmZlcnNbaGlkbF9tc2cuYnVmZmVySW5kZXhdfSk7CiAgICAgfQotCiAgICAgbURhdGFDYlRpbWVzdGFtcEJhdGNoKChpbnQzMl90KSBtc2dUeXBlLCBtc2dzLCBtQ2JVc2VyKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KQEAgLTM3Miw3ICszODIsNyBAQAogICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gczsKICAgICB9Ci0gICAgbVByZXZpZXdVc2FnZSA9IChpbnQpIHVzYWdlOworICAgIG1QcmV2aWV3VXNhZ2UgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4gKHVzYWdlKTsKICAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShhLCBtUHJldmlld1VzYWdlKTsKICAgICBpZiAocmMgPT0gT0spIHsKICAgICAgICAgY2xlYW51cENpcmN1bGF0aW5nQnVmZmVycygpOwpAQCAtNDQ0LDIzICs0NTQsNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2V0UHJldmlld1dpbmRvdyhidWYuZ2V0KCkgPyB0aGlzIDogbnVsbHB0cikpOwotICAgIH0gZWxzZSBpZiAobURldmljZSkgewotICAgICAgICBpZiAobURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cpIHsKLSAgICAgICAgICAgIG1QcmV2aWV3V2luZG93ID0gYnVmOwotICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aWV3U2NhbGluZ01vZGUgIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgICAgICAgICBzZXRQcmV2aWV3U2NhbGluZ01vZGUobVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJldmlld1RyYW5zZm9ybSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByZXZpZXdUcmFuc2Zvcm0obVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1IYWxQcmV2aWV3V2luZG93LnVzZXIgPSB0aGlzOwotICAgICAgICAgICAgQUxPR1YoIiVzICZtSGFsUHJldmlld1dpbmRvdyAlcCBtSGFsUHJldmlld1dpbmRvdy51c2VyICVwIixfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICZtSGFsUHJldmlld1dpbmRvdywgbUhhbFByZXZpZXdXaW5kb3cudXNlcik7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cobURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgYnVmLmdldCgpID8gJm1IYWxQcmV2aWV3V2luZG93Lm53IDogMCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNDc4LDE1ICs0NzEsNiBAQAogICAgIG1DYlVzZXIgPSB1c2VyOwogCiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotCi0gICAgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZXRfY2FsbGJhY2tzKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+c2V0X2NhbGxiYWNrcyhtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNOb3RpZnlDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGF0YUNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEYXRhQ2JUaW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dldE1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQpAQCAtNDk0LDggKzQ3OCw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmVuYWJsZU1zZ1R5cGUobXNnVHlwZSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+ZW5hYmxlX21zZ190eXBlKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+ZW5hYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOwogICAgIH0KIH0KIApAQCAtNTA0LDggKzQ4Niw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmRpc2FibGVNc2dUeXBlKG1zZ1R5cGUpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmRpc2FibGVfbXNnX3R5cGUpIHsKLSAgICAgICAgbURldmljZS0+b3BzLT5kaXNhYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOwogICAgIH0KIH0KIApAQCAtNTE0LDggKzQ5NCw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIG1IaWRsRGV2aWNlLT5tc2dUeXBlRW5hYmxlZChtc2dUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5tc2dfdHlwZV9lbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPm1zZ190eXBlX2VuYWJsZWQobURldmljZSwgbXNnVHlwZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTUyNiw4ICs1MDQsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdGFydFByZXZpZXcoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RhcnRfcHJldmlldykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zdGFydF9wcmV2aWV3KG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC01MzcsOCArNTEzLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICBtSGlkbERldmljZS0+c3RvcFByZXZpZXcoKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zdG9wX3ByZXZpZXcpIHsKLSAgICAgICAgbURldmljZS0+b3BzLT5zdG9wX3ByZXZpZXcobURldmljZSk7CiAgICAgfQogfQogCkBAIC01NDcsOCArNTIxLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPnByZXZpZXdFbmFibGVkKCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cHJldmlld19lbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnByZXZpZXdfZW5hYmxlZChtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNTU5LDggKzUzMSw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoZW5hYmxlKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMobURldmljZSwgZW5hYmxlKTsKICAgICB9CiAgICAgcmV0dXJuIGVuYWJsZSA/IElOVkFMSURfT1BFUkFUSU9OOiBPSzsKIH0KQEAgLTU3MSw4ICs1NDEsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdGFydFJlY29yZGluZygpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zdGFydF9yZWNvcmRpbmcpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RhcnRfcmVjb3JkaW5nKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC01ODUsOCArNTUzLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICBtSGlkbERldmljZS0+c3RvcFJlY29yZGluZygpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnN0b3BfcmVjb3JkaW5nKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+c3RvcF9yZWNvcmRpbmcobURldmljZSk7CiAgICAgfQogfQogCkBAIC01OTgsOCArNTY0LDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPnJlY29yZGluZ0VuYWJsZWQoKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5yZWNvcmRpbmdfZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5yZWNvcmRpbmdfZW5hYmxlZChtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNjI0LDkgKzU4OCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGlkbERldmljZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGhlYXBJZCwgYnVmZmVySW5kZXgpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUpIHsKLSAgICAgICAgdm9pZCAqZGF0YSA9ICgodWludDhfdCAqKWhlYXAtPmJhc2UoKSkgKyBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKG1EZXZpY2UsIGRhdGEpOwogICAgIH0KIH0KIApAQCAtNjUzLDkgKzYxNCw2IEBACiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIG9ubHkgc3VwcG9ydHMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSBtb2RlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm9uIEhJREwgbW9kZSBkbyBub3Qgc3VwcG9ydCAlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY3NCw4ICs2MzIsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5hdXRvRm9jdXMoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+YXV0b19mb2N1cykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5hdXRvX2ZvY3VzKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC02ODYsOCArNjQyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+Y2FuY2VsQXV0b0ZvY3VzKCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9hdXRvX2ZvY3VzKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9hdXRvX2ZvY3VzKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC02OTgsOCArNjUyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+dGFrZVBpY3R1cmUoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+dGFrZV9waWN0dXJlKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnRha2VfcGljdHVyZShtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNzEwLDggKzY2Miw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmNhbmNlbFBpY3R1cmUoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+Y2FuY2VsX3BpY3R1cmUpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+Y2FuY2VsX3BpY3R1cmUobURldmljZSk7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTcyMiw4ICs2NzIsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkuc3RyaW5nKCkpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZXRfcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcGFyYW1ldGVycyhtRGV2aWNlLCBwYXJhbXMuZmxhdHRlbigpLnN0cmluZygpKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNzQwLDE0ICs2ODgsNiBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICBTdHJpbmc4IHRtcChvdXRQYXJhbS5jX3N0cigpKTsKICAgICAgICAgcGFybXMudW5mbGF0dGVuKHRtcCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+Z2V0X3BhcmFtZXRlcnMpIHsKLSAgICAgICAgY2hhciAqdGVtcCA9IG1EZXZpY2UtPm9wcy0+Z2V0X3BhcmFtZXRlcnMobURldmljZSk7Ci0gICAgICAgIFN0cmluZzggc3RyX3Bhcm1zKHRlbXApOwotICAgICAgICBpZiAobURldmljZS0+b3BzLT5wdXRfcGFyYW1ldGVycykKLSAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+cHV0X3BhcmFtZXRlcnMobURldmljZSwgdGVtcCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZyZWUodGVtcCk7Ci0gICAgICAgIHBhcm1zLnVuZmxhdHRlbihzdHJfcGFybXMpOwogICAgIH0KICAgICByZXR1cm4gcGFybXM7CiB9CkBAIC03NTgsOCArNjk4LDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2VuZENvbW1hbmQoKENvbW1hbmRUeXBlKSBjbWQsIGFyZzEsIGFyZzIpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZW5kX2NvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2VuZF9jb21tYW5kKG1EZXZpY2UsIGNtZCwgYXJnMSwgYXJnMik7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTc3Myw4ICs3MTEsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7CiAgICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cmVsZWFzZSkgewotICAgICAgICBtRGV2aWNlLT5vcHMtPnJlbGVhc2UobURldmljZSk7CiAgICAgfQogfQogCkBAIC03OTAsMTUgKzcyNiwxMCBAQAogICAgICAgICBTdGF0dXMgcyA9IG1IaWRsRGV2aWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHMpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmR1bXApIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+ZHVtcChtRGV2aWNlLCBmZCk7CiAgICAgfQogICAgIHJldHVybiBPSzsgLy8gSXQncyBmaW5lIGlmIHRoZSBIQUwgZG9lc24ndCBpbXBsZW1lbnQgZHVtcCgpCiB9CiAKLS8qKgotICogTWV0aG9kcyBmb3IgbGVnYWN5IChub24tSElETCkgcGF0aCBmb2xsb3dzCi0gKi8KIHZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNOb3RpZnlDYihpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQgKnVzZXIpCiB7CkBAIC04NjgsMTc3ICs3OTksNCBAQAogICAgIG1lbS0+ZGVjU3Ryb25nKG1lbSk7CiB9CiAKLUFOYXRpdmVXaW5kb3cqIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzVG9Bbncodm9pZCAqdXNlcikKLXsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqb2JqZWN0ID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7Ci0gICAgcmV0dXJuIG9iamVjdC0+bVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci19Ci0jZGVmaW5lIGFudyhuKSBzVG9BbncoKChzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93ICopKG4pKS0+dXNlcikKLSNkZWZpbmUgaHdpKG4pIHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4oXAotICAgICgoc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyAqKShuKSktPnVzZXIpCi0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0RlcXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsIGludCAqc3RyaWRlKQotewotICAgIGludCByYzsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICByYyA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYSwgJmFuYik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpidWZmZXIgPSAmYW5iLT5oYW5kbGU7Ci0gICAgICAgICpzdHJpZGUgPSBhbmItPnN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBfX3R5cGVvZl9fKCgodHlwZSAqKSAwKS0+bWVtYmVyKSAqX19tcHRyID0gKHB0cik7ICAgICBcCi0gICAgKHR5cGUgKikgKChjaGFyICopIF9fbXB0ciAtIChjaGFyICopKCYoKHR5cGUgKikwKS0+bWVtYmVyKSk7IH0pCi0jZW5kaWYKLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzTG9ja0J1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiAvKmJ1ZmZlciovKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgKHZvaWQpYTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzRW5xdWV1ZUJ1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICByZXR1cm4gYS0+cXVldWVCdWZmZXIoYSwKLSAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwgLTEpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNDYW5jZWxCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgcmV0dXJuIGEtPmNhbmNlbEJ1ZmZlcihhLAotICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLCAtMSk7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldEJ1ZmZlckNvdW50KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCBjb3VudCkKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotCi0gICAgaWYgKGEgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBiLzI3MDM5Nzc1Ci0gICAgICAgIC8vIFByZXZpb3VzbHksIHNldHRpbmcgdGhlIGJ1ZmZlciBjb3VudCB3b3VsZCByZXNldCB0aGUgYnVmZmVyCi0gICAgICAgIC8vIHF1ZXVlJ3MgZmxhZyB0aGF0IGFsbG93cyBmb3IgYWxsIGJ1ZmZlcnMgdG8gYmUgZGVxdWV1ZWQgb24gdGhlCi0gICAgICAgIC8vIHByb2R1Y2VyIHNpZGUsIGluc3RlYWQgb2YganVzdCB0aGUgcHJvZHVjZXIncyBkZWNsYXJlZCBtYXggY291bnQsCi0gICAgICAgIC8vIGlmIG5vIGZpbGxlZCBidWZmZXJzIGhhdmUgeWV0IGJlZW4gcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4gIFRoaXMKLSAgICAgICAgLy8gcmVzZXQgbm8gbG9uZ2VyIGhhcHBlbnMsIGJ1dCBzb21lIEhBTHMgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3IsCi0gICAgICAgIC8vIHNvIGl0IG5lZWRzIHRvIGJlIG1haW50YWluZWQgZm9yIEhBTCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gU2ltdWxhdGUgdGhlIHByaW9yIGJlaGF2aW9yIGJ5IGRpc2Nvbm5lY3RpbmcvcmVjb25uZWN0aW5nIHRvIHRoZQotICAgICAgICAvLyB3aW5kb3cgYW5kIHNldHRpbmcgdGhlIHZhbHVlcyBhZ2Fpbi4gIFRoaXMgaGFzIHRoZSBkcmF3YmFjayBvZgotICAgICAgICAvLyBhY3R1YWxseSBjYXVzaW5nIG1lbW9yeSByZWFsbG9jYXRpb24sIHdoaWNoIG1heSBub3QgaGF2ZSBoYXBwZW5lZAotICAgICAgICAvLyBpbiB0aGUgcGFzdC4KLSAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KGEsIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYSwgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1NjYWxpbmdNb2RlICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShhLCBody0+bVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1RyYW5zZm9ybSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShhLCBody0+bVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdXaWR0aCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwKLSAgICAgICAgICAgICAgICAgICAgaHctPm1QcmV2aWV3V2lkdGgsIGh3LT5tUHJldmlld0hlaWdodCk7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBody0+bVByZXZpZXdGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShhLCBody0+bVByZXZpZXdVc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1N3YXBJbnRlcnZhbCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaHctPm1QcmV2aWV3U3dhcEludGVydmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHctPm1QcmV2aWV3Q3JvcC5sZWZ0ICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJihody0+bVByZXZpZXdDcm9wKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzU2V0QnVmZmVyc0dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCi17Ci0gICAgaW50IHJjOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld1dpZHRoID0gd2lkdGg7Ci0gICAgaHctPm1QcmV2aWV3SGVpZ2h0ID0gaGVpZ2h0OwotICAgIGh3LT5tUHJldmlld0Zvcm1hdCA9IGZvcm1hdDsKLSAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBmb3JtYXQpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldENyb3Aoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqaHcgPSBod2kodyk7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC5sZWZ0ID0gbGVmdDsKLSAgICBody0+bVByZXZpZXdDcm9wLnRvcCA9IHRvcDsKLSAgICBody0+bVByZXZpZXdDcm9wLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC5ib3R0b20gPSBib3R0b207Ci0gICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJihody0+bVByZXZpZXdDcm9wKSk7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldFRpbWVzdGFtcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhLCB0aW1lc3RhbXApOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRVc2FnZShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgdXNhZ2UpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqaHcgPSBod2kodyk7Ci0gICAgaHctPm1QcmV2aWV3VXNhZ2UgPSB1c2FnZTsKLSAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgdXNhZ2UpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRTd2FwSW50ZXJ2YWwoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywgaW50IGludGVydmFsKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld1N3YXBJbnRlcnZhbCA9IGludGVydmFsOwotICAgIHJldHVybiBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaW50ZXJ2YWwpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNHZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCkKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIHJldHVybiBhLT5xdWVyeShhLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsIGNvdW50KTsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aW5pdEhhbFByZXZpZXdXaW5kb3coKQotewotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmNhbmNlbF9idWZmZXIgPSBzQ2FuY2VsQnVmZmVyOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmxvY2tfYnVmZmVyID0gc0xvY2tCdWZmZXI7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuZGVxdWV1ZV9idWZmZXIgPSBzRGVxdWV1ZUJ1ZmZlcjsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5lbnF1ZXVlX2J1ZmZlciA9IHNFbnF1ZXVlQnVmZmVyOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9idWZmZXJfY291bnQgPSBzU2V0QnVmZmVyQ291bnQ7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgPSBzU2V0QnVmZmVyc0dlb21ldHJ5OwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9jcm9wID0gc1NldENyb3A7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X3RpbWVzdGFtcCA9IHNTZXRUaW1lc3RhbXA7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X3VzYWdlID0gc1NldFVzYWdlOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9zd2FwX2ludGVydmFsID0gc1NldFN3YXBJbnRlcnZhbDsKLQotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmdldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQgPQotICAgICAgICAgICAgc0dldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudDsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCAxYzM4ZDAwLi5lNTE5YjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC05MCw3ICs5MCw2IEBACiAKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjb25zdCBjaGFyICpuYW1lKToKLSAgICAgICAgICAgIG1EZXZpY2UobnVsbHB0ciksCiAgICAgICAgICAgICBtSGlkbERldmljZShudWxscHRyKSwKICAgICAgICAgICAgIG1OYW1lKG5hbWUpLAogICAgICAgICAgICAgbVByZXZpZXdTY2FsaW5nTW9kZShOT1RfU0VUKSwKQEAgLTI5OSw3ICsyOTgsNiBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgY2FtZXJhX2RldmljZV90ICptRGV2aWNlOwogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gbUhpZGxEZXZpY2U7CiAgICAgU3RyaW5nOCBtTmFtZTsKIApAQCAtMzY5LDQxICszNjcsNiBAQAogCiAgICAgc3RhdGljIHZvaWQgc1B1dE1lbW9yeShjYW1lcmFfbWVtb3J5X3QgKmRhdGEpOwogCi0gICAgc3RhdGljIEFOYXRpdmVXaW5kb3cgKnNUb0Fudyh2b2lkICp1c2VyKTsKLQotICAgIHN0YXRpYyBpbnQgc0RlcXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyLCBpbnQgKnN0cmlkZSk7Ci0KLSAgICBzdGF0aWMgaW50IHNMb2NrQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiAvKmJ1ZmZlciovKTsKLQotICAgIHN0YXRpYyBpbnQgc0VucXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNDYW5jZWxCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRCdWZmZXJDb3VudChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgY291bnQpOwotCi0gICAgc3RhdGljIGludCBzU2V0QnVmZmVyc0dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKLQotICAgIHN0YXRpYyBpbnQgc1NldENyb3Aoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKLQotICAgIHN0YXRpYyBpbnQgc1NldFRpbWVzdGFtcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKTsKLQotICAgIHN0YXRpYyBpbnQgc1NldFVzYWdlKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCB1c2FnZSk7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRTd2FwSW50ZXJ2YWwoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywgaW50IGludGVydmFsKTsKLQotICAgIHN0YXRpYyBpbnQgc0dldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQpOwotCi0gICAgdm9pZCBpbml0SGFsUHJldmlld1dpbmRvdygpOwotCiAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIpOwogICAgIHZvaWQgY2xlYW51cENpcmN1bGF0aW5nQnVmZmVycygpOwogCkBAIC00NTksMTMgKzQyMiw2IEBACiAKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKLSAgICBzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93IHsKLSAgICAgICAgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyBudzsKLSAgICAgICAgdm9pZCAqdXNlcjsKLSAgICB9OwotCi0gICAgc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyBtSGFsUHJldmlld1dpbmRvdzsKLQogICAgIG5vdGlmeV9jYWxsYmFjayAgICAgICAgICAgICAgIG1Ob3RpZnlDYjsKICAgICBkYXRhX2NhbGxiYWNrICAgICAgICAgICAgICAgICBtRGF0YUNiOwogICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wICAgICAgIG1EYXRhQ2JUaW1lc3RhbXA7CkBAIC00NzksNyArNDM1LDcgQEAKICAgICBpbnQgbVByZXZpZXdXaWR0aDsKICAgICBpbnQgbVByZXZpZXdIZWlnaHQ7CiAgICAgaW50IG1QcmV2aWV3Rm9ybWF0OwotICAgIGludCBtUHJldmlld1VzYWdlOworICAgIHVpbnQ2NF90IG1QcmV2aWV3VXNhZ2U7CiAgICAgaW50IG1QcmV2aWV3U3dhcEludGVydmFsOwogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtUHJldmlld0Nyb3A7CiAKQEAgLTUyMyw2ICs0NzksNyBAQAogICAgIHVpbnQ2NF90IG1OZXh0QnVmZmVySWQgPSAxOwogICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKIAorICAgIHN0ZDo6bXV0ZXggbUhpZGxNZW1Qb29sTWFwTG9jazsgLy8gcHJvdGVjdGluZyBtSGlkbE1lbVBvb2xNYXAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBjYW1lcmFfbWVtb3J5X3QqPiBtSGlkbE1lbVBvb2xNYXA7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCA2OWIxZDdkLi5hOTgwY2RlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTE1NCw2ICsxNTQsMTUgQEAKICAgICAgICAgICAgICAgICByZXN1bHRRdWV1ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQorICAgIElGX0FMT0dWKCkgeworICAgICAgICBzZXNzaW9uLT5pbnRlcmZhY2VDaGFpbihbXSgKKyAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJTZXNzaW9uIGludGVyZmFjZSBjaGFpbjoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaWZhY2UgOiBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KIAogICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CkBAIC00MDcsNyArNDE2LDcgQEAKIH0KIAogQnVmZmVyVXNhZ2VGbGFncyBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UoCi0gICAgICAgIHVpbnQzMl90IHVzYWdlKSB7CisgICAgICAgIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgcmV0dXJuIHVzYWdlOwogfQogCkBAIC00NjAsMTIgKzQ2OSwxNyBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGl4ZWxGb3JtYXQpOwogfQogCi11aW50MzJfdCBDYW1lcmEzRGV2aWNlOjptYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCithbmRyb2lkX2RhdGFzcGFjZSBDYW1lcmEzRGV2aWNlOjptYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgRGF0YXNwYWNlRmxhZ3MgZGF0YVNwYWNlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihkYXRhU3BhY2UpOworfQorCit1aW50NjRfdCBDYW1lcmEzRGV2aWNlOjptYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCiAgICAgICAgIEJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpIHsKICAgICByZXR1cm4gdXNhZ2U7CiB9CiAKLXVpbnQzMl90IENhbWVyYTNEZXZpY2U6Om1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKK3VpbnQ2NF90IENhbWVyYTNEZXZpY2U6Om1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKICAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgewogICAgIHJldHVybiB1c2FnZTsKIH0KQEAgLTEyMDgsNyArMTIyMiw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAotICAgICAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50MzJfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKQEAgLTEyMjYsMTMgKzEyNDAsMTMgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCi0gICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDMyX3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIgotICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAweCV4LCBpc1NoYXJlZCAlZCIsIG1JZC5zdHJpbmcoKSwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQiLCBtSWQuc3RyaW5nKCksIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgIGRhdGFTcGFjZSwgcm90YXRpb24sIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkKTsKIAogICAgIHN0YXR1c190IHJlczsKQEAgLTEzNDUsMTAgKzEzNTksMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCi0gICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldFN0cmVhbUluZm8oaW50IGlkLCBTdHJlYW1JbmZvICpzdHJlYW1JbmZvKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobnVsbHB0ciA9PSBzdHJlYW1JbmZvKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC0xMzc1LDEwICsxMzkwLDE0IEBACiAgICAgICAgIHJldHVybiBpZHg7CiAgICAgfQogCi0gICAgaWYgKHdpZHRoKSAqd2lkdGggID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0V2lkdGgoKTsKLSAgICBpZiAoaGVpZ2h0KSAqaGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7Ci0gICAgaWYgKGZvcm1hdCkgKmZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEZvcm1hdCgpOwotICAgIGlmIChkYXRhU3BhY2UpICpkYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT53aWR0aCAgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRXaWR0aCgpOworICAgIHN0cmVhbUluZm8tPmhlaWdodCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEhlaWdodCgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdE92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE0NzgsNiArMTQ5Nyw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldElucHV0QnVmZmVyUHJvZHVjZXIoCiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTE2OTEsNiArMTcxMSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCkBAIC0xODg0LDYgKzE5MDUsNyBAQAogICovCiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U3RhdHVzKGJvb2wgaWRsZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgewogICAgICAgICAvLyBOZWVkIG1Mb2NrIHRvIHNhZmVseSB1cGRhdGUgc3RhdGUgYW5kIHN5bmNocm9uaXplIHRvIGN1cnJlbnQKICAgICAgICAgLy8gc3RhdGUgb2YgbWV0aG9kcyBpbiBmbGlnaHQuCkBAIC0xOTU1LDYgKzE5NzcsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmRyb3BTdHJlYW1CdWZmZXJzKGJvb2wgZHJvcHBpbmcsIGludCBzdHJlYW1JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgaXMgbm90IGZvdW5kLiIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgcmV0dXJuIHN0cmVhbS0+ZHJvcEJ1ZmZlcnMoZHJvcHBpbmcpOworfQorCiAvKioKICAqIENhbWVyYTNEZXZpY2UgcHJpdmF0ZSBtZXRob2RzCiAgKi8KQEAgLTIzMTcsNiArMjM1Myw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBmbXQpOwpAQCAtMjMyNyw2ICsyMzY0LDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZXRFcnJvclN0YXRlVihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNldEVycm9yU3RhdGVMb2NrZWRWKGZtdCwgYXJncyk7CiB9CkBAIC0yNDExLDYgKzI0NDksNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoaW50IGlkeCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgbnNlY3NfdCBkdXJhdGlvbiA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCkubWF4RXhwZWN0ZWREdXJhdGlvbjsKICAgICBtSW5GbGlnaHRNYXAucmVtb3ZlSXRlbXNBdChpZHgsIDEpOwogCkBAIC0yNDMzLDI1ICsyNDcyLDYgQEAKICAgICBuc2Vjc190IHNlbnNvclRpbWVzdGFtcCA9IHJlcXVlc3Quc2Vuc29yVGltZXN0YW1wOwogICAgIG5zZWNzX3Qgc2h1dHRlclRpbWVzdGFtcCA9IHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcDsKIAotICAgIGJvb2wgc2tpcFJlc3VsdE1ldGFkYXRhID0gZmFsc2U7Ci0gICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyAhPSBPSykgewotICAgICAgICBzd2l0Y2ggKHJlcXVlc3QucmVxdWVzdFN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19FUlJPUl9ERVZJQ0U6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX1JFU1VMVDoKLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19FUlJPUl9CVUZGRVI6Ci0gICAgICAgICAgICAgICAgLy9SZXN1bHQgbWV0YWRhdGEgc2hvdWxkIHJldHVybiBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlVua25vd24gZXJyb3IgbWVzc2FnZTogJWQiLCByZXF1ZXN0LnJlcXVlc3RTdGF0dXMpOwotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gQ2hlY2sgaWYgaXQncyBva2F5IHRvIHJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIEluRmxpZ2h0TWFwOgogICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0OgogICAgIC8vICAgICAgYWxsIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycywgYWxsIHJlc3VsdCBtZXRhZGF0YSwgc2h1dHRlciBjYWxsYmFjawpAQCAtMjQ1OSw3ICsyNDc5LDcgQEAKICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHVuc3VjY2Vzc2Z1bCByZXF1ZXN0OgogICAgIC8vICAgICAgYWxsIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcnJpdmVkLgogICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDAgJiYKLSAgICAgICAgICAgIChza2lwUmVzdWx0TWV0YWRhdGEgfHwKKyAgICAgICAgICAgIChyZXF1ZXN0LnNraXBSZXN1bHRNZXRhZGF0YSB8fAogICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkpKSB7CiAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAKQEAgLTI0OTUsNiArMjUxNSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Zmx1c2hJbmZsaWdodFJlcXVlc3RzKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gbUluRmxpZ2h0TWFwCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpZHgrKykgewpAQCAtMjYyMSw2ICsyNjQyLDcgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CkBAIC0yNjM2LDYgKzI2NTgsNyBAQAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGJvb2wgcmVwcm9jZXNzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAocGVuZGluZ01ldGFkYXRhLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCkBAIC0yODg0LDcgKzI5MDcsNyBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIE1hcCBjYW1lcmEgSEFMIGVycm9yIGNvZGVzIHRvIElDYW1lcmFEZXZpY2VDYWxsYmFjayBlcnJvciBjb2RlcwogICAgIC8vIEluZGV4IGludG8gdGhpcyB3aXRoIHRoZSBIQUwgZXJyb3IgY29kZQogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGhhbEVycm9yTWFwW0NBTUVSQTNfTVNHX05VTV9FUlJPUlNdID0gewpAQCAtMjkzMiw2ICsyOTU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOwogICAgICAgICAgICAgICAgICAgICByLnJlcXVlc3RTdGF0dXMgPSBtc2cuZXJyb3JfY29kZTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzID0gci5yZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCA9PSBlcnJvckNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByLnNraXBSZXN1bHRNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1pc3NpbmcgcmVzdWx0IGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlcnMKQEAgLTI5NjIsNiArMjk5MCw3IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzc2l6ZV90IGlkeDsKIAogICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKQEAgLTMwNDgsMjQgKzMwNzcsMjAgQEAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgotICAgICAgICBtSGFsM0RldmljZShudWxscHRyKSwKICAgICAgICAgbUhpZGxTZXNzaW9uKHNlc3Npb24pLAogICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHt9CiAKLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkgOgotICAgICAgICBtSGFsM0RldmljZShudWxscHRyKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6Ci0gICAgICAgIG1IYWwzRGV2aWNlKG90aGVyLm1IYWwzRGV2aWNlKSwKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCiAgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKLSAgICByZXR1cm4gKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHx8IChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKLSAgICBtSGFsM0RldmljZSA9IG51bGxwdHI7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CiB9CiAKQEAgLTMwODAsNzIgKzMxMDUsNjAgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqcjsKLSAgICAgICAgciA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgbUhhbDNEZXZpY2UsIHRlbXBsYXRlSWQpOwotICAgICAgICBpZiAociA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOwotICAgICAgICBpZiAocmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKLSAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVzoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9TVElMTF9DQVBUVVJFOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX01BTlVBTDoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElECi0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKLSAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KLSAgICAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSByZXF1ZXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0VGVtcGxhdGUgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEocik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKKyAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElECisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC0zMTU0LDE0NSArMzE2NywxOTEgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG1IYWwzRGV2aWNlLCBjb25maWcpOworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIFN0cmVhbSAmZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKKyAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOworICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZHN0LmlkID0gc3RyZWFtSWQ7CisgICAgICAgIGRzdC5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgZHN0LndpZHRoID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0LmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0LmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICBkc3Qucm90YXRpb24gPSBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKKworICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAobUJ1ZmZlcklkTWFwcy5jb3VudChzdHJlYW1JZCkgPT0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlcklkTWFwcy5lbXBsYWNlKHN0cmVhbUlkLCBCdWZmZXJJZE1hcHt9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcworICAgIGZvcihhdXRvIGl0ID0gbUJ1ZmZlcklkTWFwcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySWRNYXBzLmVuZCgpOykgeworICAgICAgICBpbnQgc3RyZWFtSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGJvb2wgYWN0aXZlID0gYWN0aXZlU3RyZWFtcy5jb3VudChzdHJlYW1JZCkgPiAwOworICAgICAgICBpZiAoIWFjdGl2ZSkgeworICAgICAgICAgICAgaXQgPSBtQnVmZmVySWRNYXBzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAorICAgICAgICAgICAgLypvdXQqLyAmcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKKworICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuMyBIQUwKKyAgICBzcDxkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzM7CisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM18zID0gY2FzdFJlc3VsdDsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAotICAgICAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7Ci0gICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmVhbSAmZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOwotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOwotCi0gICAgICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwotICAgICAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9JTlBVVDoKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICAgICAgZHN0LmhlaWdodCA9IHNyYy0+aGVpZ2h0OwotICAgICAgICAgICAgZHN0LmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKHNyYy0+dXNhZ2UpOwotICAgICAgICAgICAgZHN0LmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICAgICAgZHN0LnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7Ci0KLSAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgaWYgKG1CdWZmZXJJZE1hcHMuY291bnQoc3RyZWFtSWQpID09IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVySWRNYXBzLmVtcGxhY2Uoc3RyZWFtSWQsIEJ1ZmZlcklkTWFwe30pOwotICAgICAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoZW4gY2FzdGluZyBJQ2FtZXJhRGV2aWNlU2Vzc2lvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FzdFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoaGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjMgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYXV0byBlcnIgPSBoaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKLSAgICAgICAgZm9yKGF1dG8gaXQgPSBtQnVmZmVySWRNYXBzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJJZE1hcHMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgICAgICBib29sIGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuY291bnQoc3RyZWFtSWQpID4gMDsKLSAgICAgICAgICAgIGlmICghYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBtQnVmZmVySWRNYXBzLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCi0gICAgICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgICAgIC8qb3V0Ki8gJnJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwotCi0gICAgICAgIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOwotICAgICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Q7IHVzZSB2My4yIGNhbGwgYW5kIGNvbnN0cnVjdCBhIHYzLjMgSGFsU3RyZWFtQ29uZmlndXJhdGlvbgorICAgICAgICBBTE9HVigiJXM6IHYzLjIgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb25fM18yOwogICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uZmlndXJlU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXzNfMl0KICAgICAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb25fM18yID0gaGFsQ29uZmlndXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KKyAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0udjNfMiA9IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLm92ZXJyaWRlRGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLmRhdGFTcGFjZTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc3RhdHVzICE9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyApIHsKLSAgICAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LICkgeworICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07CisgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKKworICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKKyAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGRzdFN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KTsKKyAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShmYWxzZSk7CisgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOworICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZSgoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgPyB0cnVlIDogZmFsc2UpOworCisgICAgICAgICAgICAvLyBPdmVycmlkZSBhbGxvd2VkIHdpdGggSU1QTEVNRU5UQVRJT05fREVGSU5FRAorICAgICAgICAgICAgZHN0LT5mb3JtYXQgPSBvdmVycmlkZUZvcm1hdDsKKyAgICAgICAgICAgIGRzdC0+ZGF0YV9zcGFjZSA9IG92ZXJyaWRlRGF0YVNwYWNlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQW5kIGNvbnZlcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIGZyb20gSElETAotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCktPmdldElkKCk7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcwotICAgICAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOyBpZHgrKykgewotICAgICAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS5pZCA9PSBzdHJlYW1JZCkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpKSA/IDAgOiByZWFsSWR4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLAorICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCkgeworICAgICAgICAgICAgaWYgKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOwotCi0gICAgICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMub3ZlcnJpZGVGb3JtYXQpOwotICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgewotICAgICAgICAgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKLSAgICAgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9VVFBVVAorICAgICAgICAgICAgaWYgKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCkgewotICAgICAgICAgICAgICAgIGlmIChzcmMucHJvZHVjZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHN0LT51c2FnZSA9IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMuY29uc3VtZXJVc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE9VVFBVVAotICAgICAgICAgICAgICAgIGlmIChzcmMuY29uc3VtZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRzdC0+dXNhZ2UgPSBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnByb2R1Y2VyVXNhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LT5tYXhfYnVmZmVycyA9IHNyYy5tYXhCdWZmZXJzOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UpKTsKICAgICAgICAgfQorICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLnYzXzIubWF4QnVmZmVyczsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKICAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAogICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKQEAgLTM0NDEsMTQgKzM1MDAsMTEgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0KG1IYWwzRGV2aWNlLCByZXF1ZXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+IHJlcXVlc3RzKDEpOwotICAgICAgICByZXF1ZXN0c1swXSA9IHJlcXVlc3Q7Ci0gICAgICAgIHJlcyA9IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOwotICAgIH0KKyAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoMSk7CisgICAgcmVxdWVzdHNbMF0gPSByZXF1ZXN0OworICAgIHJlcyA9IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMzQ1NywzMSArMzUxMywyNCBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5mbHVzaCgpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5mbHVzaCgpOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoZXJyKTsKLSAgICAgICAgfQorICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChlcnIpOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6ZHVtcChpbnQgZmQpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7CiAgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOwogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhhbDNEZXZpY2UtPm9wcy0+ZHVtcChtSGFsM0RldmljZSwgZmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZWQgYnkgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkdW1wCi0gICAgfQotICAgIHJldHVybiByZXM7CisgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbG9zZSgpIHsKQEAgLTM0ODksMTUgKzM1MzgsMTIgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1IYWwzRGV2aWNlLT5jb21tb24uY2xvc2UoJm1IYWwzRGV2aWNlLT5jb21tb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jbG9zZSgpOwotICAgICAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCi0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTM2MTQsMTEgKzM2NjAsMTMgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcigKICAgICAgICAgd3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiAgICAgLy8gUHJlcGFyZSB2aWRlbyBzdHJlYW0gZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nLgpAQCAtMzYyOSw2ICszNjc3LDcgQEAKICAgICAgICAgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKICAgICAgICAgICAgICsraXQpIHsKQEAgLTM2NTEsNyArMzcwMCw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVRyaWdnZXIoCiAgICAgICAgIFJlcXVlc3RUcmlnZ2VyIHRyaWdnZXJbXSwKICAgICAgICAgc2l6ZV90IGNvdW50KSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmlnZ2VyTXV0ZXgpOwogICAgIHN0YXR1c190IHJldDsKIApAQCAtMzcwOCw2ICszNzU3LDcgQEAKICAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzLAogICAgICAgICAvKm91dCovCiAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CkBAIC0zNzM0LDYgKzM3ODQsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgcmV0dXJuIGNsZWFyUmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQobGFzdEZyYW1lTnVtYmVyKTsKIApAQCAtMzc1MCw2ICszODAxLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXIoCiAgICAgICAgIC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgQUxPR1YoIlJlcXVlc3RUaHJlYWQ6OiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTM4MDUsNiArMzg1Nyw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0UGF1c2VkKGJvb2wgcGF1c2VkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUGF1c2VMb2NrKTsKICAgICBtRG9QYXVzZSA9IHBhdXNlZDsKICAgICBtRG9QYXVzZVNpZ25hbC5zaWduYWwoKTsKQEAgLTM4MTIsNiArMzg2NSw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OndhaXRVbnRpbFJlcXVlc3RQcm9jZXNzZWQoCiAgICAgICAgIGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOwogICAgIHN0YXR1c190IHJlczsKICAgICB3aGlsZSAobUxhdGVzdFJlcXVlc3RJZCAhPSByZXF1ZXN0SWQpIHsKQEAgLTM4MzgsNiArMzg5Miw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2hlY2tBbmRTdG9wUmVwZWF0aW5nUmVxdWVzdCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGJvb2wgc3VyZmFjZUFiYW5kb25lZCA9IGZhbHNlOwogICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CkBAIC0zODY2LDYgKzM5MjEsNyBAQAogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNlbmRSZXF1ZXN0c0JhdGNoKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHNpemVfdCBiYXRjaFNpemUgPSBtTmV4dFJlcXVlc3RzLnNpemUoKTsKICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoYmF0Y2hTaXplKTsKQEAgLTQyNjEsNiArNDMxNyw3IEBACiB9CiAKIENhbWVyYU1ldGFkYXRhIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmdldExhdGVzdFJlcXVlc3QoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhdGVzdFJlcXVlc3RNdXRleCk7CiAKICAgICBBTE9HVigiUmVxdWVzdFRocmVhZDo6JXMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDI3MCw2ICs0MzI3LDcgQEAKIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc1N0cmVhbVBlbmRpbmcoCiAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIG5leHRSZXF1ZXN0IDogbU5leHRSZXF1ZXN0cykgewpAQCAtNDI5OSw2ICs0MzU3LDcgQEAKIH0KIAogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CiAgICAgcmV0dXJuIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPiBrTWluSW5mbGlnaHREdXJhdGlvbiA/CiAgICAgICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uIDoga01pbkluZmxpZ2h0RHVyYXRpb247CkBAIC00MzcwLDYgKzQ0MjksNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OndhaXRGb3JOZXh0UmVxdWVzdEJhdGNoKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gT3B0aW1pemVkIGEgYml0IGZvciB0aGUgc2ltcGxlIHN0ZWFkeS1zdGF0ZSBjYXNlIChzaW5nbGUgcmVwZWF0aW5nCiAgICAgLy8gcmVxdWVzdCksIHRvIGF2b2lkIHB1dHRpbmcgdGhhdCByZXF1ZXN0IGluIHRoZSBxdWV1ZSB0ZW1wb3JhcmlseS4KICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwpAQCAtNDUxOSw2ICs0NTc5LDcgQEAKIH0KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp3YWl0SWZQYXVzZWQoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVBhdXNlTG9jayk7CiAgICAgd2hpbGUgKG1Eb1BhdXNlKSB7CkBAIC00NTQzLDYgKzQ2MDQsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVucGF1c2VGb3JOZXdSZXF1ZXN0cygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIFdpdGggd29yayB0byBkbywgbWFyayB0aHJlYWQgYXMgdW5wYXVzZWQuCiAgICAgLy8gSWYgcGF1c2VkIGJ5IHJlcXVlc3QgKHNldFBhdXNlZCksIGRvbid0IHJlc3VtZSwgdG8gYXZvaWQKICAgICAvLyBleHRyYSBzaWduYWxpbmcvd2FpdGluZyBvdmVyaGVhZCB0byB3YWl0VW50aWxQYXVzZWQKQEAgLTQ1NzQsNyArNDYzNiw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6Omluc2VydFRyaWdnZXJzKAogICAgICAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcXVlc3QpIHsKLQorICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1UcmlnZ2VyTXV0ZXgpOwogCiAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CkBAIC00NjYzLDYgKzQ3MjUsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpyZW1vdmVUcmlnZ2VycygKICAgICAgICAgY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CkBAIC00Nzc5LDYgKzQ4NDIsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6cHJlcGFyZShpbnQgbWF4Q291bnQsIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTQ4MjIsNiArNDg4Niw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpjbGVhcigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVBlbmRpbmdTdHJlYW1zKSB7CkBAIC00ODM0LDYgKzQ4OTksNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcih3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggZDcwMGUwMy4uMDgxYWYxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgpAQCAtMTE3LDIwICsxMTgsMTggQEAKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50ICppZCkgb3ZlcnJpZGU7CiAKLSAgICBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLCBTdHJlYW1JbmZvICpzdHJlYW1JbmZvKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpIG92ZXJyaWRlOwpAQCAtMTc5LDYgKzE3OCwxMiBAQAogICAgICAqLwogICAgIHN0YXR1c190IHNldENvbnN1bWVyU3VyZmFjZXMoaW50IHN0cmVhbUlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycykgb3ZlcnJpZGU7CiAKKyAgICAvKioKKyAgICAgKiBEcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZCBpZiBkcm9wcGluZyBpcyB0cnVlLiBJZiBkcm9wcGluZyBpcyBmYWxzZSwgZG8gbm90CisgICAgICogZHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQuCisgICAgICovCisgICAgc3RhdHVzX3QgZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKKwogICBwcml2YXRlOgogCiAgICAgLy8gaW50ZXJuYWwgdHlwZWRlZnMKQEAgLTI3MSw3ICsyNzYsNiBAQAogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCiAgICAgICBwcml2YXRlOgotICAgICAgICBjYW1lcmEzX2RldmljZV90ICptSGFsM0RldmljZTsKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uOwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKIApAQCAtNTkwLDcgKzU5NCw3IEBACiAgICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwogICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDMyX3QgdXNhZ2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKICAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAgICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCkBAIC01OTgsOSArNjAyLDExIEBACiAgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOwogICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CiAgICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOwotICAgIHN0YXRpYyB1aW50MzJfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0gICAgc3RhdGljIHVpbnQzMl90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKIAogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CkBAIC04ODYsNiArODkyLDExIEBACiAgICAgICAgIC8vIEZvciBhdXRvLWV4cG9zdXJlIG1vZGVzLCBlcXVhbCB0byAxLyhsb3dlciBlbmQgb2YgdGFyZ2V0IEZQUyByYW5nZSkKICAgICAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uOwogCisgICAgICAgIC8vIFdoZXRoZXIgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgdGhpcyByZXF1ZXN0IGlzIHRvIGJlIHNraXBwZWQuIFRoZQorICAgICAgICAvLyByZXN1bHQgbWV0YWRhdGEgc2hvdWxkIGJlIHNraXBwZWQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAgLy8gUkVRVUVTVC9SRVNVTFQgZXJyb3IuCisgICAgICAgIGJvb2wgc2tpcFJlc3VsdE1ldGFkYXRhOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtODk1LDcgKzkwNiw4IEBACiAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCiAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKHRydWUpLAotICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAorICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgewogICAgICAgICB9CiAKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCwKQEAgLTkwOCw3ICs5MjAsOCBAQAogICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCi0gICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pLAorICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgewogICAgICAgICB9CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCmluZGV4IDljOTUxYjcuLjg0ZmI4OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKQEAgLTk1LDcgKzk1LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0IHsKICAgICAqdXNhZ2UgPSBEVU1NWV9VU0FHRTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDgsNiArMTA4LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSB7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIC8qY29uc3VtZXJzKi8pIHsKICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGRvZXNuJ3Qgc3VwcG9ydCBzZXQgY29uc3VtZXIgc3VyZmFjZSEiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggMzVhNmExOC4uOTcxMDc2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC01Nyw2ICs1NywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGV0YWNoQnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCk7CiAKICAgICAvKioKKyAgICAgKiBEcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZCBpZiBkcm9wcGluZyBpcyB0cnVlLiBJZiBkcm9wcGluZyBpcyBmYWxzZSwgZG8gbm90CisgICAgICogZHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcm9wQnVmZmVycyhib29sIC8qZHJvcHBpbmcqLykgb3ZlcnJpZGU7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KICAgICAgKi8KICAgICBib29sIGlzVmlkZW9TdHJlYW0oKSBjb25zdDsKQEAgLTk0LDcgKzEwMCw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIERVTU1ZX0RBVEFTUEFDRSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKICAgICBzdGF0aWMgY29uc3QgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCBEVU1NWV9ST1RBVElPTiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IERVTU1ZX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKQEAgLTEwNyw3ICsxMTMsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCA3YWQyMzAwLi5hNTI0MjJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAodm9pZCkgYXJnczsKICAgICBTdHJpbmc4IGxpbmVzOwogCi0gICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmY29uc3VtZXJVc2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgY29uc3VtZXJVc2FnZSA9IDA7CiAKQEAgLTc4LDggKzc4LDggQEAKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIE1heCBzaXplOiAlenVcbiIsIG1NYXhTaXplKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIENvbWJpbmVkIHVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSB8IGNvbnN1bWVyVXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJSIgUFJJdTY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCisgICAgICAgICAgICBtVXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDM1ZGRhMzkuLjIzNzYwNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC04NSw3ICs4NSw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKICAgICBzdGF0dXNfdCByZXR1cm5CdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IGZmMmRjZWYuLjJjYjFlYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzIDogbWluQnVmczsKICAgICAgICAgLy8gVE9ETzogc29tZWhvdyBzZXQgdGhlIHRvdGFsIGJ1ZmZlciBjb3VudCB3aGVuIHByb2R1Y2VyIGNvbm5lY3RzPwogCi0gICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKKyAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwgbVVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhMy1JbnB1dFN0cmVhbS0lZCIsIG1JZCkpOwogCkBAIC0yODQsNyArMjg0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0IHsKICAgICAvLyBQZXIgSEFMMyBzcGVjLCBpbnB1dCBzdHJlYW1zIGhhdmUgMCBmb3IgdGhlaXIgaW5pdGlhbCB1c2FnZSBmaWVsZC4KICAgICAqdXNhZ2UgPSAwOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDhmNWI0MzEuLjgxMjI2ZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNzYsNyArNzYsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckZyZWVkTGlzdGVuZXIgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCBiMDJjZDZhLi44NDYwYzM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgbVVzZUJ1ZmZlck1hbmFnZXIoZmFsc2UpLAogICAgICAgICBtVGltZXN0YW1wT2Zmc2V0KHRpbWVzdGFtcE9mZnNldCksCiAgICAgICAgIG1Db25zdW1lclVzYWdlKDApLAorICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgewogCiAgICAgaWYgKG1Db25zdW1lciA9PSBOVUxMKSB7CkBAIC03MCw2ICs3MSw3IEBACiAgICAgICAgIG1Vc2VCdWZmZXJNYW5hZ2VyKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZSgwKSwKKyAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKICAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKIAogICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmIGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKQEAgLTkwLDcgKzkyLDcgQEAKIAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLApAQCAtMTAwLDYgKzEwMiw3IEBACiAgICAgICAgIG1Vc2VCdWZmZXJNYW5hZ2VyKGZhbHNlKSwKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCh0aW1lc3RhbXBPZmZzZXQpLAogICAgICAgICBtQ29uc3VtZXJVc2FnZShjb25zdW1lclVzYWdlKSwKKyAgICAgICAgbURyb3BCdWZmZXJzKGZhbHNlKSwKICAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5KGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUpIHsKICAgICAvLyBEZWZlcnJlZCBjb25zdW1lciBvbmx5IHN1cHBvcnQgcHJldmlldyBzdXJmYWNlIGZvcm1hdCBub3cuCiAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKQEAgLTExMSw3ICsxMTQsOCBAQAogICAgIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlIGZsYWcuCiAgICAgaWYgKChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgPT0gMCAmJgogICAgICAgICAgICAgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUikgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVyIHVzYWdlIGZsYWcgaXMgaWxsZWdhbCAoMHgleCkhIiwgX19GVU5DVElPTl9fLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lciB1c2FnZSBmbGFnIGlzIGlsbGVnYWwgJSIgUFJJdTY0ICIhIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjb25zdW1lclVzYWdlKTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7CiAgICAgfQogCkBAIC0xMjcsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwKQEAgLTEzOCw2ICsxNDIsNyBAQAogICAgICAgICBtVXNlQnVmZmVyTWFuYWdlcihmYWxzZSksCiAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQodGltZXN0YW1wT2Zmc2V0KSwKICAgICAgICAgbUNvbnN1bWVyVXNhZ2UoY29uc3VtZXJVc2FnZSksCisgICAgICAgIG1Ecm9wQnVmZmVycyhmYWxzZSksCiAgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeShrRGVxdWV1ZUxhdGVuY3lCaW5TaXplKSB7CiAKICAgICBpZiAoc2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgewpAQCAtMjI2LDkgKzIzMSwxNCBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBidWZmZXIgYmFjayB0byBBTmF0aXZlV2luZG93CiAgICAgICovCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycykgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCi0gICAgICAgIEFMT0dXKCJBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCIsIG1JZCk7CisgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogQSBmcmFtZSBpcyBkcm9wcGVkIGZvciBzdHJlYW0gJWQgZHVlIHRvIGJ1ZmZlciBlcnJvci4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICAgICAgYW53QnVmZmVyLAogICAgICAgICAgICAgICAgIGFud1JlbGVhc2VGZW5jZSk7CkBAIC0zNjUsMTAgKzM3NSwxMCBAQAogCiAgICAgbUNvbnN1bWVyTmFtZSA9IG1Db25zdW1lci0+Z2V0Q29uc3VtZXJOYW1lKCk7CiAKLSAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQ29uc3VtZXIuZ2V0KCksIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSk7CisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUNvbnN1bWVyLmdldCgpLCBtVXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHVzYWdlICUwOHggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsIG1JZCk7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSB1c2FnZSAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Vc2FnZSwgbUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKQEAgLTQ2MSwxMSArNDcxLDExIEBACiAgICAgICogSEFMMy4yIGRldmljZXMgbWF5IG5vdCBzdXBwb3J0IHRoZSBkeW5hbWljIGJ1ZmZlciByZWdpc3RlcmF0aW9uLgogICAgICAqLwogICAgIGlmIChtQnVmZmVyTWFuYWdlciAhPSAwICYmIG1TZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKSB7Ci0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwOworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMDsKICAgICAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmY29uc3VtZXJVc2FnZSk7CiAgICAgICAgIFN0cmVhbUluZm8gc3RyZWFtSW5mbygKICAgICAgICAgICAgICAgICBnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksIGdldERhdGFTcGFjZSgpLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSB8IGNvbnN1bWVyVXNhZ2UsIG1Ub3RhbEJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIG1Vc2FnZSB8IGNvbnN1bWVyVXNhZ2UsIG1Ub3RhbEJ1ZmZlckNvdW50LAogICAgICAgICAgICAgICAgIC8qaXNDb25maWd1cmVkKi90cnVlKTsKICAgICAgICAgd3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gd2Vha1RoaXModGhpcyk7CiAgICAgICAgIHJlcyA9IG1CdWZmZXJNYW5hZ2VyLT5yZWdpc3RlclN0cmVhbSh3ZWFrVGhpcywKQEAgLTYyOCw3ICs2MzgsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdCB7CiAKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTY0MywxNCArNjUzLDEyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDMyX3QgKnVzYWdlLAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgewogICAgIHN0YXR1c190IHJlczsKLSAgICBpbnQzMl90IHUgPSAwOworICAgIHVpbnQ2NF90IHUgPSAwOwogCi0gICAgcmVzID0gc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLT5xdWVyeShzdXJmYWNlLmdldCgpLAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLCAmdSk7Ci0KKyAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKICAgICAvLyBJZiBhbiBvcGFxdWUgb3V0cHV0IHN0cmVhbSdzIGVuZHBvaW50IGlzIEltYWdlUmVhZGVyLCBhZGQKICAgICAvLyBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgdG8gdGhlIHVzYWdlIHNvIEhBTCBrbm93cyBpdCB3aWxsIGJlIHVzZWQKICAgICAvLyBmb3IgdGhlIFpTTCB1c2UgY2FzZS4KQEAgLTY3MCw3ICs2NzgsNyBAQAogfQogCiBib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OmlzVmlkZW9TdHJlYW0oKSBjb25zdCB7Ci0gICAgdWludDMyX3QgdXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICBzdGF0dXNfdCByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IGdldHRpbmcgZW5kIHBvaW50IHVzYWdlIGZhaWxlZDogJXMgKCVkKS4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNzc4LDYgKzc4NiwxMiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmRyb3BCdWZmZXJzKGJvb2wgZHJvcHBpbmcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgbURyb3BCdWZmZXJzID0gZHJvcHBpbmc7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpub3RpZnlCdWZmZXJSZWxlYXNlZChBTmF0aXZlV2luZG93QnVmZmVyKiAvKmFud0J1ZmZlciovKSB7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtODEzLDcgKzgyNyw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6aXNDb25zdW1lZEJ5SFdDb21wb3NlcigpIGNvbnN0IHsKLSAgICB1aW50MzJfdCB1c2FnZSA9IDA7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOwogICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBlbmQgcG9pbnQgdXNhZ2UgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC04MjQsNyArODM4LDcgQEAKIH0KIAogYm9vbCBDYW1lcmEzT3V0cHV0U3RyZWFtOjppc0NvbnN1bWVkQnlIV1RleHR1cmUoKSBjb25zdCB7Ci0gICAgdWludDMyX3QgdXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICBzdGF0dXNfdCByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IGdldHRpbmcgZW5kIHBvaW50IHVzYWdlIGZhaWxlZDogJXMgKCVkKS4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA5N2FhN2Q0Li40ODY1YmU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtNDQsNyArNDQsNyBAQAogICAgIHVpbnQzMl90IGhlaWdodDsKICAgICB1aW50MzJfdCBmb3JtYXQ7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwotICAgIHVpbnQzMl90IGNvbWJpbmVkVXNhZ2U7CisgICAgdWludDY0X3QgY29tYmluZWRVc2FnZTsKICAgICBzaXplX3QgdG90YWxCdWZmZXJDb3VudDsKICAgICBib29sIGlzQ29uZmlndXJlZDsKICAgICBleHBsaWNpdCBTdHJlYW1JbmZvKGludCBpZCA9IENBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQsCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBoID0gMCwKICAgICAgICAgICAgIHVpbnQzMl90IGZtdCA9IDAsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkcyA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlID0gMCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlID0gMCwKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IDAsCiAgICAgICAgICAgICBib29sIGNvbmZpZ3VyZWQgPSBmYWxzZSkgOgogICAgICAgICAgICAgICAgIHN0cmVhbUlkKGlkKSwKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAqIHN0cmVhbSBzZXQgaWQgbmVlZHMgdG8gYmUgc2V0IHRvIHN1cHBvcnQgYnVmZmVyIHNoYXJpbmcgYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zLgogICAgICAqLwogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKQEAgLTE2Niw2ICsxNjYsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUJ1ZmZlclJlbGVhc2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFud0J1ZmZlcik7CiAKICAgICAvKioKKyAgICAgKiBEcm9wIGJ1ZmZlcnMgaWYgZHJvcHBpbmcgaXMgdHJ1ZS4gSWYgZHJvcHBpbmcgaXMgZmFsc2UsIGRvIG5vdCBkcm9wIGJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcm9wQnVmZmVycyhib29sIGRyb3BwaW5nKSBvdmVycmlkZTsKKworICAgIC8qKgogICAgICAqIFNldCB0aGUgZ3JhcGhpYyBidWZmZXIgbWFuYWdlciB0byBnZXQvcmV0dXJuIHRoZSBzdHJlYW0gYnVmZmVycy4KICAgICAgKgogICAgICAqIEl0IGlzIG9ubHkgbGVnYWwgdG8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHN0cmVhbSBpcyBpbiBTVEFURV9DT05TVFJVQ1RFRCBzdGF0ZS4KQEAgLTE3Niw3ICsxODEsNyBAQAogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMCwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQgPSAwLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIAogICAgIC8qKgpAQCAtMTkxLDE0ICsxOTYsMTQgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOwogCi0gICAgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDMyX3QgKnVzYWdlLAorICAgIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdDsKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb25zdW1lclF1ZXVlTG9ja2VkKCk7CiAKICAgICAvLyBDb25zdW1lciBhcyB0aGUgb3V0cHV0IG9mIGNhbWVyYSBIQUwKICAgICBzcDxTdXJmYWNlPiBtQ29uc3VtZXI7CiAKLSAgICB1aW50MzJfdCBnZXRQcmVzZXRDb25zdW1lclVzYWdlKCkgY29uc3QgeyByZXR1cm4gbUNvbnN1bWVyVXNhZ2U7IH0KKyAgICB1aW50NjRfdCBnZXRQcmVzZXRDb25zdW1lclVzYWdlKCkgY29uc3QgeyByZXR1cm4gbUNvbnN1bWVyVXNhZ2U7IH0KIAogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtEZXF1ZXVlQnVmZmVyVGltZW91dCAgID0gMTAwMDAwMDAwMDsgLy8gMSBzZWMKIApAQCAtMjQ1LDcgKzI1MCwxMCBAQAogICAgICAqIENvbnN1bWVyIGVuZCBwb2ludCB1c2FnZSBmbGFnIHNldCBieSB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBkZWZlcnJlZAogICAgICAqIGNvbnN1bWVyIGNhc2UuCiAgICAgICovCi0gICAgdWludDMyX3QgICAgbUNvbnN1bWVyVXNhZ2U7CisgICAgdWludDY0X3QgICAgbUNvbnN1bWVyVXNhZ2U7CisKKyAgICAvLyBXaGV0aGVyIHRvIGRyb3AgdmFsaWQgYnVmZmVycy4KKyAgICBib29sIG1Ecm9wQnVmZmVyczsKIAogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCkBAIC0yNjIsNyArMjcwLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBtZXRob2RzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IDgxMDdkZDAuLjE3MTlkNzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC01OSw2ICs1OSwxMSBAQAogICAgICAqCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEcm9wIGJ1ZmZlcnMgaWYgZHJvcHBpbmcgaXMgdHJ1ZS4gSWYgZHJvcHBpbmcgaXMgZmFsc2UsIGRvIG5vdCBkcm9wIGJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcm9wQnVmZmVycyhib29sIC8qZHJvcHBpbmcqLykgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggMmFlNTY2MC4uNTA1MTcxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcywKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOwogCi0gICAgdWludDMyX3QgdXNhZ2U7CisgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KG1TdXJmYWNlcywgdXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycywgJm1Db25zdW1lcik7CkBAIC0xOTEsMTAgKzE5MSwxMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgewogCiAgICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0gICAgdWludDMyX3QgdSA9IDA7CisgICAgdWludDY0X3QgdSA9IDA7CiAKICAgICBpZiAobUNvbnN1bWVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gQ2FsbGVkIGJlZm9yZSBzaGFyZWQgYnVmZmVyIHF1ZXVlIGlzIGNvbnN0cnVjdGVkLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCA3YmUwOTQwLi4yMmJiMmZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMzQsNyArMzQsNyBAQAogICAgICAqLwogICAgIENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oaW50IGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCkBAIC03NCw3ICs3NCw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDllNmFjNzkuLmZiZThmNGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNTYsMTIgKzU2LDE1IEBACiAgICAgbVN0YXRlKFNUQVRFX0NPTlNUUlVDVEVEKSwKICAgICBtU3RhdHVzSWQoU3RhdHVzVHJhY2tlcjo6Tk9fU1RBVFVTX0lEKSwKICAgICBtU3RyZWFtVW5wcmVwYXJhYmxlKHRydWUpLAorICAgIG1Vc2FnZSgwKSwKICAgICBtT2xkVXNhZ2UoMCksCiAgICAgbU9sZE1heEJ1ZmZlcnMoMCksCiAgICAgbVByZXBhcmVkKGZhbHNlKSwKICAgICBtUHJlcGFyZWRCdWZmZXJJZHgoMCksCiAgICAgbUxhc3RNYXhDb3VudChDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOjpBTExPQ0FURV9QSVBFTElORV9NQVgpLAotICAgIG1CdWZmZXJMaW1pdExhdGVuY3koa0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUpIHsKKyAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSwKKyAgICBtRm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksCisgICAgbU9yaWdpbmFsRm9ybWF0KC0xKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtNjksNyArNzIsNiBAQAogICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPSBmb3JtYXQ7CiAgICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UgPSBkYXRhU3BhY2U7CiAgICAgY2FtZXJhM19zdHJlYW06OnJvdGF0aW9uID0gcm90YXRpb247Ci0gICAgY2FtZXJhM19zdHJlYW06OnVzYWdlID0gMDsKICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSAwOwogICAgIGNhbWVyYTNfc3RyZWFtOjpwcml2ID0gTlVMTDsKIApAQCAtMTA0LDYgKzEwNiw0MCBAQAogICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKIH0KIAordWludDY0X3QgQ2FtZXJhM1N0cmVhbTo6Z2V0VXNhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2FnZTsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtOjpzZXRVc2FnZSh1aW50NjRfdCB1c2FnZSkgeworICAgIG1Vc2FnZSA9IHVzYWdlOworfQorCit2b2lkIENhbWVyYTNTdHJlYW06OnNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGRlbikgeworICAgIG1Gb3JtYXRPdmVycmlkZGVuID0gZm9ybWF0T3ZlcnJpZGRlbjsKKyAgICBpZiAoZm9ybWF0T3ZlcnJpZGRlbikgbU9yaWdpbmFsRm9ybWF0ID0gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKK30KKworYm9vbCBDYW1lcmEzU3RyZWFtOjppc0Zvcm1hdE92ZXJyaWRkZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1Gb3JtYXRPdmVycmlkZGVuOworfQorCitpbnQgQ2FtZXJhM1N0cmVhbTo6Z2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PcmlnaW5hbEZvcm1hdDsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtOjpzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRkZW4pIHsKKyAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbiA9IGRhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgaWYgKGRhdGFTcGFjZU92ZXJyaWRkZW4pIG1PcmlnaW5hbERhdGFTcGFjZSA9IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOworfQorCitib29sIENhbWVyYTNTdHJlYW06OmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGFTcGFjZU92ZXJyaWRkZW47Cit9CisKK2FuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNTdHJlYW06OmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBtT3JpZ2luYWxEYXRhU3BhY2U7Cit9CisKIGNhbWVyYTNfc3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpzdGFydENvbmZpZ3VyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xMzMsMTAgKzE2OSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbU9sZFVzYWdlID0gY2FtZXJhM19zdHJlYW06OnVzYWdlOworICAgIG1PbGRVc2FnZSA9IG1Vc2FnZTsKICAgICBtT2xkTWF4QnVmZmVycyA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKIAotICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJihjYW1lcmEzX3N0cmVhbTo6dXNhZ2UpKTsKKyAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCZtVXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcXVlcnkgY29uc3VtZXIgZW5kcG9pbnQgdXNhZ2UhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtMTk3LDcgKzIzMyw3IEBACiAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIHVuY2hhbmdlZCwgYW5kIHNraXAgcmVhbGxvY2F0aW9uIGlmCiAgICAgLy8gc28uIEFzIGRvY3VtZW50ZWQgaW4gaGFyZHdhcmUvY2FtZXJhMy5oOmNvbmZpZ3VyZV9zdHJlYW1zKCkuCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyAmJgotICAgICAgICAgICAgbU9sZFVzYWdlID09IGNhbWVyYTNfc3RyZWFtOjp1c2FnZSAmJgorICAgICAgICAgICAgbU9sZFVzYWdlID09IG1Vc2FnZSAmJgogICAgICAgICAgICAgbU9sZE1heEJ1ZmZlcnMgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTI0Myw3ICsyNzksNyBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSA9IG1PbGRVc2FnZTsKKyAgICBtVXNhZ2UgPSBtT2xkVXNhZ2U7CiAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gbU9sZE1heEJ1ZmZlcnM7CiAKICAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0NPTkZJR1VSRUQgOiBTVEFURV9DT05TVFJVQ1RFRDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNDRmZTZiNi4uNmU3OTEyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTE0NCw2ICsxNDQsMTQgQEAKICAgICB1aW50MzJfdCAgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKICAgICBpbnQgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSBjb25zdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICBnZXRVc2FnZSgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgIHNldFVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICB2b2lkICAgICAgICAgICAgICBzZXRGb3JtYXRPdmVycmlkZShib29sIGZvcm1hdE92ZXJyaWRlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgaXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgZ2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICBzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRlbik7CisgICAgYm9vbCAgICAgICAgICAgICAgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3Q7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdDsKIAogICAgIGNhbWVyYTNfc3RyZWFtKiAgIGFzSGFsU3RyZWFtKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTQ1OSw3ICs0NjcsNyBAQAogCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBpbiB0aGUgbGlzdCBvZiBvdXRzdGFuZGluZyBidWZmZXJzLgogICAgIGJvb2wgaXNPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlcikgY29uc3Q7CkBAIC00NzMsOCArNDgxLDEwIEBACiAgICAgLy8gcHJlcGFyZU5leHRCdWZmZXIgY2FsbGVkIG9uIGl0LgogICAgIGJvb2wgbVN0cmVhbVVucHJlcGFyYWJsZTsKIAorICAgIHVpbnQ2NF90IG1Vc2FnZTsKKwogICBwcml2YXRlOgotICAgIHVpbnQzMl90IG1PbGRVc2FnZTsKKyAgICB1aW50NjRfdCBtT2xkVXNhZ2U7CiAgICAgdWludDMyX3QgbU9sZE1heEJ1ZmZlcnM7CiAgICAgQ29uZGl0aW9uIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICBDb25kaXRpb24gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CkBAIC01MTAsNiArNTIwLDE1IEBACiAgICAgLy8gbWF4X2J1ZmZlcnMuCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUgPSAzMzsgLy9pbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbUJ1ZmZlckxpbWl0TGF0ZW5jeTsKKworICAgIC8vS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBmb3JtYXQgaW4gY2FzZSBpdCBnZXRzIG92ZXJyaWRkZW4KKyAgICBib29sIG1Gb3JtYXRPdmVycmlkZGVuOworICAgIGludCBtT3JpZ2luYWxGb3JtYXQ7CisKKyAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZGF0YVNwYWNlIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCisgICAgYm9vbCBtRGF0YVNwYWNlT3ZlcnJpZGRlbjsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CisKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggMDU0NGExYi4uY2M5YmY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDEyIEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRGb3JtYXQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhU3BhY2UoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGVuKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRPcmlnaW5hbEZvcm1hdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZW4pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdCA9IDA7CiAKICAgICAvKioKICAgICAgKiBHZXQgYSBIQUwzIGhhbmRsZSBmb3IgdGhlIHN0cmVhbSwgd2l0aG91dCBzdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbi4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCA4NjllOTNhLi5hMGE1MGMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0zOSw3ICszOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Y29ubmVjdChjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPiA+JiBzdXJmYWNlcywKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgeworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewogICAgICAgICBTUF9MT0dFKCIlczogY29uc3VtZXIgcG9pbnRlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKQEAgLTE5NSwxMCArMTk1LDggQEAKIAogICAgIC8vIFNldCBkZXF1ZXVlQnVmZmVyL2F0dGFjaEJ1ZmZlciB0aW1lb3V0IGlmIHRoZSBjb25zdW1lciBpcyBub3QgaHcgY29tcG9zZXIgb3IgaHcgdGV4dHVyZS4KICAgICAvLyBXZSBuZWVkIHNraXAgdGhlc2UgY2FzZXMgYXMgdGltZW91dCB3aWxsIGRpc2FibGUgdGhlIG5vbi1ibG9ja2luZyAoYXN5bmMpIG1vZGUuCi0gICAgaW50MzJfdCB1c2FnZSA9IDA7Ci0gICAgc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKS0+cXVlcnkoCi0gICAgICAgICAgICBvdXRwdXRRdWV1ZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJnVzYWdlKTsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKICAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggY2M2MjNlMC4uM2I4ODM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC01Miw3ICs1Miw3IEBACiAgICAgLy8gQ29ubmVjdCB0byB0aGUgc3RyZWFtIHNwbGl0dGVyIGJ5IGNyZWF0aW5nIGJ1ZmZlciBxdWV1ZSBhbmQgY29ubmVjdGluZyBpdAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgogICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4gPiYgc3VyZmFjZXMsCi0gICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLAogICAgICAgICAgICAgc3A8U3VyZmFjZT4qIGNvbnN1bWVyKTsKIAogICAgIC8vIGFkZE91dHB1dCBhZGRzIGFuIG91dHB1dCBCdWZmZXJRdWV1ZSB0byB0aGUgc3BsaXR0ZXIuIFRoZSBzcGxpdHRlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCAzZDU0NDYwLi5lZTAxOGMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMzgsNyArMzgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBSaW5nQnVmZmVyQ29uc3VtZXI6OlJpbmdCdWZmZXJDb25zdW1lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsCiAgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgIENvbnN1bWVyQmFzZShjb25zdW1lciksCiAgICAgbUJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KSwKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgIHJldHVybiBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZGVmYXVsdEZvcm1hdCk7CiB9CiAKLXN0YXR1c190IFJpbmdCdWZmZXJDb25zdW1lcjo6c2V0Q29uc3VtZXJVc2FnZSh1aW50MzJfdCB1c2FnZSkgeworc3RhdHVzX3QgUmluZ0J1ZmZlckNvbnN1bWVyOjpzZXRDb25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CiAgICAgcmV0dXJuIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHModXNhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCmluZGV4IDJiYWZlNGEuLmI3Mzc0NjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAvLyB0aGUgY29uc3VtZXIgdXNhZ2UgZmxhZ3MgcGFzc2VkIHRvIHRoZSBncmFwaGljcyBhbGxvY2F0b3IuIFRoZQogICAgIC8vIGJ1ZmZlckNvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnVmZmVycyBjYW4gYmUgcGlubmVkIGZvciB1c2VyCiAgICAgLy8gYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKKyAgICBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGNvbnN1bWVyLCB1aW50NjRfdCBjb25zdW1lclVzYWdlLAogICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50KTsKIAogICAgIHZpcnR1YWwgflJpbmdCdWZmZXJDb25zdW1lcigpOwpAQCAtODAsNyArODAsNyBAQAogCiAgICAgLy8gc2V0Q29uc3VtZXJVc2FnZSBhbGxvd3MgdGhlIEJ1ZmZlclF1ZXVlIGNvbnN1bWVyIHVzYWdlIHRvIGJlCiAgICAgLy8gc2V0IGF0IGEgbGF0ZXIgdGltZSBhZnRlciBjb25zdHJ1Y3Rpb24uCi0gICAgc3RhdHVzX3Qgc2V0Q29uc3VtZXJVc2FnZSh1aW50MzJfdCB1c2FnZSk7CisgICAgc3RhdHVzX3Qgc2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CiAKICAgICAvLyBCdWZmZXIgaW5mbywgbWludXMgdGhlIGdyYXBoaWNzIGJ1ZmZlci9zbG90IGl0c2VsZi4KICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA4NzZjNjg1Li5jN2Y5MjcwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTI5LDEyICsyOSwxNSBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHdkLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogCiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtODAsMjcgKzgzLDI2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjb250ZW50OjpwbTsKKwogCiAKIC8vIHN1bW1hcml6ZWQgcmVjb3JkcwotLy8gdXAgdG8gNDggc2V0cywgZWFjaCBjb3ZlcmluZyBhbiBob3VyIC0tIGF0IGxlYXN0IDIgZGF5cyBvZiBjb3ZlcmFnZQorLy8gdXAgdG8gMzYgc2V0cywgZWFjaCBjb3ZlcmluZyBhbiBob3VyIC0tIHNvIGF0IGxlYXN0IDEuNSBkYXlzCiAvLyAod2lsbCBiZSBsb25nZXIgaWYgdGhlcmUgYXJlIGhvdXJzIHdpdGhvdXQgYW55IG1lZGlhIGFjdGlvbikKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOZXdTZXRJbnRlcnZhbE5zID0gMzYwMCooMTAwMCoxMDAwKjEwMDBsbCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRTZXRzID0gNDg7Ci0vLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnkKLXN0YXRpYyBjb25zdCBpbnQga01heFJlY29yZHMgICAgPSAxMDA7CitzdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRTZXRzID0gMzY7CiAKKy8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50CisvLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGNvdW50OiBoYXJkIGxpbWl0IG9mICMgcmVjb3JkcworLy8gKDAgZm9yIGVpdGhlciBvZiB0aGVzZSBkaXNhYmxlcyB0aGF0IHRocmVzaG9sZCkKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAzNiAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CitzdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmtTZXJ2aWNlTmFtZSA9ICJtZWRpYS5tZXRyaWNzIjsKIAotCi0vL3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotLy91c2luZyBhbmRyb2lkOjpPSzsKLS8vdXNpbmcgYW5kcm9pZDo6QkFEX1ZBTFVFOwotLy91c2luZyBhbmRyb2lkOjpOT1RfRU5PVUdIX0RBVEE7Ci0vL3VzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLQotCiB2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CiAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCiAgICAgICAgICAgICBTdHJpbmcxNihrU2VydmljZU5hbWUpLCBuZXcgTWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkpOwpAQCAtMTEwLDYgKzExMiw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OlN1bW1hcml6ZXJTZXQ6OlN1bW1hcml6ZXJTZXQoKSB7CiAgICAgbVN1bW1hcml6ZXJzID0gbmV3IExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4oKTsKIH0KKwogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0Ojp+U3VtbWFyaXplclNldCgpIHsKICAgICAvLyBlbXB0eSB0aGUgbGlzdAogICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmwgPSBtU3VtbWFyaXplcnM7CkBAIC0xNTMsOCArMTU2LDEwIEBACiAKIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6TWVkaWFBbmFseXRpY3NTZXJ2aWNlKCkKICAgICAgICAgOiBtTWF4UmVjb3JkcyhrTWF4UmVjb3JkcyksCisgICAgICAgICAgbU1heFJlY29yZEFnZU5zKGtNYXhSZWNvcmRBZ2VOcyksCiAgICAgICAgICAgbU1heFJlY29yZFNldHMoa01heFJlY29yZFNldHMpLAotICAgICAgICAgIG1OZXdTZXRJbnRlcnZhbChrTmV3U2V0SW50ZXJ2YWxOcykgeworICAgICAgICAgIG1OZXdTZXRJbnRlcnZhbChrTmV3U2V0SW50ZXJ2YWxOcyksCisgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwKSB7CiAKICAgICBBTE9HRCgiTWVkaWFBbmFseXRpY3NTZXJ2aWNlIGNyZWF0ZWQiKTsKICAgICAvLyBjbGVhciBvdXIgcXVldWVzCkBAIC0xNjcsNiArMTcyLDggQEAKICAgICBtSXRlbXNTdWJtaXR0ZWQgPSAwOwogICAgIG1JdGVtc0ZpbmFsaXplZCA9IDA7CiAgICAgbUl0ZW1zRGlzY2FyZGVkID0gMDsKKyAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUgPSAwOworICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50ID0gMDsKIAogICAgIG1MYXN0U2Vzc2lvbklEID0gMDsKICAgICAvLyByZWNvdmVyIGFueSBwZXJzaXN0ZW5jeSB3ZSBzZXQgdXAKQEAgLTE3Nyw4ICsxODQsMjMgQEAKICAgICAgICAgQUxPR0QoIk1lZGlhQW5hbHl0aWNzU2VydmljZSBkZXN0cm95ZWQiKTsKIAogICAgIC8vIGNsZWFuIG91dCBtT3BlbiBhbmQgbUZpbmFsaXplZAorICAgIHdoaWxlIChtT3Blbi0+c2l6ZSgpID4gMCkgeworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobU9wZW4tPmJlZ2luKCkpOworICAgICAgICBtT3Blbi0+ZXJhc2UobU9wZW4tPmJlZ2luKCkpOworICAgICAgICBkZWxldGUgb2l0ZW07CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOworICAgICAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCsrOworICAgIH0KICAgICBkZWxldGUgbU9wZW47CiAgICAgbU9wZW4gPSBOVUxMOworCisgICAgd2hpbGUgKG1GaW5hbGl6ZWQtPnNpemUoKSA+IDApIHsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1GaW5hbGl6ZWQtPmJlZ2luKCkpOworICAgICAgICBtRmluYWxpemVkLT5lcmFzZShtRmluYWxpemVkLT5iZWdpbigpKTsKKyAgICAgICAgZGVsZXRlIG9pdGVtOworICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKKyAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKKyAgICB9CiAgICAgZGVsZXRlIG1GaW5hbGl6ZWQ7CiAgICAgbUZpbmFsaXplZCA9IE5VTEw7CiAKQEAgLTIwMCw2ICsyMjIsOCBAQAogCiAgICAgLy8gd2UgY29udHJvbCB0aGVzZSwgZ2VuZXJhbGx5IG5vdCB0cnVzdGluZyB1c2VyIGlucHV0CiAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKKyAgICAvLyByb3VuZCBuc2VjcyB0byBzZWNvbmRzCisgICAgbm93ID0gKChub3cgKyA1MDAwMDAwMDApIC8gMTAwMDAwMDAwMCkgKiAxMDAwMDAwMDAwOwogICAgIGl0ZW0tPnNldFRpbWVzdGFtcChub3cpOwogICAgIGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKQEAgLTIxMiwxMyArMjM2LDE1IEBACiAgICAgLy8KICAgICBib29sIGlzVHJ1c3RlZCA9IGZhbHNlOwogCisgICAgQUxPR1YoImNhbGxlciBoYXMgdWlkPSVkLCBlbWJlZGRlZCB1aWQ9JWQiLCB1aWQsIHVpZF9naXZlbik7CisKICAgICBzd2l0Y2ggKHVpZCkgIHsKICAgICAgICAgY2FzZSBBSURfTUVESUE6CiAgICAgICAgIGNhc2UgQUlEX01FRElBX0NPREVDOgogICAgICAgICBjYXNlIEFJRF9NRURJQV9FWDoKICAgICAgICAgY2FzZSBBSURfTUVESUFfRFJNOgogICAgICAgICAgICAgLy8gdHJ1c3RlZCBzb3VyY2UsIG9ubHkgb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgICAgICBpc1RydXN0ZWQgPSB0cnVlOworICAgICAgICAgICAgaXNUcnVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGlmICh1aWRfZ2l2ZW4gPT0gKC0xKSkgewogICAgICAgICAgICAgICAgIGl0ZW0tPnNldFVpZCh1aWQpOwogICAgICAgICAgICAgfQpAQCAtMjM0LDYgKzI2MCwyMiBAQAogICAgIH0KIAogCisgICAgLy8gT3ZlcndyaXRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpZiB0aGUgY2FsbGVyIHdhcyB1bnRydXN0ZWQuCisgICAgaWYgKCFpc1RydXN0ZWQpIHsKKyAgICAgIHNldFBrZ0luZm8oaXRlbSwgaXRlbS0+Z2V0VWlkKCksIHRydWUsIHRydWUpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0UGtnTmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIC8vIGVtcHR5LCBzbyBmaWxsIG91dCBib3RoIHBhcnRzCisgICAgICBzZXRQa2dJbmZvKGl0ZW0sIGl0ZW0tPmdldFVpZCgpLCB0cnVlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gdHJ1c3RlZCwgcHJvdmlkZWQgYSBwYWNrYWdlLCBkbyBub3RoaW5nCisgICAgfQorCisgICAgQUxPR1YoImdpdmVuIHVpZCAlZDsgc2FuaXRpemVkIHVpZDogJWQgc2FuaXRpemVkIHBrZzogJXMgIgorICAgICAgICAgICJzYW5pdGl6ZWQgcGtnIHZlcnNpb246ICVkIiwKKyAgICAgICAgICB1aWRfZ2l2ZW4sIGl0ZW0tPmdldFVpZCgpLAorICAgICAgICAgIGl0ZW0tPmdldFBrZ05hbWUoKS5jX3N0cigpLAorICAgICAgICAgIGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCkpOworCiAgICAgbUl0ZW1zU3VibWl0dGVkKys7CiAKICAgICAvLyB2YWxpZGF0ZSB0aGUgcmVjb3JkOyB3ZSBkaXNjYXJkIGlmIHdlIGRvbid0IGxpa2UgaXQKQEAgLTMxNiw2ICszNTgsNyBAQAogICAgIHJldHVybiBpZDsKIH0KIAorCiBzdGF0dXNfdCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwpAQCAtMzMzLDIyICszNzYsNDEgQEAKICAgICB9CiAKICAgICAvLyBjcmFjayBhbnkgcGFyYW1ldGVycwotICAgIGJvb2wgY2xlYXIgPSBmYWxzZTsKLSAgICBib29sIHN1bW1hcnkgPSBmYWxzZTsKLSAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBzdW1tYXJ5T3B0aW9uKCItc3VtbWFyeSIpOworICAgIGJvb2wgc3VtbWFyeSA9IGZhbHNlOworICAgIFN0cmluZzE2IHByb3RvT3B0aW9uKCItcHJvdG8iKTsKICAgICBTdHJpbmcxNiBjbGVhck9wdGlvbigiLWNsZWFyIik7CisgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIFN0cmluZzE2IHNpbmNlT3B0aW9uKCItc2luY2UiKTsKKyAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBoZWxwT3B0aW9uKCItaGVscCIpOwogICAgIFN0cmluZzE2IG9ubHlPcHRpb24oIi1vbmx5Iik7Ci0gICAgY29uc3QgY2hhciAqb25seSA9IE5VTEw7CisgICAgQVN0cmluZyBvbmx5OwogICAgIGludCBuID0gYXJncy5zaXplKCk7CisKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICBTdHJpbmc4IG15YXJnKGFyZ3NbaV0pOwogICAgICAgICBpZiAoYXJnc1tpXSA9PSBjbGVhck9wdGlvbikgewogICAgICAgICAgICAgY2xlYXIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gc3VtbWFyeU9wdGlvbikgewogICAgICAgICAgICAgc3VtbWFyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBwcm90b09wdGlvbikgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGkgPCBuKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZShhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICBpbnQgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwOyAgICAgICAvLyBkZWZhdWx0IHRvIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgY2hhciAqZW5kcDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwID0gdmFsdWUuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcHJvdG8gPSBzdHJ0b2wocCwgJmVuZHAsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kcCAhPSBwIHx8ICplbmRwID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvIDwgTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19GSVJTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX0ZJUlNUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvID4gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19MQVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90byA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fTEFTVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRHVtcFByb3RvID0gcHJvdG87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gc2luY2VPcHRpb24pIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIGlmIChpIDwgbikgewpAQCAtMzY4LDE4ICs0MzAsMTIgQEAKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIGlmIChpIDwgbikgewogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLnN0cmluZygpOwotICAgICAgICAgICAgICAgIGNoYXIgKnEgPSBzdHJkdXAocCk7Ci0gICAgICAgICAgICAgICAgaWYgKHEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob25seSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCh2b2lkKilvbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ubHkgPSBxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbmx5ID0gdmFsdWUuc3RyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBoZWxwT3B0aW9uKSB7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJSZWNvZ25pemVkIHBhcmFtZXRlcnM6XG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1oZWxwICAgICAgICB0aGlzIGhlbHAgbWVzc2FnZVxuIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItcHJvdG8gWCAgICAgZHVtcCB1c2luZyBwcm90b2NvbCBYIChkZWZhdWx0cyB0byAxKSIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLXN1bW1hcnkgICAgIHNob3cgc3VtbWFyeSBpbmZvXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1jbGVhciAgICAgICBjbGVhcnMgb3V0IHNhdmVkIHJlY29yZHNcbiIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLW9ubHkgWCAgICAgIHByb2Nlc3MgcmVjb3JkcyBmb3IgY29tcG9uZW50IFhcbiIpOwpAQCAtMzk4LDExICs0NTQsMTEgQEAKIAogICAgIGR1bXBIZWFkZXJzKHJlc3VsdCwgdHNfc2luY2UpOwogCi0gICAgLy8gb25seSB3YW50IDEsIHRvIGF2b2lkIGNvbmZ1c2luZyBmb2xrcyB0aGF0IHBhcnNlIHRoZSBvdXRwdXQKKyAgICAvLyB3YW50IGV4YWN0bHkgMSwgdG8gYXZvaWQgY29uZnVzaW5nIGZvbGtzIHRoYXQgcGFyc2UgdGhlIG91dHB1dAogICAgIGlmIChzdW1tYXJ5KSB7Ci0gICAgICAgIGR1bXBTdW1tYXJpZXMocmVzdWx0LCB0c19zaW5jZSwgb25seSk7CisgICAgICAgIGR1bXBTdW1tYXJpZXMocmVzdWx0LCB0c19zaW5jZSwgb25seS5jX3N0cigpKTsKICAgICB9IGVsc2UgewotICAgICAgICBkdW1wUmVjZW50KHJlc3VsdCwgdHNfc2luY2UsIG9ubHkpOworICAgICAgICBkdW1wUmVjZW50KHJlc3VsdCwgdHNfc2luY2UsIG9ubHkuY19zdHIoKSk7CiAgICAgfQogCiAKQEAgLTQyOCw2ICs0ODQsOSBAQAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUHJvdG9jb2wgVmVyc2lvbjogJWRcbiIsIG1EdW1wUHJvdG8pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKwogICAgIGludCBlbmFibGVkID0gTWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKTsKICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJNZXRyaWNzIGdhdGhlcmluZzogZW5hYmxlZFxuIik7CkBAIC00MzcsMTAgKzQ5NiwxNCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgIlNpbmNlIEJvb3Q6IFN1Ym1pc3Npb25zOiAlIiBQUklkNjQKLSAgICAgICAgICAgICIgRmluYWxpemF0aW9uczogJSIgUFJJZDY0Ci0gICAgICAgICIgRGlzY2FyZGVkOiAlIiBQUklkNjQgIlxuIiwKLSAgICAgICAgbUl0ZW1zU3VibWl0dGVkLCBtSXRlbXNGaW5hbGl6ZWQsIG1JdGVtc0Rpc2NhcmRlZCk7CisgICAgICAgICJTaW5jZSBCb290OiBTdWJtaXNzaW9uczogJTgiIFBSSWQ2NAorICAgICAgICAgICAgIiBGaW5hbGl6YXRpb25zOiAlOCIgUFJJZDY0ICJcbiIsCisgICAgICAgIG1JdGVtc1N1Ym1pdHRlZCwgbUl0ZW1zRmluYWxpemVkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAiUmVjb3JkcyBEaXNjYXJkZWQ6ICU4IiBQUklkNjQKKyAgICAgICAgICAgICIgKGJ5IENvdW50OiAlIiBQUklkNjQgIiBieSBFeHBpcmF0aW9uOiAlIiBQUklkNjQgIilcbiIsCisgICAgICAgICBtSXRlbXNEaXNjYXJkZWQsIG1JdGVtc0Rpc2NhcmRlZENvdW50LCBtSXRlbXNEaXNjYXJkZWRFeHBpcmUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCiAgICAgICAgICJTdW1tYXJ5IFNldHMgRGlzY2FyZGVkOiAlIiBQUklkNjQgIlxuIiwgbVNldHNEaXNjYXJkZWQpOwpAQCAtNDYyLDYgKzUyNSwxMCBAQAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3VtbWFyaXplZCBNZXRyaWNzOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCisgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiAqb25seSA9PSAnXDAnKSB7CisgICAgICAgIG9ubHkgPSBOVUxMOworICAgIH0KKwogICAgIC8vIGhhdmUgZWFjaCBvZiB0aGUgZGlzdGlsbGVycyBkdW1wIHJlY29yZHMKICAgICBpZiAobVN1bW1hcml6ZXJTZXRzICE9IE5VTEwpIHsKICAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+OjppdGVyYXRvciBpdFNldCA9IG1TdW1tYXJpemVyU2V0cy0+YmVnaW4oKTsKQEAgLTQ4OCw2ICs1NTUsMTAgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKIAorICAgIGlmIChvbmx5ICE9IE5VTEwgJiYgKm9ubHkgPT0gJ1wwJykgeworICAgICAgICBvbmx5ID0gTlVMTDsKKyAgICB9CisKICAgICAvLyBzaG93IHRoZSByZWNlbnRseSByZWNvcmRlZCByZWNvcmRzCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlxuRmluYWxpemVkIE1ldHJpY3MgKG9sZGVzdCBmaXJzdCk6XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC01MjQsNyArNTk1LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiT21pdCAnJXMnLCBpdCdzIG5vdCAnJXMnIiwgKCppdCktPmdldEtleSgpLmNfc3RyKCksIG9ubHkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQVN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZygpOworICAgICAgICAgICAgQVN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZyhtRHVtcFByb3RvKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU1ZDogJXNcbiIsIHNsb3QsIGVudHJ5LmNfc3RyKCkpOwogICAgICAgICAgICAgc2xvdCsrOwogICAgICAgICB9CkBAIC01NDksMTMgKzYyMCwzMiBAQAogICAgICAgICBsLT5wdXNoX2JhY2soaXRlbSk7CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzCisgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7CiAgICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKGwtPmJlZ2luKCkpOwogICAgICAgICAgICAgbC0+ZXJhc2UobC0+YmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKKyAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQorICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CisgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobC0+YmVnaW4oKSk7CisgICAgICAgICAgICBuc2Vjc190IHdoZW4gPSBvaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgICAgICAgICAvLyBjYXJlZnVsIGFib3V0IHRpbWVqdW1wcyB0b28KKyAgICAgICAgICAgIGlmICgobm93ID4gd2hlbikgJiYgKG5vdy13aGVuKSA8PSBtTWF4UmVjb3JkQWdlTnMpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwtPmVyYXNlKGwtPmJlZ2luKCkpOworICAgICAgICAgICAgZGVsZXRlIG9pdGVtOworICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CisgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTU2MywxMSArNjUzLDYgQEAKIC8vIGFyZSB0aGV5IGFsaWtlIGVub3VnaCB0aGF0IG5pdGVtIGNhbiBiZSBmb2xkZWQgaW50byBvaXRlbT8KIHN0YXRpYyBib29sIGNvbXBhdGlibGVJdGVtcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSwgTWVkaWFBbmFseXRpY3NJdGVtICogbml0ZW0pIHsKIAotICAgIGlmICgwKSB7Ci0gICAgICAgIEFMT0dEKCJDb21wYXJlOiBvICVzIG4gJXMiLAotICAgICAgICAgICAgICBvaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpLCBuaXRlbS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICB9Ci0KICAgICAvLyBnZW5lcmFsIHNhZmV0eQogICAgIGlmIChuaXRlbS0+Z2V0VWlkKCkgIT0gb2l0ZW0tPmdldFVpZCgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcxOCw0ICs4MDMsMTU1IEBACiAKIH0KIAorLy8gaG93IGxvbmcgd2UgaG9sZCBwYWNrYWdlIGluZm8gYmVmb3JlIHdlIHJlLWZldGNoIGl0CisjZGVmaW5lIFBLR19FWFBJUkFUSU9OX05TICgzMCo2MCoxMDAwMDAwMDAwbGwpICAgLy8gMzAgbWludXRlcywgaW4gbnNlY3MKKworLy8gZ2l2ZSBtZSB0aGUgcGFja2FnZSBuYW1lLCBwZXJoYXBzIGdvaW5nIHRvIGZpbmQgaXQKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzZXRQa2dJbmZvKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSwgdWlkX3QgdWlkLCBib29sIHNldE5hbWUsIGJvb2wgc2V0VmVyc2lvbikgeworICAgIEFMT0dWKCJhc2tpbmcgZm9yIHBhY2thZ2VuYW1lIHRvIGdvIHdpdGggdWlkPSVkIiwgdWlkKTsKKworICAgIGlmICghc2V0TmFtZSAmJiAhc2V0VmVyc2lvbikgeworICAgICAgICAvLyBzZXR0aW5nIG5vdGhpbmc/IHN0cmFuZ2UKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgc3RydWN0IFVpZFRvUGtnTWFwIG1hcHBpbmc7CisgICAgbWFwcGluZy51aWQgPSAoLTEpOworCisgICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIG1hcHBpbmcgPSBtUGtnTWFwcGluZ3MudmFsdWVBdChpKTsKKyAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCisgICAgICAgICAgICAgIHVpZCwgbWFwcGluZy5leHBpcmF0aW9uLCBub3cpOworICAgICAgICBpZiAobWFwcGluZy5leHBpcmF0aW9uIDwgbm93KSB7CisgICAgICAgICAgICAvLyBwdXJnZSBvdXIgY3VycmVudCBlbnRyeSBhbmQgcmUtcXVlcnkKKyAgICAgICAgICAgIEFMT0dWKCJlbnRyeSBmb3IgdWlkICVkIGV4cGlyZWQsIG5vdz0gJSIgUFJJZDY0ICIiLCB1aWQsIG5vdyk7CisgICAgICAgICAgICBtUGtnTWFwcGluZ3MucmVtb3ZlSXRlbXNBdChpLCAxKTsKKyAgICAgICAgICAgIC8vIGNvdWxkIGNoZWF0IGFuZCB1c2UgYSBnb3RvIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGUgcm91dGluZS4KKyAgICAgICAgICAgIC8vIGEgZ29vZCBjb21waWxlciBzaG91bGQgcmVjb2duaXplIHRoZSBsb2NhbCB0YWlsIHJlY3Vyc2lvbi4uLgorICAgICAgICAgICAgcmV0dXJuIHNldFBrZ0luZm8oaXRlbSwgdWlkLCBzZXROYW1lLCBzZXRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTdHJpbmcgcGtnOworICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXIgPSAiIjsKKyAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZSA9IDA7CisKKyAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworICAgICAgICBpZiAocHcpIHsKKyAgICAgICAgICAgIHBrZyA9IHB3LT5wd19uYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHZhbHVlIC0tIHNob3VsZCB3ZSBjYWNoZSB0aGlzIGJpbmRlcj8/CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gTlVMTDsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBpZiAoc20gPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImRlZmF1bHRTZXJ2aWNlTWFuYWdlciBmYWlsZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJwYWNrYWdlX25hdGl2ZSIpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTZXJ2aWNlIHBhY2thZ2VfbmF0aXZlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VfbWdyID0gaW50ZXJmYWNlX2Nhc3Q8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7CisKKyAgICAgICAgICAgIHVpZHMucHVzaF9iYWNrKHVpZCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHBhY2thZ2VfbWdyLT5nZXROYW1lc0ZvclVpZHModWlkcywgJm5hbWVzKTsKKyAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJwYWNrYWdlX25hdGl2ZTo6Z2V0TmFtZXNGb3JVaWRzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbmFtZXNbMF0uZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwa2cgPSBuYW1lc1swXS5jX3N0cigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RyaXAgYW55IGxlYWRpbmcgInNoYXJlZDoiIHN0cmluZ3MgdGhhdCBjYW1lIGJhY2sKKyAgICAgICAgICAgIGlmIChwa2cuc3RhcnRzV2l0aCgic2hhcmVkOiIpKSB7CisgICAgICAgICAgICAgICAgcGtnLmVyYXNlKDAsIDcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IHBrZyB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgdmVyc2lvbkNvZGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAocGtnLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBuYW1lIGZvciB1cyB0byBtYW5hZ2UKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY2hyKHBrZy5jX3N0cigpLCAnLicpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBub3Qgb2YgZm9ybSAnY29tLndoYXRldmVyLi4uJzsgYXNzdW1lIGludGVybmFsIGFuZCBvaworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHBrZy5jX3N0cigpLCAiYW5kcm9pZC4iLCA4KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gYW5kcm9pZC4qIHBhY2thZ2VzIGFyZSBhc3N1bWVkIGZpbmUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nMTYgcGtnTmFtZTE2KHBrZy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWNrYWdlX21nci0+Z2V0SW5zdGFsbGVyRm9yUGFja2FnZShwa2dOYW1lMTYsICZpbnN0YWxsZXIpOworICAgICAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFja2FnZV9uYXRpdmU6OmdldEluc3RhbGxlckZvclBhY2thZ2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB3ZSBkaWRuJ3QgZ2V0IGFuIGluc3RhbGxlcgorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhY2thZ2VfbWdyLT5nZXRWZXJzaW9uQ29kZUZvclBhY2thZ2UocGtnTmFtZTE2LCAmdmVyc2lvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwYWNrYWdlX25hdGl2ZTo6Z2V0VmVyc2lvbkNvZGVGb3JQYWNrYWdlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBBTE9HVigicGFja2FnZSAnJXMnIGluc3RhbGxlZCBieSAnJXMnIHZlcnNpb25jb2RlICVkIC8gJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgcGtnLmNfc3RyKCksIGluc3RhbGxlci5jX3N0cigpLCB2ZXJzaW9uQ29kZSwgdmVyc2lvbkNvZGUpOworCisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoaW5zdGFsbGVyLmNfc3RyKCksICJjb20uYW5kcm9pZC4iLCAxMikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBwbGF5IHN0b3JlLCB3ZSBrZWVwIGluZm8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoaW5zdGFsbGVyLmNfc3RyKCksICJjb20uZ29vZ2xlLiIsIDExKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGdvb2dsZSBzb3VyY2UsIHdlIGtlZXAgaW5mbworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGluc3RhbGxlci5jX3N0cigpLCAicHJlbG9hZCIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWRzLCB3ZSBrZWVwIHRoZSBpbmZvCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0YWxsZXIuY19zdHIoKVswXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlbG9hZCAobm8gaW5zdGFsbGVyKTsgZG8gbm90IHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uQ29kZSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVua25vd24gaW5zdGFsbGVyOyBkbyBub3QgcmVwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25Db2RlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIG1hcCwgdG8gc2F2ZSBhIHN1YnNlcXVlbnQgbG9va3VwCisgICAgICAgIGlmICghcGtnLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9ja19tYXBwaW5ncyk7CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIHVpZCAlZCBwa2cgJyVzJyIsIHVpZCwgcGtnLmNfc3RyKCkpOworICAgICAgICAgICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgIG1hcHBpbmcudWlkID0gdWlkOworICAgICAgICAgICAgICAgIG1hcHBpbmcucGtnID0gcGtnOworICAgICAgICAgICAgICAgIG1hcHBpbmcuaW5zdGFsbGVyID0gaW5zdGFsbGVyLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgbWFwcGluZy52ZXJzaW9uQ29kZSA9IHZlcnNpb25Db2RlOworICAgICAgICAgICAgICAgIG1hcHBpbmcuZXhwaXJhdGlvbiA9IG5vdyArIFBLR19FWFBJUkFUSU9OX05TOworICAgICAgICAgICAgICAgIEFMT0dWKCJleHBpcmF0aW9uIGZvciB1aWQgJWQgc2V0IHRvICUiIFBSSWQ2NCAiIiwgdWlkLCBtYXBwaW5nLmV4cGlyYXRpb24pOworCisgICAgICAgICAgICAgICAgbVBrZ01hcHBpbmdzLmFkZCh1aWQsIG1hcHBpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1hcHBpbmcudWlkICE9ICh1aWRfdCkoLTEpKSB7CisgICAgICAgIGlmIChzZXROYW1lKSB7CisgICAgICAgICAgICBpdGVtLT5zZXRQa2dOYW1lKG1hcHBpbmcucGtnKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0VmVyc2lvbikgeworICAgICAgICAgICAgaXRlbS0+c2V0UGtnVmVyc2lvbkNvZGUobWFwcGluZy52ZXJzaW9uQ29kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKaW5kZXggNjY4NTk2Ny4uNTJlNDYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKQEAgLTU0LDE2ICs1NCwyMiBAQAogICAgIGludDY0X3QgbUl0ZW1zU3VibWl0dGVkOwogICAgIGludDY0X3QgbUl0ZW1zRmluYWxpemVkOwogICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkOworICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlOworICAgIGludDY0X3QgbUl0ZW1zRGlzY2FyZGVkQ291bnQ7CiAgICAgaW50NjRfdCBtU2V0c0Rpc2NhcmRlZDsKICAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IG1MYXN0U2Vzc2lvbklEOwogCiAgICAgLy8gcGFydGl0aW9uZWQgYSBiaXQgc28gd2UgZG9uJ3Qgb3ZlciBzZXJpYWxpemUKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9ja19pZHM7CisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2tfbWFwcGluZ3M7CiAKLSAgICAvLyB0aGUgbW9zdCB3ZSBob2xkIGluIG1lbW9yeQotICAgIC8vIHVwIHRvIHRoaXMgbWFueSBpbiBlYWNoIHF1ZXVlIChvcGVuLCBmaW5hbGl6ZWQpCisgICAgLy8gbGltaXQgaG93IG1hbnkgcmVjb3JkcyB3ZSdsbCByZXRhaW4KKyAgICAvLyBieSBjb3VudCAoaW4gZWFjaCBxdWV1ZSAob3BlbiwgZmluYWxpemVkKSkKICAgICBpbnQzMl90IG1NYXhSZWNvcmRzOworICAgIC8vIGJ5IHRpbWUgKG5vbmUgb2xkZXIgdGhhbiB0aGlzIGxvbmcgYWdhbgorICAgIG5zZWNzX3QgbU1heFJlY29yZEFnZU5zOworICAgIC8vCiAgICAgLy8gIyBvZiBzZXRzIG9mIHN1bW1hcmllcwogICAgIGludDMyX3QgbU1heFJlY29yZFNldHM7CiAgICAgLy8gbnNlY3MgdW50aWwgd2Ugc3RhcnQgYSBuZXcgcmVjb3JkIHNldApAQCAtMTE4LDYgKzEyNCw3IEBACiAgICAgdm9pZCBkZWxldGVJdGVtKExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+ICosIE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CisgICAgaW50IG1EdW1wUHJvdG87CiAgICAgU3RyaW5nOCBkdW1wUXVldWUoTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqKTsKICAgICBTdHJpbmc4IGR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSo+ICosIG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOwogCkBAIC0xMjUsNiArMTMyLDE4IEBACiAgICAgdm9pZCBkdW1wU3VtbWFyaWVzKFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpOwogICAgIHZvaWQgZHVtcFJlY2VudChTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKiBvbmx5KTsKIAorICAgIC8vIG1hcHBpbmcgdWlkcyB0byBwYWNrYWdlIG5hbWVzCisgICAgc3RydWN0IFVpZFRvUGtnTWFwIHsKKyAgICAgICAgdWlkX3QgdWlkOworICAgICAgICBBU3RyaW5nIHBrZzsKKyAgICAgICAgQVN0cmluZyBpbnN0YWxsZXI7CisgICAgICAgIGludDMyX3QgdmVyc2lvbkNvZGU7CisgICAgICAgIG5zZWNzX3QgZXhwaXJhdGlvbjsKKyAgICB9OworCisgICAgS2V5ZWRWZWN0b3I8dWlkX3Qsc3RydWN0IFVpZFRvUGtnTWFwPiAgbVBrZ01hcHBpbmdzOworICAgIHZvaWQgc2V0UGtnSW5mbyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIHVpZF90IHVpZCwgYm9vbCBzZXROYW1lLCBib29sIHNldFZlcnNpb24pOworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAKaW5kZXggMzQ3N2YxZi4uOTNmZTBlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmNwcApAQCAtMTQxLDIzICsxNDEsMjMgQEAKICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBtU3VtbWFyaWVzLT5iZWdpbigpOwogICAgIGZvciAoOyBpdCAhPSBtU3VtbWFyaWVzLT5lbmQoKTsgaXQrKykgewogICAgICAgICBib29sIGdvb2QgPSBzYW1lQXR0cmlidXRlcygoKml0KSwgaXRlbSwgZ2V0SWdub3JhYmxlcygpKTsKLSAgICAgICAgQUxPR1YoIk1hdGNoIGFnYWluc3QgJXMgc2F5cyAlZCIsCi0gICAgICAgICAgICAgICgqaXQpLT50b1N0cmluZygpLmNfc3RyKCksIGdvb2QpOworICAgICAgICBBTE9HVigiTWF0Y2ggYWdhaW5zdCAlcyBzYXlzICVkIiwgKCppdCktPnRvU3RyaW5nKCkuY19zdHIoKSwgZ29vZCk7CiAgICAgICAgIGlmIChnb29kKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChpdCA9PSBtU3VtbWFyaWVzLT5lbmQoKSkgewogICAgICAgICAgICAgQUxPR1YoInNhdmUgbmV3IHJlY29yZCIpOwotICAgICAgICAgICAgaXRlbSA9IGl0ZW0tPmR1cCgpOwotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICpuaXRlbSA9IGl0ZW0tPmR1cCgpOworICAgICAgICAgICAgaWYgKG5pdGVtID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgidW5hYmxlIHRvIHNhdmUgTWVkaWFNZXRyaWNzIHJlY29yZCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc29ydFByb3BzKGl0ZW0pOwotICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoImNvdW50IiwxKTsKLSAgICAgICAgICAgIG1TdW1tYXJpZXMtPnB1c2hfYmFjayhpdGVtKTsKKyAgICAgICAgICAgIHNvcnRQcm9wcyhuaXRlbSk7CisgICAgICAgICAgICBuaXRlbS0+c2V0SW50MzIoImFnZ3JlZ2F0ZWQiLDEpOworICAgICAgICAgICAgbWVyZ2VSZWNvcmQoKm5pdGVtLCAqaXRlbSk7CisgICAgICAgICAgICBtU3VtbWFyaWVzLT5wdXNoX2JhY2sobml0ZW0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiaW5jcmVtZW50IGV4aXN0aW5nIHJlY29yZCIpOwotICAgICAgICAgICAgKCppdCktPmFkZEludDMyKCJjb3VudCIsMSk7CisgICAgICAgICAgICAoKml0KS0+YWRkSW50MzIoImFnZ3JlZ2F0ZWQiLDEpOwogICAgICAgICAgICAgbWVyZ2VSZWNvcmQoKigqaXQpLCAqaXRlbSk7CiAgICAgfQogfQpAQCAtMTY4LDYgKzE2OCw3MSBAQAogICAgIHJldHVybjsKIH0KIAorLy8ga2VlcCBzb21lIHN0YXRzIGZvciB0aGluZ3M6IHN1bXMsIGNvdW50cywgc3RhbmRhcmQgZGV2aWF0aW9uCisvLyB0aGUgaW50ZWdlciB2ZXJzaW9uIC0tIGFsbCBvZiB0aGVzZSBwaWVjZXMgYXJlIGluIDY0IGJpdHMKK3ZvaWQgTWV0cmljc1N1bW1hcml6ZXI6Om1pbk1heFZhcjY0KE1lZGlhQW5hbHl0aWNzSXRlbSAmc3VtbWF0aW9uLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpbnQgbGVuID0gc3RybGVuKGtleSkgKyAzMjsKKyAgICBjaGFyICp0bXBLZXkgPSAoY2hhciAqKW1hbGxvYyhsZW4pOworCisgICAgaWYgKHRtcEtleSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOIC0gY291bnQgb2Ygc2FtcGxlcworICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubiIsIGtleSk7CisgICAgc3VtbWF0aW9uLmFkZEludDY0KHRtcEtleSwgMSk7CisKKyAgICAvLyB6ZXJvIC0gY291bnQgb2Ygc2FtcGxlcyB0aGF0IGFyZSB6ZXJvCisgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgICAgc25wcmludGYodG1wS2V5LCBsZW4sICIlcy56ZXJvIiwga2V5KTsKKyAgICAgICAgaW50NjRfdCB6ZXJvID0gMDsKKyAgICAgICAgKHZvaWQpIHN1bW1hdGlvbi5nZXRJbnQ2NCh0bXBLZXksJnplcm8pOworICAgICAgICB6ZXJvKys7CisgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHplcm8pOworICAgIH0KKworICAgIC8vIG1pbgorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubWluIiwga2V5KTsKKyAgICBpbnQ2NF90IG1pbiA9IHZhbHVlOworICAgIGlmIChzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZtaW4pKSB7CisgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgeworICAgICAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIG1heAorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMubWF4Iiwga2V5KTsKKyAgICBpbnQ2NF90IG1heCA9IHZhbHVlOworICAgIGlmIChzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZtYXgpKSB7CisgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgeworICAgICAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VtbWF0aW9uLnNldEludDY0KHRtcEtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIGNvbXBvbmVudHMgZm9yIG1lYW4sIHN0ZGRldjsKKyAgICAvLyBzdGRkZXYgPSBzcXJ0KDEvNCooc3VteDIgLSAoMipzdW14KnN1bXgvbikgKyAoKHN1bXgvbileMikpKQorICAgIC8vIHN1bSB4CisgICAgc25wcmludGYodG1wS2V5LCBsZW4sICIlcy5zdW1YIiwga2V5KTsKKyAgICBzdW1tYXRpb24uYWRkSW50NjQodG1wS2V5LCB2YWx1ZSk7CisgICAgLy8gc3VtIHheMgorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuc3VtWDIiLCBrZXkpOworICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCh0bXBLZXksIHZhbHVlKnZhbHVlKTsKKworCisgICAgLy8gbGFzdCB0aGluZyB3ZSBkbyAtLSByZW1vdmUgdGhlIGJhc2Uga2V5IGZyb20gdGhlIHN1bW1hdGlvbgorICAgIC8vIHJlY29yZCBzbyB3ZSB3b24ndCBnZXQgY29uZnVzZWQgYWJvdXQgaXQgaGF2aW5nIGJvdGggaW5kaXZpZHVhbAorICAgIC8vIGFuZCBzdW1tYXJ5IGluZm9ybWF0aW9uIGluIHRoZXJlLgorICAgIHN1bW1hdGlvbi5yZW1vdmVQcm9wKGtleSk7CisKKyAgICBmcmVlKHRtcEtleSk7Cit9CisKIAogLy8KIC8vIENvbXBhcmF0b3JzCkBAIC0xODYsMjAgKzI1MSwyMyBAQAogICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoKTogc3VtbSAlcyIsIHN1bW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyOjpzYW1lQXR0cmlidXRlcygpOiBzaW5nbGUgJXMiLCBzaW5nbGUtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKKyAgICAvLyBrZWVwIGRpZmZlcmVudCBzb3VyY2VzL3VzZXJzIHNlcGFyYXRlCisgICAgaWYgKHNpbmdsZS0+bVVpZCAhPSBzdW1tLT5tVWlkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICAvLyB0aGlzIGNhbiBiZSBtYWRlIGJldHRlci4KICAgICBmb3Ioc2l6ZV90IGk9MDtpPHNpbmdsZS0+bVByb3BDb3VudDtpKyspIHsKICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMSA9ICYoc2luZ2xlLT5tUHJvcHNbaV0pOwogICAgICAgICBjb25zdCBjaGFyICphdHRyTmFtZSA9IHByb3AxLT5tTmFtZTsKLSAgICAgICAgQUxPR1YoImNvbXBhcmUgb24gYXR0ciAnJXMnIiwgYXR0ck5hbWUpOwogCiAgICAgICAgIC8vIGlzIGl0IHNvbWV0aGluZyB3ZSBzaG91bGQgaWdub3JlCiAgICAgICAgIGlmIChpZ25vcmFibGUgIT0gTlVMTCkgewogICAgICAgICAgICAgY29uc3QgY2hhciAqKmlnID0gaWdub3JhYmxlOwotICAgICAgICAgICAgd2hpbGUgKCppZykgeworICAgICAgICAgICAgZm9yICg7KmlnOyBpZysrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqaWcsIGF0dHJOYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZysrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCppZykgewogICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSBkb24ndCBtaW5kIHRoYXQgaXQgaGFzIGF0dHIgJyVzJyIsIGF0dHJOYW1lKTsKQEAgLTIxOCwyOSArMjg2LDQyIEBACiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChwcm9wMS0+bVR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDMyOgotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQzMlZhbHVlICE9IHByb3AyLT51LmludDMyVmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmludDMyVmFsdWUgIT0gcHJvcDItPnUuaW50MzJWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQ2NDoKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50NjRWYWx1ZSAhPSBwcm9wMi0+dS5pbnQ2NFZhbHVlKQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQ2NFZhbHVlICE9IHByb3AyLT51LmludDY0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgogICAgICAgICAgICAgICAgIC8vIFhYWDogd2F0Y2ggb3V0IGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucyEKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuZG91YmxlVmFsdWUgIT0gcHJvcDItPnUuZG91YmxlVmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmRvdWJsZVZhbHVlICE9IHByb3AyLT51LmRvdWJsZVZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwcm9wMS0+dS5DU3RyaW5nVmFsdWUsIHByb3AyLT51LkNTdHJpbmdWYWx1ZSkgIT0gMCkKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHByb3AxLT51LkNTdHJpbmdWYWx1ZSwgcHJvcDItPnUuQ1N0cmluZ1ZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuY291bnQgIT0gcHJvcDItPnUucmF0ZS5jb3VudCkKKyAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUucmF0ZS5jb3VudCAhPSBwcm9wMi0+dS5yYXRlLmNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5yYXRlLmR1cmF0aW9uICE9IHByb3AyLT51LnJhdGUuZHVyYXRpb24pCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5yYXRlLmR1cmF0aW9uICE9IHByb3AyLT51LnJhdGUuZHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIGluIGRlZmF1bHQgdHlwZSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0OCwxNSArMzI5LDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXNJZChNZWRpYUFuYWx5dGljc0l0ZW0gKnN1bW0sIE1lZGlhQW5hbHl0aWNzSXRlbSAqc2luZ2xlLCBjb25zdCBjaGFyICoqaWdub3JhYmxlKSB7Ci0KLSAgICAvLyB2ZXJpZnkgc2FtZSB1c2VyCi0gICAgaWYgKHN1bW0tPm1QaWQgIT0gc2luZ2xlLT5tUGlkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBhbmQgZmluYWxseSBkbyB0aGUgbW9yZSBleHBlbnNpdmUgdmFsaWRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcwotICAgIHJldHVybiBzYW1lQXR0cmlidXRlcyhzdW1tLCBzaW5nbGUsIGlnbm9yYWJsZSk7Ci19CiAKIGludCBNZXRyaWNzU3VtbWFyaXplcjo6UHJvcFNvcnRlcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICphaSA9IChNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKilhOwpAQCAtMjY3LDE0ICszMzksOCBAQAogLy8gd2Ugc29ydCBpbiB0aGUgc3VtbWFyaWVzIHNvIHRoYXQgaXQgbG9va3MgcHJldHR5IGluIHRoZSBkdW1wc3lzCiB2b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpzb3J0UHJvcHMoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7CiAgICAgaWYgKGl0ZW0tPm1Qcm9wQ291bnQgIT0gMCkgewotICAgICAgICBpZiAoREVCVUdfU09SVCkgewotICAgICAgICAgICAgQUxPR0QoInNvcnRQcm9wcyhwcmUpOiAlcyIsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KICAgICAgICAgcXNvcnQoaXRlbS0+bVByb3BzLCBpdGVtLT5tUHJvcENvdW50LAogICAgICAgICAgICAgICBzaXplb2YoTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wKSwgTWV0cmljc1N1bW1hcml6ZXI6OlByb3BTb3J0ZXIpOwotICAgICAgICBpZiAoREVCVUdfU09SVCkgewotICAgICAgICAgICAgQUxPR0QoInNvcnRQcm9wcyhwc3QpOiAlcyIsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oCmluZGV4IDBiNjRlYWMuLmE5ZjA3ODYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuaApAQCAtNTksMTAgKzU5LDkgQEAKIAogICAgIC8vIHZhcmlvdXMgY29tcGFyYXRvcnMKICAgICAvLyAiZG8gdGhlc2UgcmVjb3JkcyBoYXZlIHNhbWUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRob3NlIGF0dHJzIgotICAgIC8vIGRpdHRvLCBidXQgd2F0Y2ggZm9yICJlcnJvciIgZmllbGRzCiAgICAgYm9vbCBzYW1lQXR0cmlidXRlcyhNZWRpYUFuYWx5dGljc0l0ZW0gKnN1bW0sIE1lZGlhQW5hbHl0aWNzSXRlbSAqc2luZ2xlLCBjb25zdCBjaGFyICoqaWdub3JlYWJsZXMpOwotICAgIC8vIGF0dHJpYnV0ZXMgKyBmcm9tIHRoZSBzYW1lIGFwcC91c2VyaWQKLSAgICBib29sIHNhbWVBdHRyaWJ1dGVzSWQoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yZWFibGVzKTsKKworICAgIHZvaWQgbWluTWF4VmFyNjQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpOwogCiAgICAgc3RhdGljIGludCBQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogICAgIHZvaWQgc29ydFByb3BzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCmluZGV4IDhjNzQ3ODIuLjZhZjNjOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAjZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyQ29kZWMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNDAsNSArNDIsNCBAQAogICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckNvZGVjOjpNZXRyaWNzU3VtbWFyaXplckNvZGVjIik7CiB9CiAKLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwCmluZGV4IDUxNjIwNTkuLmY4ODJjYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAKQEAgLTUxLDM3ICs1MSw0MyBAQAogICAgIHNldElnbm9yYWJsZXMocGxheWVyX2lnbm9yYWJsZSk7CiB9CiAKKy8vIE5COiB0aGlzIGlzIGFsc28gY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAtLSBzbyBzdW1tYXRpb24gPT0gaXRlbQorLy8gTm90IHN1cmUgaWYgd2UgbmVlZCBhIGZsYWcgZm9yIHRoYXQgb3Igbm90LgorLy8gSW4gdGhpcyBwYXJ0aWN1bGFyIG1lcmdlUmVjb3JkKCkgY29kZSAtLSB3ZSdyZScgb2sgZm9yIHRoaXMuCiB2b2lkIE1ldHJpY3NTdW1tYXJpemVyUGxheWVyOjptZXJnZVJlY29yZChNZWRpYUFuYWx5dGljc0l0ZW0gJnN1bW1hdGlvbiwgTWVkaWFBbmFseXRpY3NJdGVtICZpdGVtKSB7CiAKICAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXI6Om1lcmdlUmVjb3JkKCkiKTsKIAotICAgIC8vCi0gICAgLy8gd2Ugc3VtIHRpbWUgJiBmcmFtZXMuCi0gICAgLy8gYmUgY2FyZWZ1bCBhYm91dCBvdXIgc3BlY2lhbCAiLTEiIHZhbHVlcyB0aGF0IGluZGljYXRlICd1bmtub3duJwotICAgIC8vIHRyZWF0IHRob3NlIGFzIDAgW2Jhc2ljYWxseSwgbm90IHN1bW1pbmcgdGhlbSBpbnRvIHRoZSB0b3RhbHNdLgorCiAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CiAgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIGR1cmF0aW9uTXMgb2YgJSIgUFJJZDY0LCBkdXJhdGlvbik7Ci0gICAgICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIixkdXJhdGlvbik7CisgICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwgImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsIGR1cmF0aW9uKTsKICAgICB9CisKICAgICBpbnQ2NF90IHBsYXlpbmcgPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIsICZwbGF5aW5nKSkKKyAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZykpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIHBsYXlpbmdNcyBvZiAlIiBQUklkNjQsIHBsYXlpbmcpOwotICAgICAgICBpZiAocGxheWluZyA+PSAwKSB7Ci0gICAgICAgICAgICBzdW1tYXRpb24uYWRkSW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucGxheWluZ01zIixwbGF5aW5nKTsKLSAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGxheWluZyA+PSAwKSB7CisgICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLHBsYXlpbmcpOworICAgIH0KKwogICAgIGludDY0X3QgZnJhbWVzID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkKKyAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkgewogICAgICAgICBBTE9HVigiZm91bmQgZnJhbWVzcyBvZiAlIiBQUklkNjQsIGZyYW1lcyk7Ci0gICAgICAgIGlmIChmcmFtZXMgPj0gMCkgewotICAgICAgICAgICAgc3VtbWF0aW9uLmFkZEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyIsZnJhbWVzKTsKLSAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWVzID49IDApIHsKKyAgICAgICAgbWluTWF4VmFyNjQoc3VtbWF0aW9uLCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyIsZnJhbWVzKTsKKyAgICB9CisKICAgICBpbnQ2NF90IGRyb3BwZWQgPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLCAmZHJvcHBlZCkpCisgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsICZkcm9wcGVkKSkgewogICAgICAgICBBTE9HVigiZm91bmQgZHJvcHBlZCBvZiAlIiBQUklkNjQsIGRyb3BwZWQpOwotICAgICAgICBpZiAoZHJvcHBlZCA+PSAwKSB7Ci0gICAgICAgICAgICBzdW1tYXRpb24uYWRkSW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsZHJvcHBlZCk7Ci0gICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRyb3BwZWQgPj0gMCkgeworICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsZHJvcHBlZCk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKaW5kZXggNjk5N2I1YS4uZmFlYjBhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawpAQCAtOSwxMyArOSw4IEBACiAgICAgbGliZ3VpIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXgKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKyAgICBsaWJzdGFnZWZyaWdodF9vbXggXAorICAgIGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcgogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFjb2RlY3NlcnZpY2UKIExPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQpAQCAtMzgsMTUgKzMzLDEwIEBACiAgICAgbGliaHdiaW5kZXIgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgbGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXAogICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCiAKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIExPQ0FMX01PRFVMRSA6PSBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKIExPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAppbmRleCBmYzFlNWQ5Li42YjUxMGM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcApAQCAtMjQsMTUgKzI0LDI1IEBACiAKIHNwPElPTVg+IE1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRPTVgoKSB7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT01YTG9jayk7CiAKICAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIG1PTVggPSBuZXcgT01YOworICAgICAgICBtT01YID0gbmV3IE9NWCgpOwogICAgIH0KIAogICAgIHJldHVybiBtT01YOwogfQogCitzcDxJT01YU3RvcmU+IE1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRPTVhTdG9yZSgpIHsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT01YU3RvcmVMb2NrKTsKKworICAgIGlmIChtT01YU3RvcmUuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBtT01YU3RvcmUgPSBuZXcgT01YU3RvcmUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbU9NWFN0b3JlOworfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oCmluZGV4IGQ2NGRlYmIuLjkzMDExMzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKQEAgLTE5LDExICsxOSwxMyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL09NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZWRpYUNvZGVjU2VydmljZSA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNTZXJ2aWNlPiwgcHVibGljIEJuTWVkaWFDb2RlY1NlcnZpY2UKK2NsYXNzIE1lZGlhQ29kZWNTZXJ2aWNlIDogcHVibGljIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1NlcnZpY2U+LAorICAgICAgICBwdWJsaWMgQm5NZWRpYUNvZGVjU2VydmljZQogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNTZXJ2aWNlPjsgICAgLy8gZm9yIE1lZGlhQ29kZWNTZXJ2aWNlKCkKIHB1YmxpYzoKQEAgLTMxLDE2ICszMywyMCBAQAogICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIAotICAgIHN0YXRpYyBjb25zdCBjaGFyKiAgZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuY29kZWMiOyB9CisgICAgc3RhdGljIGNvbnN0IGNoYXIqICAgIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjIjsgfQogCi0gICAgdmlydHVhbCBzcDxJT01YPiAgICBnZXRPTVgoKTsKKyAgICB2aXJ0dWFsIHNwPElPTVg+ICAgICAgZ2V0T01YKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwogCiBwcml2YXRlOgotICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgc3A8SU9NWD4gICAgICAgICAgICBtT01YOworICAgIE11dGV4ICAgICAgICAgICAgICAgICBtT01YTG9jazsKKyAgICBzcDxJT01YPiAgICAgICAgICAgICAgbU9NWDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgbU9NWFN0b3JlTG9jazsKKyAgICBzcDxJT01YU3RvcmU+ICAgICAgICAgbU9NWFN0b3JlOwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhY29kZWMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTZjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2plZmZ2QGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCBjNTk5NDRhLi43OWQ2ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtMzIsOCArMzIsOCBAQAogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCiAKICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8b214LzEuMC9PbXguaD4KLSNpbmNsdWRlIDxvbXgvMS4wL09teFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCA2YjMwZGI2Li4yZGFhODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFDYXNTZXJ2aWNlLmNwcCBcCiAgICAgTWVkaWFEcm1TZXJ2aWNlLmNwcCBcCiAgICAgbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oIGIvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxMTE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfTE9BREVSX0hfCi0jZGVmaW5lIE1FRElBX0NBU19MT0FERVJfSF8KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBGYWN0b3J5TG9hZGVyIHsKLXB1YmxpYzoKLSAgICBGYWN0b3J5TG9hZGVyKGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbUZhY3RvcnkoTlVMTCksIG1DcmVhdGVGYWN0b3J5RnVuY05hbWUobmFtZSkge30KLQotICAgIHZpcnR1YWwgfkZhY3RvcnlMb2FkZXIoKSB7IGNsb3NlRmFjdG9yeSgpOyB9Ci0KLSAgICBib29sIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSA9IE5VTEwsCi0gICAgICAgICAgICBUKiogZmFjdG9yeSA9IE5VTEwpOwotCi0gICAgYm9vbCBlbnVtZXJhdGVQbHVnaW5zKHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgVCooKkNyZWF0ZUZhY3RvcnlGdW5jKSgpOwotCi0gICAgTXV0ZXggbU1hcExvY2s7Ci0gICAgVCogbUZhY3Rvcnk7Ci0gICAgY29uc3QgY2hhciAqbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBTdHJpbmc4PiBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXA7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotCi0gICAgYm9vbCBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksCi0gICAgICAgICAgICBUKiogZmFjdG9yeSk7Ci0KLSAgICBib29sIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi0gICAgYm9vbCBvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICBsaWJyYXJ5LT5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkoQ0Ffc3lzdGVtX2lkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLAotICAgICAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gbm8gbHVjaywgaGF2ZSB0byBzZWFyY2gKLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBpZiAobG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgcGx1Z2luUGF0aCwgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KSkgewotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5hZGQoQ0Ffc3lzdGVtX2lkLCBwbHVnaW5QYXRoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgcGx1Z2luIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dJKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICByZXN1bHRzLT5jbGVhcigpOwotCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKHBsdWdpblBhdGgsIHJlc3VsdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6bG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCAhbUZhY3RvcnktPmlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgKmxpYnJhcnkgPSBtTGlicmFyeTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IG1GYWN0b3J5OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OnF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICB2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCBtRmFjdG9yeS0+cXVlcnlQbHVnaW5zKCZkZXNjcmlwdG9ycykgIT0gT0spIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXNjcmlwdG9ycy5iZWdpbigpOyBpdCAhPSBkZXNjcmlwdG9ycy5lbmQoKTsgaXQrKykgewotICAgICAgICByZXN1bHRzLT5wdXNoX2JhY2soUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgaXQtPkNBX3N5c3RlbV9pZCwgaXQtPm5hbWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKSB7Ci0gICAgLy8gZ2V0IHN0cm9uZyBwb2ludGVyIHRvIG9wZW4gc2hhcmVkIGxpYnJhcnkKLSAgICBzc2l6ZV90IGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5pbmRleE9mS2V5KHBhdGgpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcFtpbmRleF0ucHJvbW90ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5hZGQocGF0aCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFtTGlicmFyeS5nZXQoKSkgewotICAgICAgICBtTGlicmFyeSA9IG5ldyBTaGFyZWRMaWJyYXJ5KHBhdGgpOwotICAgICAgICBpZiAoISptTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgbUxpYnJhcnkpOwotICAgIH0KLQotICAgIENyZWF0ZUZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnkgPQotICAgICAgICAoQ3JlYXRlRmFjdG9yeUZ1bmMpbUxpYnJhcnktPmxvb2t1cChtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKTsKLSAgICBpZiAoY3JlYXRlRmFjdG9yeSA9PSBOVUxMIHx8IChtRmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgRmFjdG9yeUxvYWRlcjxUPjo6Y2xvc2VGYWN0b3J5KCkgewotICAgIGRlbGV0ZSBtRmFjdG9yeTsKLSAgICBtRmFjdG9yeSA9IE5VTEw7Ci0gICAgbUxpYnJhcnkuY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTEyODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNhc1NlcnZpY2UiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhLmNhcyIpLCBuZXcgTWVkaWFDYXNTZXJ2aWNlKCkpOwotfQotCi1NZWRpYUNhc1NlcnZpY2U6Ok1lZGlhQ2FzU2VydmljZSgpIDoKLSAgICBtQ2FzTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+KCJjcmVhdGVDYXNGYWN0b3J5IikpLAotICAgIG1EZXNjcmFtYmxlckxvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+KAotICAgICAgICAgICAgImNyZWF0ZURlc2NyYW1ibGVyRmFjdG9yeSIpKSB7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6fk1lZGlhQ2FzU2VydmljZSgpIHsKLSAgICBkZWxldGUgbUNhc0xvYWRlcjsKLSAgICBkZWxldGUgbURlc2NyYW1ibGVyTG9hZGVyOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR1YoImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIG1DYXNMb2FkZXItPmVudW1lcmF0ZVBsdWdpbnMocmVzdWx0cyk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzU3lzdGVtSWRTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZVBsdWdpbjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIENhc0ZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIENhc1BsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgc3A8Q2FzSW1wbD4gY2FzSW1wbCA9IG5ldyBDYXNJbXBsKGxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICh1aW50NjRfdCljYXNJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICZDYXNJbXBsOjpPbkV2ZW50LCAmcGx1Z2luKSA9PSBPSyAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgY2FzSW1wbC0+aW5pdChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICAgICAgKnJlc3VsdCA9IGNhc0ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlRGVzY3JhbWJsZXI6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBEZXNjcmFtYmxlckZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICZwbHVnaW4pID09IE9LCi0gICAgICAgICAgICAgICAgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpyZXN1bHQgPSBuZXcgRGVzY3JhbWJsZXJJbXBsKGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgyOGYyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUNhc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIkZhY3RvcnlMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzRmFjdG9yeTsKLXN0cnVjdCBEZXNjcmFtYmxlckZhY3Rvcnk7Ci0KLWNsYXNzIE1lZGlhQ2FzU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhQ2FzU2VydmljZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PiAqbUNhc0xvYWRlcjsKLSAgICBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4gKm1EZXNjcmFtYmxlckxvYWRlcjsKLQotICAgIE1lZGlhQ2FzU2VydmljZSgpOwotICAgIHZpcnR1YWwgfk1lZGlhQ2FzU2VydmljZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhZHJtL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDNiNTMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoranRpbmtlckBnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKaW5kZXggYjY4NWFlMC4uYjc2N2I4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIk1lZGlhRHJtU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzksNyArMzgsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIE1lZGlhRHJtU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2plZmZ2QGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTIGIvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGI4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitlbGF1cmVudEBnb29nbGUuY29tCitna2FzdGVuQGFuZHJvaWQuY29tCitodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhYmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL09XTkVSUwpAQCAtMCwwICsxIEBACitkd2thbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKaW5kZXggZWMyZjViOS4uZjk5NmY3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCkBAIC0yNiw2ICsyNiwxMCBAQAogI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtMzQsMTU5ICszOCwyMzcgQEAKIAogQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpBQXVkaW9FbmRwb2ludE1hbmFnZXIoKQogICAgICAgICA6IFNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+KCkKLSAgICAgICAgLCBtSW5wdXRzKCkKLSAgICAgICAgLCBtT3V0cHV0cygpIHsKKyAgICAgICAgLCBtU2hhcmVkU3RyZWFtcygpCisgICAgICAgICwgbUV4Y2x1c2l2ZVN0cmVhbXMoKSB7CiB9CiAKIHN0ZDo6c3RyaW5nIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCi0gICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCi0gICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKLSAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOwotICAgIGlmICghaXNMb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJFbmRwb2ludE1hbmFnZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci0gICAgfQorICAgIGludCBpbmRleCA9IDA7CiAKICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlcjoiIDw8ICJcbiI7Ci0gICAgc2l6ZV90IGlucHV0cyA9IG1JbnB1dHMuc2l6ZSgpOwotICAgIHJlc3VsdCA8PCAiSW5wdXQgRW5kcG9pbnRzOiAiIDw8IGlucHV0cyA8PCAiXG4iOwotICAgIGZvciAoY29uc3QgYXV0byAmaW5wdXQgOiBtSW5wdXRzKSB7Ci0gICAgICAgIHJlc3VsdCA8PCAiICBJbnB1dDogIiA8PCBpbnB1dC0+ZHVtcCgpIDw8ICJcbiI7CisKKyAgICBjb25zdCBib29sIGlzU2hhcmVkTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKKyAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1TaGFyZWRMb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKKyAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAorICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CisgICAgaWYgKCFpc1NoYXJlZExvY2tlZCkgeworICAgICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlciBTaGFyZWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAgICAgfQogCi0gICAgc2l6ZV90IG91dHB1dHMgPSBtT3V0cHV0cy5zaXplKCk7Ci0gICAgcmVzdWx0IDw8ICJPdXRwdXQgRW5kcG9pbnRzOiAiIDw8IG91dHB1dHMgPDwgIlxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dCA6IG1PdXRwdXRzKSB7Ci0gICAgICAgIHJlc3VsdCA8PCAiICBPdXRwdXQ6ICIgPDwgb3V0cHV0LT5kdW1wKCkgPDwgIlxuIjsKKyAgICB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNFeGNsdXNpdmVMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAorICAgICAgICAgICAgICAgIFt0aGlzXSgpIC0+IGJvb2wgeyByZXR1cm4gbUV4Y2x1c2l2ZUxvY2sudHJ5X2xvY2soKTsgfSAvKiBmICovLAorICAgICAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAorICAgICAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOworICAgICAgICBpZiAoIWlzRXhjbHVzaXZlTG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQgPDwgIkFBdWRpb0VuZHBvaW50TWFuYWdlciBFeGNsdXNpdmUgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPDwgIkV4Y2x1c2l2ZSBNTUFQIEVuZHBvaW50czogIiA8PCBtRXhjbHVzaXZlU3RyZWFtcy5zaXplKCkgPDwgIlxuIjsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CisgICAgICAgICAgICByZXN1bHQgPDwgIiAgIyIgPDwgaW5kZXgrKyA8PCAiOiI7CisgICAgICAgICAgICByZXN1bHQgPDwgb3V0cHV0LT5kdW1wKCkgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0V4Y2x1c2l2ZUxvY2tlZCkgeworICAgICAgICAgICAgbUV4Y2x1c2l2ZUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaXNMb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmVzdWx0IDw8ICJTaGFyZWQgRW5kcG9pbnRzOiAiIDw8IG1TaGFyZWRTdHJlYW1zLnNpemUoKSA8PCAiXG4iOworICAgIGluZGV4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlucHV0IDogbVNoYXJlZFN0cmVhbXMpIHsKKyAgICAgICAgcmVzdWx0IDw8ICIgICMiIDw8IGluZGV4KysgPDwgIjoiOworICAgICAgICByZXN1bHQgPDwgaW5wdXQtPmR1bXAoKSA8PCAiXG4iOworICAgIH0KKworICAgIGlmIChpc1NoYXJlZExvY2tlZCkgeworICAgICAgICBtU2hhcmVkTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotQUF1ZGlvU2VydmljZUVuZHBvaW50ICpBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbnVsbHB0cjsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlICpjYXB0dXJlID0gbnVsbHB0cjsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5ICpwbGF5ZXIgPSBudWxscHRyOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCitzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCisgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50OworICAgIGZvciAoY29uc3QgYXV0byBlcCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CisgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5maW5kRXhjbHVzaXZlRW5kcG9pbnRfbCgpLCBmb3VuZCAlcCBmb3IgZGV2aWNlID0gJWQiLAorICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOworICAgIHJldHVybiBlbmRwb2ludDsKK30KKworLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCitzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZmluZFNoYXJlZEVuZHBvaW50X2woCisgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50OworICAgIGZvciAoY29uc3QgYXV0byBlcCAgOiBtU2hhcmVkU3RyZWFtcykgeworICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIuZmluZFNoYXJlZEVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkIiwKKyAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKKyAgICByZXR1cm4gZW5kcG9pbnQ7Cit9CisKK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5FeGNsdXNpdmVFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvcGVuU2hhcmVkRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKKyAgICB9Cit9CisKK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRXhjbHVzaXZlRW5kcG9pbnQoCisgICAgICAgIEFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UgX191bnVzZWQsCisgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUV4Y2x1c2l2ZUxvY2spOworCisgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7CiAKICAgICAvLyBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBlbmRwb2ludC4KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woY29uZmlndXJhdGlvbik7CiAKKyAgICAvLyBJZiB3ZSBmaW5kIGFuIGV4aXN0aW5nIG9uZSB0aGVuIHRoaXMgb25lIGNhbm5vdCBiZSBleGNsdXNpdmUuCisgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICAvLyBBbHJlYWR5IG9wZW4gc28gZG8gbm90IGFsbG93IGEgc2Vjb25kIHN0cmVhbS4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gZW5kcG9pbnRNTWFwID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKyAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSxjcmVhdGVkIE1NQVAgJXAiLCBlbmRwb2ludE1NYXAuZ2V0KCkpOworICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50TU1hcDsKIAotCi0gICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgZm9yIChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVwIDogbUlucHV0cykgewotICAgICAgICAgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgIGZvciAoQUF1ZGlvU2VydmljZUVuZHBvaW50ICplcCA6IG1PdXRwdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHBvc3NpYmxlIGRpcmVjdGlvbnMuCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KCksIGZvdW5kICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAotICAgICAgICAgIGVuZHBvaW50LCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIChpbnQpZGlyZWN0aW9uKTsKLQotICAgIC8vIElmIHdlIGNhbid0IGZpbmQgYW4gZXhpc3Rpbmcgb25lIHRoZW4gb3BlbiBhIG5ldyBvbmUuCi0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gd2UgbXVzdCBjYWxsIG9wZW5TdHJlYW0gd2l0aCBhdWRpb3NlcnZlciBpZGVudGl0eQotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgc3dpdGNoKGRpcmVjdGlvbikgewotICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgICAgIGNhcHR1cmUgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhdWRpb1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gY2FwdHVyZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgcGxheWVyID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYXVkaW9TZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IHBsYXllcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50TU1hcCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpmaW5kRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgZW5kcG9pbnQ7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMucHVzaF9iYWNrKGNhcHR1cmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5wdXNoX2JhY2socGxheWVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludCwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCIsCisgICAgICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOwogICAgIH0KIAotICAgIGlmIChlbmRwb2ludCAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludCgpLCBzYW1wbGVSYXRlID0gJWQsIGZyYW1lc1BlckJ1cnN0ID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpLCBlbmRwb2ludC0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CisgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgotICAgICAgICBlbmRwb2ludC0+c2V0UmVmZXJlbmNlQ291bnQoZW5kcG9pbnQtPmdldFJlZmVyZW5jZUNvdW50KCkgKyAxKTsKKyAgICAgICAgZW5kcG9pbnQtPnNldE9wZW5Db3VudChlbmRwb2ludC0+Z2V0T3BlbkNvdW50KCkgKyAxKTsKICAgICB9CiAgICAgcmV0dXJuIGVuZHBvaW50OwogfQogCi12b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKnNlcnZpY2VFbmRwb2ludCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoc2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuU2hhcmVkRW5kcG9pbnQoCisgICAgICAgIEFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UsCisgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogCi0gICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgotICAgIGludDMyX3QgbmV3UmVmQ291bnQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldFJlZmVyZW5jZUNvdW50KCkgLSAxOwotICAgIHNlcnZpY2VFbmRwb2ludC0+c2V0UmVmZXJlbmNlQ291bnQobmV3UmVmQ291bnQpOwotICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmNsb3NlRW5kcG9pbnQoJXApIG5ld1JlZkNvdW50ID0gJWQiLAotICAgICAgICAgIHNlcnZpY2VFbmRwb2ludCwgbmV3UmVmQ291bnQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaGFyZWRMb2NrKTsKIAotICAgIC8vIElmIG5vIGxvbmdlciBpbiB1c2UgdGhlbiBjbG9zZSBhbmQgZGVsZXRlIGl0LgotICAgIGlmIChuZXdSZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBzZXJ2aWNlRW5kcG9pbnQtPmdldERpcmVjdGlvbigpOwotICAgICAgICAvLyBUcmFjayBlbmRwb2ludHMgYmFzZWQgb24gcmVxdWVzdGVkIGRldmljZUlkIGJlY2F1c2UgVU5TUEVDSUZJRUQKLSAgICAgICAgLy8gY2FuIGNoYW5nZSB0byBhIHNwZWNpZmljIGRldmljZSBhZnRlciBvcGVuaW5nLgotICAgICAgICBpbnQzMl90IGRldmljZUlkID0gc2VydmljZUVuZHBvaW50LT5nZXRSZXF1ZXN0ZWREZXZpY2VJZCgpOworICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24gPSByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBjb25maWd1cmF0aW9uLmdldERpcmVjdGlvbigpOwogCisgICAgLy8gVHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZW5kcG9pbnQuCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBlbmRwb2ludCA9IGZpbmRTaGFyZWRFbmRwb2ludF9sKGNvbmZpZ3VyYXRpb24pOworCisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBleGlzdGluZyBvbmUgdGhlbiBvcGVuIGEgbmV3IG9uZS4KKyAgICBpZiAoZW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAvLyB3ZSBtdXN0IGNhbGwgb3BlblN0cmVhbSB3aXRoIGF1ZGlvc2VydmVyIGlkZW50aXR5CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgICAgIG1JbnB1dHMuZXJhc2UoCi0gICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtSW5wdXRzLmJlZ2luKCksIG1JbnB1dHMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksIG1JbnB1dHMuZW5kKCkpOworICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoYWF1ZGlvU2VydmljZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgotICAgICAgICAgICAgICAgIG1PdXRwdXRzLmVyYXNlKAotICAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobU91dHB1dHMuYmVnaW4oKSwgbU91dHB1dHMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksIG1PdXRwdXRzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludCA9IG5ldyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFhdWRpb1NlcnZpY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNoYXJlZFN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5TaGFyZWRFbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAorICAgICAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKworICAgIGlmIChlbmRwb2ludC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IHVuZGVyIHRoaXMgbG9jay4KKyAgICAgICAgZW5kcG9pbnQtPnNldE9wZW5Db3VudChlbmRwb2ludC0+Z2V0T3BlbkNvdW50KCkgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZHBvaW50OworfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+c2VydmljZUVuZHBvaW50KSB7CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludC0+Z2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICByZXR1cm4gY2xvc2VFeGNsdXNpdmVFbmRwb2ludChzZXJ2aWNlRW5kcG9pbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjbG9zZVNoYXJlZEVuZHBvaW50KHNlcnZpY2VFbmRwb2ludCk7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFeGNsdXNpdmVFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCkgeworICAgIGlmIChzZXJ2aWNlRW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1FeGNsdXNpdmVMb2NrKTsKKyAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CisgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOworCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZXJhc2UoCisgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobUV4Y2x1c2l2ZVN0cmVhbXMuYmVnaW4oKSwgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksCisgICAgICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCkpOworCiAgICAgICAgIHNlcnZpY2VFbmRwb2ludC0+Y2xvc2UoKTsKLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludCgpIGRlbGV0ZSAlcCBmb3IgZGV2aWNlICVkLCBkaXIgPSAlZCIsCi0gICAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludCwgZGV2aWNlSWQsIChpbnQpZGlyZWN0aW9uKTsKLSAgICAgICAgZGVsZXRlIHNlcnZpY2VFbmRwb2ludDsKKyAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFeGNsdXNpdmVFbmRwb2ludCgpICVwIGZvciBkZXZpY2UgJWQiLAorICAgICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VTaGFyZWRFbmRwb2ludChzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCkgeworICAgIGlmIChzZXJ2aWNlRW5kcG9pbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaGFyZWRMb2NrKTsKKyAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CisgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOworCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgbVNoYXJlZFN0cmVhbXMuZXJhc2UoCisgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobVNoYXJlZFN0cmVhbXMuYmVnaW4oKSwgbVNoYXJlZFN0cmVhbXMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksCisgICAgICAgICAgICAgICAgbVNoYXJlZFN0cmVhbXMuZW5kKCkpOworCisgICAgICAgIHNlcnZpY2VFbmRwb2ludC0+Y2xvc2UoKTsKKyAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VTaGFyZWRFbmRwb2ludCgpICVwIGZvciBkZXZpY2UgJWQiLAorICAgICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAyNTExYjJmLi4zMmM4NDU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtMjQsMTEgKzI0LDEyIEBACiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotY2xhc3MgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIDogcHVibGljIGFuZHJvaWQ6OlNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+eworY2xhc3MgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIDogcHVibGljIGFuZHJvaWQ6OlNpbmdsZXRvbjxBQXVkaW9FbmRwb2ludE1hbmFnZXI+IHsKIHB1YmxpYzoKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIoKTsKICAgICB+QUF1ZGlvRW5kcG9pbnRNYW5hZ2VyKCkgPSBkZWZhdWx0OwpAQCAtNDksMjIgKzUwLDQyIEBACiAgICAgICogRmluZCBhIHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoZSBnaXZlbiBkZXZpY2VJZCBhbmQgZGlyZWN0aW9uLgogICAgICAqIElmIGFuIGVuZHBvaW50IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgdGhlbiB0cnkgdG8gY3JlYXRlIG9uZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2VJZAotICAgICAqIEBwYXJhbSBkaXJlY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGxwdHIKKyAgICAgKiBAcGFyYW0gYXVkaW9TZXJ2aWNlCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gc2hhcmluZ01vZGUKKyAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGwKICAgICAgKi8KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKm9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CiAKLSAgICB2b2lkIGNsb3NlRW5kcG9pbnQoQUF1ZGlvU2VydmljZUVuZHBvaW50ICpzZXJ2aWNlRW5kcG9pbnQpOworICAgIHZvaWQgY2xvc2VFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAKIHByaXZhdGU6CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuRXhjbHVzaXZlRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCi0gICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlblNoYXJlZEVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFhdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAotICAgIHN0ZDo6dmVjdG9yPEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUgKj4gbUlucHV0czsKLSAgICBzdGQ6OnZlY3RvcjxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5ICo+IG1PdXRwdXRzOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZmluZFNoYXJlZEVuZHBvaW50X2woCisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKworICAgIHZvaWQgY2xvc2VFeGNsdXNpdmVFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CisgICAgdm9pZCBjbG9zZVNoYXJlZEVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKKworICAgIC8vIFVzZSBzZXBhcmF0ZSBsb2NrcyBiZWNhdXNlIG9wZW5pbmcgYSBTaGFyZWQgZW5kcG9pbnQgcmVxdWlyZXMgb3BlbmluZyBhbiBFeGNsdXNpdmUgb25lLgorICAgIC8vIFRoYXQgY291bGQgY2F1c2UgYSByZWN1cnNpdmUgbG9jay4KKyAgICAvLyBMb2NrIG1TaGFyZWRMb2NrIGJlZm9yZSBtRXhjbHVzaXZlTG9jay4KKyAgICAvLyBpdCBpcyBPSyB0byBvbmx5IGxvY2sgbUV4Y2x1c2l2ZUxvY2suCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRMb2NrOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4+ICBtU2hhcmVkU3RyZWFtczsKKworICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRXhjbHVzaXZlTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPj4gICAgbUV4Y2x1c2l2ZVN0cmVhbXM7CiAKIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggMzk5MjcxOS4uNWEzNDg4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTE4LDkgKzE4LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3N0cmVhbT4KLS8vI2luY2x1ZGUgPHRpbWUuaD4KLS8vI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CkBAIC0zNSwxOCArMzUsMTMgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogI2RlZmluZSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyAgIDgKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFVRElPX0hBTkRMRV9UWVBFX1NUUkVBTQotfSBhYXVkaW9fc2VydmljZV9oYW5kbGVfdHlwZV90Owotc3RhdGljX2Fzc2VydChBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNIDwgSEFORExFX1RSQUNLRVJfTUFYX1RZUEVTLCAiVG9vIG1hbnkgaGFuZGxlIHR5cGVzLiIpOwordXNpbmcgYW5kcm9pZDo6QUF1ZGlvU2VydmljZTsKIAogYW5kcm9pZDo6QUF1ZGlvU2VydmljZTo6QUF1ZGlvU2VydmljZSgpCiAgICAgOiBCbkFBdWRpb1NlcnZpY2UoKSB7CkBAIC03MCw3ICs2NSw4IEBACiAgICAgICAgIHJlc3VsdCA9IHNzLnN0cigpOwogICAgICAgICBBTE9HVygiJXMiLCByZXN1bHQuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gbUhhbmRsZVRyYWNrZXIuZHVtcCgpCisgICAgICAgIHJlc3VsdCA9ICItLS0tLS0tLS0tLS0gQUF1ZGlvIFNlcnZpY2UgLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICsgbVN0cmVhbVRyYWNrZXIuZHVtcCgpCiAgICAgICAgICAgICAgICAgICsgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5kdW1wKCkKICAgICAgICAgICAgICAgICAgKyBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCkuZHVtcCgpOwogICAgIH0KQEAgLTExNCwyMyArMTEwLDIwIEBACiAgICAgICAgICAgICAgICAgbUF1ZGlvQ2xpZW50LmNsaWVudFVpZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHsKICAgICAgICAgICAgIGluU2VydmljZSA9IHJlcXVlc3QuaXNJblNlcnZpY2UoKTsKICAgICAgICAgfQotICAgICAgICBzZXJ2aWNlU3RyZWFtID0gbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKG1BdWRpb0NsaWVudCwgaW5TZXJ2aWNlKTsKLSAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9IG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCgqdGhpcywgaW5TZXJ2aWNlKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byB1c2luZyBhIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgICAgIC8vIENsZWFyIGl0IHNvIHdlIGNhbiBwb3NzaWJseSBmYWxsIGJhY2sgdG8gdXNpbmcgYSBzaGFyZWQgc3RyZWFtLgogICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKSwgY291bGQgbm90IG9wZW4gaW4gRVhDTFVTSVZFIG1vZGUiKTsKICAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCiAgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwotICAgICAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMTM5LDE3ICsxMzIsMTIgQEAKICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewotICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbUhhbmRsZVRyYWNrZXIucHV0KEFBVURJT19IQU5ETEVfVFlQRV9TVFJFQU0sIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwotICAgICAgICBpZiAoaGFuZGxlIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogaGFuZGxlIHRhYmxlIGZ1bGwiKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0tPmNsb3NlKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpOiBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOwotICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgICAgICAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOwotICAgICAgICB9CisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtU3RyZWFtVHJhY2tlci5hZGRTdHJlYW1Gb3JIYW5kbGUoc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0tPnNldEhhbmRsZShoYW5kbGUpOworICAgICAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOworICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7CisgICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuY29weUZyb20oKnNlcnZpY2VTdHJlYW0pOwogICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgIH0KIH0KQEAgLTE1NywzMCArMTQ1LDMyIEBACiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIC8vIENoZWNrIHBlcm1pc3Npb24gYW5kIG93bmVyc2hpcCBmaXJzdC4KICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KIAogICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlLmNsb3NlU3RyZWFtKDB4JTA4WCkiLCBzdHJlYW1IYW5kbGUpOwogICAgIC8vIFJlbW92ZSBoYW5kbGUgZnJvbSB0cmFja2VyIHNvIHRoYXQgd2UgY2Fubm90IGxvb2sgdXAgdGhlIHJhdyBhZGRyZXNzIGFueSBtb3JlLgotICAgIHNlcnZpY2VTdHJlYW0gPSAoQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKikKLSAgICAgICAgICAgIG1IYW5kbGVUcmFja2VyLnJlbW92ZShBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gIT0gbnVsbHB0cikgeworICAgIC8vIHJlbW92ZVN0cmVhbUJ5SGFuZGxlKCkgdXNlcyBhIGxvY2sgc28gdGhhdCBpZiB0aGVyZSBhcmUgdHdvIHNpbXVsdGFuZW91cyBjbG9zZXMKKyAgICAvLyB0aGVuIG9ubHkgb25lIHdpbGwgZ2V0IHRoZSBwb2ludGVyIGFuZCBkbyB0aGUgY2xvc2UuCisgICAgc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLnJlbW92ZVN0cmVhbUJ5SGFuZGxlKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLT5jbG9zZSgpOwogICAgICAgICBwaWRfdCBwaWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclByb2Nlc3NJZCgpOwogICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnVucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oMHglMHgpIGJlaW5nIGhhbmRsZWQgYnkgYW5vdGhlciB0aHJlYWQiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogfQogCi1BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqQUF1ZGlvU2VydmljZTo6Y29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKLSAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgY29uc3QgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gKEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICopCi0gICAgICAgICAgICBtSGFuZGxlVHJhY2tlci5nZXQoQUFVRElPX0hBTkRMRV9UWVBFX1NUUkVBTSwgKGFhdWRpb19oYW5kbGVfdClzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtICE9IG51bGxwdHIpIHsKKworc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1NlcnZpY2U6OmNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oCisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLmdldFN0cmVhbUJ5SGFuZGxlKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBPbmx5IGFsbG93IG93bmVyIG9yIHRoZSBhYXVkaW8gc2VydmljZSB0byBhY2Nlc3MgdGhlIHN0cmVhbS4KICAgICAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VzZXJJZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgY29uc3QgdWlkX3Qgb3duZXJVc2VySWQgPSBzZXJ2aWNlU3RyZWFtLT5nZXRPd25lclVzZXJJZCgpOwpAQCAtMjAwLDMwICsxOTAsMzAgQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpnZXRTdHJlYW1EZXNjcmlwdGlvbigKICAgICAgICAgICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5nZXREZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKICAgICAvLyBwYXJjZWxhYmxlLmR1bXAoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnN0YXJ0KCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RhcnQoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KQEAgLTIzMiw5ICsyMjIsOSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+c3RvcCgpOwpAQCAtMjQyLDggKzIzMiw4IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CkBAIC0yNTMsOCArMjQzLDggQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQpAQCAtMjc4LDggKzI2OCw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKQEAgLTI5NSw4ICsyODUsOCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0YXJ0Q2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RhcnRDbGllbnQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLAogICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwpAQCAtMzA2LDggKzI5Niw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAppbmRleCA4NDIxZWZjLi5lZWYwODI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCkBAIC0yNCwxMSArMjQsMTMgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgInV0aWxpdHkvSGFuZGxlVHJhY2tlci5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKKworI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKKyNpbmNsdWRlICJBQXVkaW9TdHJlYW1UcmFja2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDksNDUgKzUxLDUzIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogCi0gICAgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBMb29rdXAgc3RyZWFtIGFuZCB0aGVuIHZhbGlkYXRlIGFjY2VzcyB0byB0aGUgc3RyZWFtLgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKKyAgICAgICAgICAgIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CiAKLSAgICBIYW5kbGVUcmFja2VyIG1IYW5kbGVUcmFja2VyOwogCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgbUF1ZGlvQ2xpZW50OwogCisgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1UcmFja2VyICAgICAgICAgICAgICAgICBtU3RyZWFtVHJhY2tlcjsKKwogICAgIGVudW0gY29uc3RhbnRzIHsKICAgICAgICAgREVGQVVMVF9BVURJT19QUklPUklUWSA9IDIKICAgICB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggMGY4NjNmZS4uMzA5NWJjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zMywxNyArMzMsMTQgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi0jZGVmaW5lIE1JTl9USU1FT1VUX05BTk9TICAgICAgICAoMTAwMCAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpCi0KLS8vIFdhaXQgYXQgbGVhc3QgdGhpcyBtYW55IHRpbWVzIGxvbmdlciB0aGFuIHRoZSBvcGVyYXRpb24gc2hvdWxkIHRha2UuCi0jZGVmaW5lIE1JTl9USU1FT1VUX09QRVJBVElPTlMgICAgNAotCi0vLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgaW4gZnJhbWVzLiBUaGUgZWZmZWN0aXZlIHNpemUgY2FuIGJlIHR1bmVkIHNtYWxsZXIgYXQgcnVudGltZS4KLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkgICAoNDggKiA4KQorQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgeworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSBkZXN0cm95aW5nIGVuZHBvaW50ICVwIiwgdGhpcyk7Cit9CiAKIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CkBAIC01MywxOSArNTAsMjAgQEAKICAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAogICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CiAgICAgaWYgKCFpc0xvY2tlZCkgewotICAgICAgICByZXN1bHQgPDwgIkVuZHBvaW50TWFuYWdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAgICAgfQogCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKnN0cmVhbSA9IG1TdHJlYW1JbnRlcm5hbDsKLSAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJudWxsIHN0cmVhbSEiIDw8ICJcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0IDw8ICJtbWFwIHN0cmVhbTogcmF0ZSA9ICIgPDwgc3RyZWFtLT5nZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKLSAgICB9Ci0KKyAgICByZXN1bHQgPDwgIiAgICBEaXJlY3Rpb246ICAgICAgICAgICAgIiA8PCAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJPVVRQVVQiIDogIklOUFVUIikgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBSZWZlcmVuY2UgQ291bnQ6ICAgICAgIiA8PCBtT3BlbkNvdW50IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUmVxdWVzdGVkIERldmljZSBJZDogICIgPDwgbVJlcXVlc3RlZERldmljZUlkIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFJlZ2lzdGVyZWQgU3RyZWFtczoiIDw8ICJcbiI7Ci0gICAgZm9yIChzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgcmVzdWx0IDw8IHNoYXJlZFN0cmVhbS0+ZHVtcCgpOworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgIHJlc3VsdCA8PCBzdHJlYW0tPmR1bXAoKSA8PCAiXG4iOwogICAgIH0KIAogICAgIGlmIChpc0xvY2tlZCkgewpAQCAtNzQsMTEwICs3Miw0NCBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLS8vIFNldCB1cCBhbiBFWENMVVNJVkUgTU1BUCBzdHJlYW0gdGhhdCB3aWxsIGJlIHNoYXJlZC4KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6Om9wZW4oY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikgewotICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKTsKLSAgICBtU3RyZWFtSW50ZXJuYWwgPSBnZXRTdHJlYW1JbnRlcm5hbCgpOwotCi0gICAgQXVkaW9TdHJlYW1CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7Ci0gICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgotICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOwotICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKLSAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKLSAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOwotICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGdldERpcmVjdGlvbigpKTsKLSAgICBidWlsZGVyLnNldEJ1ZmZlckNhcGFjaXR5KERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZKTsKLQotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5vcGVuKGJ1aWxkZXIpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpjbG9zZSgpIHsKLSAgICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmNsb3NlKCk7Ci19Ci0KLS8vIFRPRE8sIG1heWJlIHVzZSBhbiBpbnRlcmZhY2UgdG8gcmVkdWNlIGV4cG9zdXJlCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpyZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPnNoYXJlZFN0cmVhbSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgbVJlZ2lzdGVyZWRTdHJlYW1zLnB1c2hfYmFjayhzaGFyZWRTdHJlYW0pOwotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnVucmVnaXN0ZXJTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD5zaGFyZWRTdHJlYW0pIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lcmFzZShzdGQ6OnJlbW92ZShtUmVnaXN0ZXJlZFN0cmVhbXMuYmVnaW4oKSwgbVJlZ2lzdGVyZWRTdHJlYW1zLmVuZCgpLCBzaGFyZWRTdHJlYW0pLAotICAgICAgICAgICAgICBtUmVnaXN0ZXJlZFN0cmVhbXMuZW5kKCkpOwotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgaWYgKCsrbVJ1bm5pbmdTdHJlYW1zID09IDEpIHsKLSAgICAgICAgLy8gVE9ETyB1c2UgcmVhbC10aW1lIHRlY2huaXF1ZSB0byBhdm9pZCBtdXRleCwgZWcuIGF0b21pYyBjb21tYW5kIEZJRk8KLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0YXJ0KCk7Ci0gICAgICAgIHN0YXJ0U2hhcmluZ1RocmVhZF9sKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKSB7Ci0gICAgLy8gRG9uJ3QgbG9jayBoZXJlIGJlY2F1c2UgdGhlIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcyBhbHNvIHVzZXMgdGhlIGxvY2suCi0gICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1zID09IDApIHsgLy8gYXRvbWljCi0gICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7Ci0gICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7Ci0gICAgfQotICAgIHJldHVybiBBQVVESU9fT0s7Ci19Ci0KLXN0YXRpYyB2b2lkICphYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2Modm9pZCAqY29udGV4dCkgewotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSAoQUF1ZGlvU2VydmljZUVuZHBvaW50ICopIGNvbnRleHQ7Ci0gICAgaWYgKGVuZHBvaW50ICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50LT5jYWxsYmFja0xvb3AoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0U2hhcmluZ1RocmVhZF9sKCkgewotICAgIC8vIExhdW5jaCB0aGUgY2FsbGJhY2sgbG9vcCB0aHJlYWQuCi0gICAgaW50NjRfdCBwZXJpb2ROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAotICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywgdGhpcyk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0b3BTaGFyaW5nVGhyZWFkKCkgewotICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5qb2luVGhyZWFkKE5VTEwpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICBmb3IoYXV0byBzaGFyZWRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgc2hhcmVkU3RyZWFtLT5zdG9wKCk7Ci0gICAgICAgIHNoYXJlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgIGZvciAoY29uc3QgYXV0byBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtLT5zdG9wKCk7CisgICAgICAgIHN0cmVhbS0+ZGlzY29ubmVjdCgpOwogICAgIH0KICAgICBtUmVnaXN0ZXJlZFN0cmVhbXMuY2xlYXIoKTsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6cmVnaXN0ZXJTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+c3RyZWFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKKyAgICBtUmVnaXN0ZXJlZFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6dW5yZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT5zdHJlYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lcmFzZShzdGQ6OnJlbW92ZSgKKyAgICAgICAgICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5iZWdpbigpLCBtUmVnaXN0ZXJlZFN0cmVhbXMuZW5kKCksIHN0cmVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lbmQoKSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwogYm9vbCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6Om1hdGNoZXMoY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikgeworICAgIGlmIChjb25maWd1cmF0aW9uLmdldERpcmVjdGlvbigpICE9IGdldERpcmVjdGlvbigpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSAhPSBtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCkpIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSkgeworICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gbVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgeworICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBlNDBhNjcwLi5jMTljYzM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtMjQsNzAgKzI0LDkzIEBACiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKLSNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCi0jaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKLSNpbmNsdWRlICJBQXVkaW9NaXhlci5oIgotI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKKworI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgeworLyoqCisgKiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgaXMgdXNlZCBieSBhIHN1YmNsYXNzIG9mIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlCisgKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIGF1ZGlvIGRldmljZSBvciBwb3J0LgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQKKyAgICAgICAgOiBwdWJsaWMgdmlydHVhbCBhbmRyb2lkOjpSZWZCYXNlCisgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpID0gZGVmYXVsdDsKIAotICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKLSAgICBpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKTsgfQotICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsgIH0KLSAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOyAgfQorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSA9IDA7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSA9IDA7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRDbGllbnQoJXAsIC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIiwgJmNsaWVudCk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpzdG9wQ2xpZW50KC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvc2l0aW9uRnJhbWVzCisgICAgICogQHBhcmFtIHRpbWVOYW5vcworICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSBvciBvdGhlciBuZWdhdGl2ZSBlcnJvcgorICAgICAqLworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CisgICAgfQogCiAgICAgaW50MzJfdCBnZXRSZXF1ZXN0ZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0ZWREZXZpY2VJZDsgfQotICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCk7IH0KLQotICAgIGFhdWRpb19kaXJlY3Rpb25fdCBnZXREaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldERpcmVjdGlvbigpOyB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwotCi0gICAgdmlydHVhbCB2b2lkICpjYWxsYmFja0xvb3AoKSA9IDA7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBBQXVkaW9FbmRwb2ludE1hbmFnZXIgdW5kZXIgYSBtdXRleC4KLSAgICBpbnQzMl90IGdldFJlZmVyZW5jZUNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlZmVyZW5jZUNvdW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEFBdWRpb0VuZHBvaW50TWFuYWdlciB1bmRlciBhIG11dGV4LgotICAgIHZvaWQgc2V0UmVmZXJlbmNlQ291bnQoaW50MzJfdCBjb3VudCkgewotICAgICAgICBtUmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLSAgICB9CiAKICAgICBib29sIG1hdGNoZXMoY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CiAKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKmdldFN0cmVhbUludGVybmFsKCkgPSAwOworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEFBdWRpb0VuZHBvaW50TWFuYWdlciB1bmRlciBhIG11dGV4LgorICAgIGludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU9wZW5Db3VudDsKKyAgICB9CiAKLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CisgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIHVuZGVyIGEgbXV0ZXguCisgICAgdm9pZCBzZXRPcGVuQ291bnQoaW50MzJfdCBjb3VudCkgeworICAgICAgICBtT3BlbkNvdW50ID0gY291bnQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgIG1Mb2NrU3RyZWFtczsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtczsKIAotICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CiAKLSAgICBzdGQ6OmF0b21pYzxpbnQ+ICAgICAgICAgbVJ1bm5pbmdTdHJlYW1zezB9OworICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICBtTW1hcENsaWVudDsgICAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBvcGVuIGFuZCBzdGFydFN0cmVhbQogCi1wcml2YXRlOgotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU2hhcmluZ1RocmVhZCgpOwotCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKm1TdHJlYW1JbnRlcm5hbCA9IG51bGxwdHI7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1SZWZlcmVuY2VDb3VudCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1PcGVuQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSAwOworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggNmEzNzMzMC4uYzdkOWI4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTMwLDIwICszMCwyMiBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAogQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVN0cmVhbUludGVybmFsQ2FwdHVyZShhdWRpb1NlcnZpY2UsIHRydWUpIHsKKyAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsQ2FwdHVyZTsKIH0KIAogQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKSB7CiAgICAgZGVsZXRlIG1EaXN0cmlidXRpb25CdWZmZXI7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50OjpvcGVuKGNvbmZpZ3VyYXRpb24pOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBkZWxldGUgbURpc3RyaWJ1dGlvbkJ1ZmZlcjsKICAgICAgICAgaW50IGRpc3RyaWJ1dGlvbkJ1ZmZlclNpemVCeXRlcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKQEAgLTYyLDYgKzY0LDkgQEAKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CiAgICAgd2hpbGUgKG1DYWxsYmFja0VuYWJsZWQubG9hZCgpICYmIGdldFN0cmVhbUludGVybmFsKCktPmlzQWN0aXZlKCkgJiYgKHJlc3VsdCA+PSAwKSkgeworCisgICAgICAgIGludDY0X3QgbW1hcEZyYW1lc1JlYWQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNSZWFkKCk7CisKICAgICAgICAgLy8gUmVhZCBhdWRpbyBkYXRhIGZyb20gc3RyZWFtIHVzaW5nIGEgYmxvY2tpbmcgcmVhZC4KICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVhZChtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKQEAgLTc0LDE4ICs3OSw0NyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRGlzdHJpYnV0ZSBkYXRhIHRvIGVhY2ggYWN0aXZlIHN0cmVhbS4KLSAgICAgICAgeyAvLyB1c2UgbG9jayBndWFyZAorICAgICAgICB7IC8vIGJyYWNrZXRzIGFyZSBmb3IgbG9ja19ndWFyZAorCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgICAgIGZvciAoc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlmb0J1ZmZlciAqZmlmbyA9IHNoYXJlZFN0cmVhbS0+Z2V0RGF0YUZpZm9CdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWZvLT53cml0ZShtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIHRoZSBBdWRpb0ZpZm8gdG8gcHJvdGVjdCBhZ2FpbnN0IGNsb3NlLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhUXVldWVMb2NrKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBGaWZvQnVmZmVyICpmaWZvID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvICE9IG51bGxwdHIpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBvZmZzZXQgYmV0d2VlbiBmcmFtZVBvc2l0aW9uIGluIGNsaWVudCdzIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEZyYW1lc1dyaXR0ZW4gPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIGluZGljZXMgdGhhdCByZWZlciB0byB0aGUgc2FtZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1JlYWQgLSBjbGllbnRGcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3dDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm8tPndyaXRlKG1EaXN0cmlidXRpb25CdWZmZXIsIGdldEZyYW1lc1BlckJ1cnN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyZWFtLT5tYXJrVHJhbnNmZXJUaW1lKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRGcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgcmVwcmVzZW50cyB0aGUgY29tcGxldGlvbiBvZiBkYXRhIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBidWZmZXIuIEl0IGlzIHNlbnQgdG8gdGhlIGNsaWVudCBhbmQgdXNlZCBpbiB0aGUgdGltaW5nIG1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZWNpZGUgd2hlbiBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1dyaXR0ZW4sIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5tYXJrVHJhbnNmZXJUaW1lKHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oCmluZGV4IDhhM2Q3MmYuLjk3MWRhOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgKQEAgLTIwLDE4ICsyMCwxOCBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCiAKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKLSAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuICZtU3RyZWFtSW50ZXJuYWxDYXB0dXJlOwotICAgIH0KIAogICAgIHZvaWQgKmNhbGxiYWNrTG9vcCgpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmUyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKworI2luY2x1ZGUgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgorCisjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCIKKworCisjZGVmaW5lIEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOICAgIDQgKiA1MTIKKyNkZWZpbmUgQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQgICAgNDgwMDAKKworLy8gVGhpcyBpcyBhbiBlc3RpbWF0ZSBvZiB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEhXIGFuZCB0aGUgTU1BUCB0aW1lLgorLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgZnJvbSB0aGUgSEFMIGluc3RlYWQgb2YgdXNpbmcgdGhlc2UgZXN0aW1hdGVzLgorI2RlZmluZSBPVVRQVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUyAgKDMgKiBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EKQorI2RlZmluZSBJTlBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TICAgKC0xICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAorCitBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkKKyAgICAgICAgOiAgbU1tYXBTdHJlYW0obnVsbHB0cikge30KKworQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKSB7fQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCAiICBNTUFQOiBmcmFtZXNUcmFuc2ZlcnJlZCA9ICIgPDwgbUZyYW1lc1RyYW5zZmVycmVkLmdldCgpOworICAgIHJlc3VsdCA8PCAiLCBIVyBuYW5vcyA9ICIgPDwgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOworICAgIHJlc3VsdCA8PCAiLCBwb3J0IGhhbmRsZSA9ICIgPDwgbVBvcnRIYW5kbGU7CisgICAgcmVzdWx0IDw8ICIsIGF1ZGlvIGRhdGEgRkQgPSAiIDw8IG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcjsKKyAgICByZXN1bHQgPDwgIlxuIjsKKworICAgIHJlc3VsdCA8PCAiICAgIEhXIE9mZnNldCBNaWNyb3M6ICAgICAiIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpIDw8ICJcbiI7CisKKyAgICByZXN1bHQgPDwgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCk7CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQSwKKyAgICAgICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sCisgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgLnRhZ3MgPSAiIgorICAgIH07CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKKworICAgIGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7CisgICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7CisKKyAgICBjb3B5RnJvbShyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpKTsKKworICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CisgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKKyAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOworCisgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOworCisgICAgLy8gRmlsbCBpbiBjb25maWcKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisgICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICB9CisgICAgY29uZmlnLmZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9Gb3JtYXQpOworCisgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOworICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBhYXVkaW9TYW1wbGVSYXRlID0gQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQ7CisgICAgfQorICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGFhdWRpb1NhbXBsZVJhdGU7CisKKyAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGFhdWRpb1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IE9VVFBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TOyAvLyBmcmFtZXMgYXQgREFDIGxhdGVyCisKKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAgKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX0lOX1NURVJFTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoYWF1ZGlvU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gSU5QVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUzsgLy8gZnJhbWVzIGF0IEFEQyBlYXJsaWVyCisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gLSBpbnZhbGlkIGRpcmVjdGlvbiA9ICVkIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgIH0KKworICAgIE1tYXBTdHJlYW1JbnRlcmZhY2U6OnN0cmVhbV9kaXJlY3Rpb25fdCBzdHJlYW1EaXJlY3Rpb24gPQorICAgICAgICAgICAgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgID8gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVAorICAgICAgICAgICAgOiBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fSU5QVVQ7CisKKyAgICAvLyBPcGVuIEhBTCBzdHJlYW0uIFNldCBtTW1hcFN0cmVhbQorICAgIHN0YXR1c190IHN0YXR1cyA9IE1tYXBTdHJlYW1JbnRlcmZhY2U6Om9wZW5NbWFwU3RyZWFtKHN0cmVhbURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAvLyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUG9ydEhhbmRsZSk7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBtTWFwQ2xpZW50LnVpZCA9ICVkLCBwaWQgPSAlZCA9PiBwb3J0SGFuZGxlID0gJWRcbiIsCisgICAgICAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiKTsKKyAgICB9CisgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOworCisgICAgLy8gQ3JlYXRlIE1NQVAvTk9JUlEgYnVmZmVyLgorICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCisgICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKKyAgICB9CisgICAgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY3JlYXRlTW1hcEJ1ZmZlcigpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCAlcyIsCisgICAgICAgICAgICAgIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZU1tYXBCdWZmZXIgc3RhdHVzID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCisgICAgICAgICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKKyAgICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgICBhYnMobU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyksCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDAgPyAiWWVzIiA6ICJObyIpOworICAgIH0KKworICAgIHNldEJ1ZmZlckNhcGFjaXR5KG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpOworICAgIC8vIFRoZSBhdWRpbyBIQUwgaW5kaWNhdGVzIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGZkIGNhbiBiZSBzaGFyZWQgb3V0c2lkZSBvZiBhdWRpb3NlcnZlcgorICAgIC8vIGJ5IHJldHVybmluZyBhIG5lZ2F0aXZlIGJ1ZmZlciBzaXplCisgICAgaWYgKGdldEJ1ZmZlckNhcGFjaXR5KCkgPCAwKSB7CisgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBvciBzZXJ2aWNlLgorICAgICAgICBzZXRCdWZmZXJDYXBhY2l0eSgtZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgY2FuIG9ubHkgYmUgdXNlZCBieSB0aGUgc2VydmljZSBiZWNhdXNlIHRoZSBGRCBjYW5ub3QgYmUgc2hhcmVkLgorICAgICAgICB1aWRfdCBhdWRpb1NlcnZpY2VVaWQgPSBnZXR1aWQoKTsKKyAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgorICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQorICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50Iik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gYW5kIHBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyLgorICAgIHNldFNhbXBsZXNQZXJGcmFtZSgoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKQorICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spKTsKKworICAgIC8vIEFBdWRpbyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIEZEIGFuZCByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgY29weS4KKyAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KKyAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7CisgICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIik7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOworICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCkpOworICAgIHNldFNhbXBsZVJhdGUoY29uZmlnLnNhbXBsZV9yYXRlKTsKKworICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCisgICAgLy8gVGhpcyBpcyB0byBhdm9pZCB3YWtpbmcgdGhlIENQVSB0b28gb2Z0ZW4gd2hlbiB0aGUgSFcgYnVyc3QgaXMgdmVyeSBzbWFsbAorICAgIC8vIG9yIGF0IGhpZ2ggc2FtcGxlIHJhdGVzLgorICAgIGRvIHsKKyAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCisgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBidXJzdE1pY3JvcyA9IG1GcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gZ2V0U2FtcGxlUmF0ZSgpOworICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOworCisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgdG8gYnVyc3QgPSAlZFxuIiwKKyAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsIGJ1cnN0TWluTWljcm9zLCBtRnJhbWVzUGVyQnVyc3QpOworCisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgorICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSB7CisKKyAgICBpZiAobU1tYXBTdHJlYW0gIT0gMCkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSBjbGVhcigpIGVuZHBvaW50Iik7CisgICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgY2xlYXJlZCBvciBDVFMgd2lsbCBmYWlsIGJ1dCBpdCBpcyBub3QgY2xlYXIgd2h5LgorICAgICAgICBtTW1hcFN0cmVhbS5jbGVhcigpOworICAgICAgICAvLyBBcHBhcmVudGx5IHRoZSBhYm92ZSBjbG9zZSBpcyBhc3luY2hyb25vdXMuIEFuIGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBkZXZpY2UKKyAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgYSBjbG9zZSBjYW4gZmFpbC4gQWxzbyBzb21lIGNhbGxiYWNrcyBtYXkgc3RpbGwgYmUgaW4gZmxpZ2h0IQorICAgICAgICAvLyBGSVhNRSBNYWtlIGNsb3Npbmcgc3luY2hyb25vdXMuCisgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwRm9yTmFub3MoMTAwICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCk7CisgICAgfQorCisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICAvLyBTdGFydCB0aGUgY2xpZW50IG9uIGJlaGFsZiBvZiB0aGUgQUF1ZGlvIHNlcnZpY2UuCisgICAgLy8gVXNlIHRoZSBwb3J0IGhhbmRsZSB0aGF0IHdhcyBwcm92aWRlZCBieSBvcGVuTW1hcFN0cmVhbSgpLgorICAgIHJldHVybiBzdGFydENsaWVudChtTW1hcENsaWVudCwgJm1Qb3J0SGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICBtRnJhbWVzVHJhbnNmZXJyZWQucmVzZXQzMigpOworCisgICAgLy8gUm91bmQgNjQtYml0IGNvdW50ZXIgdXAgdG8gYSBtdWx0aXBsZSBvZiB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgNjQtYml0IGNvdW50ZXIgaXMgdXNlZCBhcyBhbiBpbmRleAorICAgIC8vIGludG8gYSBjaXJjdWxhciBidWZmZXIgYW5kIHRoZSBhY3R1YWwgSFcgcG9zaXRpb24gaXMgcmVzZXQgdG8gemVybworICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyBzdG9wcGVkLgorICAgIG1GcmFtZXNUcmFuc2ZlcnJlZC5yb3VuZFVwNjQoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisKKyAgICByZXR1cm4gc3RvcENsaWVudChtUG9ydEhhbmRsZSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KCVwKHVpZD0lZCwgcGlkPSVkKSkiLAorICAgICAgICAgICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgb3JpZ2luYWxIYW5kbGUgPSAgKmNsaWVudEhhbmRsZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudCgpICwgJWQgPT4gJWQgcmV0dXJucyAlZCIsCisgICAgICAgICAgb3JpZ2luYWxIYW5kbGUsICpjbGllbnRIYW5kbGUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChtTW1hcFN0cmVhbS0+c3RvcChjbGllbnRIYW5kbGUpKTsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RvcENsaWVudCglZCkgcmV0dXJucyAlZCIsIGNsaWVudEhhbmRsZSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBHZXQgZnJlZS1ydW5uaW5nIERTUCBvciBETUEgaGFyZHdhcmUgcG9zaXRpb24gZnJvbSB0aGUgSEFMLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gcG9zaXRpb247CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKCZwb3NpdGlvbik7CisgICAgQUxPR1YoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oKSBzdGF0dXM9ICVkLCBwb3MgPSAlZCwgbmFub3MgPSAlbGxkXG4iLAorICAgICAgICAgIHN0YXR1cywgcG9zaXRpb24ucG9zaXRpb25fZnJhbWVzLCAobG9uZyBsb25nKSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgeworICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgYXZhaWxhYmxlIik7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHBvc2l0aW9uIHRvIDY0LWJpdCBwb3NpdGlvbi4KKyAgICAgICAgbUZyYW1lc1RyYW5zZmVycmVkLnVwZGF0ZTMyKHBvc2l0aW9uLnBvc2l0aW9uX2ZyYW1lcyk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IG1GcmFtZXNUcmFuc2ZlcnJlZC5nZXQoKTsKKyAgICAgICAgKnRpbWVOYW5vcyA9IHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHM7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgcmV0dXJuIDA7IC8vIFRPRE8KK30KKworCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSB7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKKyAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKK307CisKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSB7CisgICAgLy8gVE9ETyBkbyB3ZSByZWFsbHkgbmVlZCBhIGRpZmZlcmVudCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbD8KKyAgICBmbG9hdCB2b2x1bWUgPSB2YWx1ZXNbMF07CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVm9sdW1lQ2hhbmdlZCgpIHZvbHVtZVswXSA9ICVmIiwgdm9sdW1lKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgIGZvcihjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBzdHJlYW0tPm9uVm9sdW1lQ2hhbmdlZCh2b2x1bWUpOworICAgIH0KK307CisKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Sb3V0aW5nQ2hhbmdlZChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uUm91dGluZ0NoYW5nZWQoKSBjYWxsZWQgd2l0aCAlZCwgb2xkID0gJWQiLAorICAgICAgICAgIGRldmljZUlkLCBnZXREZXZpY2VJZCgpKTsKKyAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICAmJiBnZXREZXZpY2VJZCgpICE9IGRldmljZUlkKSB7CisgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgIH0KKyAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7Cit9OworCisvKioKKyAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgorICovCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK3sKKyAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUgYmFzZWQgb24gSEFMIGluZm8uCisgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpOworICAgIGludDMyX3QgY2FwYWNpdHlJbkJ5dGVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAqIGJ5dGVzUGVyRnJhbWU7CisgICAgaW50IGZkSW5kZXggPSBwYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKKyAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7CisgICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNjI2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfTU1BUF9ICisjZGVmaW5lIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX01NQVBfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhYXVkaW8geworCisvKioKKyAqIFRoaXMgaXMgdXNlZCBieSBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCB0byBhY2Nlc3MgdGhlIE1NQVAgZGV2aWNlcworICogdGhyb3VnaCBBdWRpb0ZsaW5nZXIuCisgKi8KK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAKKyAgICAgICAgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50CisgICAgICAgICwgcHVibGljIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayB7CisKK3B1YmxpYzoKKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CisKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CisKKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSAgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0gQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBNbWFwU3RyZWFtQ2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGU7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSk7CisKKyAgICBpbnQ2NF90IGdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOworICAgIH0KKworcHJpdmF0ZToKKyAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzVHJhbnNmZXJyZWQ7CisKKyAgICAvLyBJbnRlcmZhY2UgdG8gdGhlIEF1ZGlvRmxpbmdlciBNTUFQIHN1cHBvcnQuCisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TW1hcFN0cmVhbUludGVyZmFjZT4gbU1tYXBTdHJlYW07CisgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgICAgICAgICAgICAgICAgIG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcjsKKworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IDA7IC8vIFRPRE8gZ2V0IGZyb20gSEFMCisKK307CisKK30gLyogbmFtZXNwYWNlIGFhdWRpbyAqLworCisjZW5kaWYgLy9BQVVESU9fU0VSVklDRV9FTkRQT0lOVF9NTUFQX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBiODNiOTE4Li45YjE4MzNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZApAQCAtNDEsMTMgKzQyLDE0IEBACiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1TdHJlYW1JbnRlcm5hbFBsYXkoYXVkaW9TZXJ2aWNlLCB0cnVlKSB7CisgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6b3Blbihjb25maWd1cmF0aW9uKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgbU1peGVyLmFsbG9jYXRlKGdldFN0cmVhbUludGVybmFsKCktPmdldFNhbXBsZXNQZXJGcmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUGVyQnVyc3QoKSk7CkBAIC02NSw3ICs2Nyw2IEBACiAKIC8vIE1peCBkYXRhIGZyb20gZWFjaCBhcHBsaWNhdGlvbiBzdHJlYW0gYW5kIHdyaXRlIHJlc3VsdCB0byB0aGUgc2hhcmVkIE1NQVAgc3RyZWFtLgogdm9pZCAqQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6Y2FsbGJhY2tMb29wKCkgewotICAgIGludDMyX3QgdW5kZXJmbG93Q291bnQgPSAwOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dCgpOwogCkBAIC03MywxOSArNzQsNTQgQEAKICAgICB3aGlsZSAobUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkgJiYgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+aXNBY3RpdmUoKSAmJiAocmVzdWx0ID49IDApKSB7CiAgICAgICAgIC8vIE1peCBkYXRhIGZyb20gZWFjaCBhY3RpdmUgc3RyZWFtLgogICAgICAgICBtTWl4ZXIuY2xlYXIoKTsKLSAgICAgICAgeyAvLyB1c2UgbG9jayBndWFyZAorCisgICAgICAgIHsgLy8gYnJhY2tldHMgYXJlIGZvciBsb2NrX2d1YXJkCiAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgaW50NjRfdCBtbWFwRnJhbWVzV3JpdHRlbiA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1dyaXR0ZW4oKTsKKwogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgICAgICAgICBmb3IgKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChzaGFyZWRTdHJlYW0tPmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzaGFyZWRTdHJlYW0tPmdldERhdGFGaWZvQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsgLy8gdG8gbWF0Y2ggbGVnYWN5IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBib29sIHVuZGVyZmxvd2VkID0gbU1peGVyLm1peChpbmRleCwgZmlmbywgdm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJmbG93Q291bnQgKz0gdW5kZXJmbG93ZWQgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBsb2cgdW5kZXJmbG93cyBpbiBlYWNoIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBzaGFyZWRTdHJlYW0tPm1hcmtUcmFuc2ZlclRpbWUoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNSZWFkID0gMDsKKworICAgICAgICAgICAgICAgIGlmICghY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKKworICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgdGhlIEF1ZGlvRmlmbyB0byBwcm90ZWN0IGFnYWluc3QgY2xvc2UuCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpKTsKKworICAgICAgICAgICAgICAgICAgICBGaWZvQnVmZmVyICpmaWZvID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8gIT0gbnVsbHB0cikgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgb2Zmc2V0IGJldHdlZW4gZnJhbWVQb3NpdGlvbiBpbiBjbGllbnQncyBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzUmVhZCA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSB0d28gaW5kaWNlcyByZWZlciB0byB0aGUgc2FtZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25PZmZzZXQgPSBtbWFwRnJhbWVzV3JpdHRlbiAtIGNsaWVudEZyYW1lc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lID0gMS4wOyAvLyB0byBtYXRjaCBsZWdhY3kgdm9sdW1lCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVuZGVyZmxvd2VkID0gbU1peGVyLm1peChpbmRleCwgZmlmbywgdm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlcmZsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNSZWFkID0gZmlmby0+Z2V0UmVhZENvdW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjbGllbnRGcmFtZXNSZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCByZXByZXNlbnRzIHRoZSBjb21wbGV0aW9uIG9mIGRhdGEgYmVpbmcgcmVhZCBvdXQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBidWZmZXIuIEl0IGlzIHNlbnQgdG8gdGhlIGNsaWVudCBhbmQgdXNlZCBpbiB0aGUgdGltaW5nIG1vZGVsCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRlY2lkZSB3aGVuIHRoZSBjbGllbnQgaGFzIHJvb20gdG8gd3JpdGUgbW9yZSBkYXRhLgorICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1JlYWQsIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPm1hcmtUcmFuc2ZlclRpbWUodGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbmRleCsrOyAvLyBqdXN0IHVzZWQgZm9yIGxhYmVsbGluZyB0cmFja3MgaW4gc3lzdHJhY2UKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC05Myw3ICsxMjksNyBAQAogICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT53cml0ZShtTWl4ZXIuZ2V0T3V0cHV0QnVmZmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCksIHRpbWVvdXROYW5vcyk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTogY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCkBAIC0xMDIsOCArMTM4LDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dXX0lGKCh1bmRlcmZsb3dDb3VudCA+IDApLAotICAgICAgICAgICAgICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk6IGNhbGxiYWNrTG9vcCgpIGhhZCAlZCB1bmRlcmZsb3dzIiwgdW5kZXJmbG93Q291bnQpOwotCiAgICAgcmV0dXJuIE5VTEw7IC8vIFRPRE8gcmV2aWV3CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYzIyZjUxMC4uYTBhMzgzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb01peGVyLmgiCkBAIC0zNSwxNiArMzYsMTIgQEAKIC8qKgogICogQ29udGFpbnMgYSBtaXhlciBhbmQgYSBzdHJlYW0gZm9yIHdyaXRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWl4LgogICovCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5IDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOwotCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAqZ2V0U3RyZWFtSW50ZXJuYWwoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiAmbVN0cmVhbUludGVybmFsUGxheTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAogICAgIHZvaWQgKmNhbGxiYWNrTG9vcCgpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQwMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKKyNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgorCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKKworLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIGluIGZyYW1lcy4gVGhlIGVmZmVjdGl2ZSBzaXplIGNhbiBiZSB0dW5lZCBzbWFsbGVyIGF0IHJ1bnRpbWUuCisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZICAgKDQ4ICogOCkKKworc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCAiICBTSEFSRUQ6IHNoYXJpbmcgZXhjbHVzaXZlIHN0cmVhbSB3aXRoIGhhbmRsZSA9IDB4IgorICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkKKyAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbVN0cmVhbUludGVybmFsLT5nZXRTZXJ2aWNlSGFuZGxlKCkKKyAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJyk7CisgICAgcmVzdWx0IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUnVubmluZyBTdHJlYW0gQ291bnQ6ICIgPDwgbVJ1bm5pbmdTdHJlYW1Db3VudCA8PCAiXG4iOworCisgICAgcmVzdWx0IDw8IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpOworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8vIFNoYXJlIGFuIEF1ZGlvU3RyZWFtSW50ZXJuYWwuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7CisKKyAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCk7CisgICAgc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworCisgICAgQXVkaW9TdHJlYW1CdWlsZGVyIGJ1aWxkZXI7CisgICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CisgICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgorICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOworICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKKyAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKKyAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOworICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworICAgIGJ1aWxkZXIuc2V0QnVmZmVyQ2FwYWNpdHkoREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkpOworCisgICAgcmVzdWx0ID0gbVN0cmVhbUludGVybmFsLT5vcGVuKGJ1aWxkZXIpOworCisgICAgc2V0U2FtcGxlUmF0ZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Y2xvc2UoKSB7CisgICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmNsb3NlKCk7Cit9CisKKy8vIEdsdWUgYmV0d2VlbiBDIGFuZCBDKysgY2FsbGJhY2tzLgorc3RhdGljIHZvaWQgKmFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYyh2b2lkICpjb250ZXh0KSB7CisgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkICplbmRwb2ludCA9IChBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKikgY29udGV4dDsKKyAgICBpZiAoZW5kcG9pbnQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworYWF1ZGlvX3Jlc3VsdF90IGFhdWRpbzo6QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpzdGFydFNoYXJpbmdUaHJlYWRfbCgpIHsKKyAgICAvLyBMYXVuY2ggdGhlIGNhbGxiYWNrIGxvb3AgdGhyZWFkLgorICAgIGludDY0X3QgcGVyaW9kTmFub3MgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNQZXJCdXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKKyAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y3JlYXRlVGhyZWFkKHBlcmlvZE5hbm9zLCBhYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2MsIHRoaXMpOworfQorCithYXVkaW9fcmVzdWx0X3QgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0b3BTaGFyaW5nVGhyZWFkKCkgeworICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5qb2luVGhyZWFkKE5VTEwpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzaGFyZWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgICAgICBpZiAoKyttUnVubmluZ1N0cmVhbUNvdW50ID09IDEpIHsgLy8gYXRvbWljCisgICAgICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgLS1tUnVubmluZ1N0cmVhbUNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIC0tbVJ1bm5pbmdTdHJlYW1Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5zdGFydENsaWVudChzaGFyZWRTdHJlYW0tPmdldEF1ZGlvQ2xpZW50KCksIGNsaWVudEhhbmRsZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBpZiAoLS1tUnVubmluZ1N0cmVhbUNvdW50ID09IDApIHsgLy8gYXRvbWljCisgICAgICAgICAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2hhcmVkU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgIC8vIERvbid0IGxvY2sgaGVyZSBiZWNhdXNlIHRoZSBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMgYWxzbyB1c2VzIHRoZSBsb2NrLgorCisgICAgLy8gSWdub3JlIHJlc3VsdC4KKyAgICAodm9pZCkgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworCisgICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAwKSB7IC8vIGF0b21pYworICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCisvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIHJlYWwtdGltZSBzZXJ2aWNlIHRocmVhZCwgZWcuIG1peGVyLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICByZXR1cm4gbVN0cmVhbUludGVybmFsLT5nZXRUaW1lc3RhbXAoQ0xPQ0tfTU9OT1RPTklDLCBwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiZDJjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICisjZGVmaW5lIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgorI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFhdWRpbyB7CisKKy8qKgorICogVGhpcyBTZXJ2aWNlIGNsYXNzIGNvcnJlc3BvbmRzIHRvIGEgQ2xpZW50IHN0cmVhbSB0aGF0IHNoYXJlcyBhbiBNTUFQIGRldmljZSB0aHJvdWdoIGEgbWl4ZXIKKyAqIG9yIGFuIGlucHV0IGRpc3RyaWJ1dG9yLgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50IHsKKworcHVibGljOgorCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICpjYWxsYmFja0xvb3AoKSA9IDA7CisKKyAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbDsKKyAgICB9OworCitwcm90ZWN0ZWQ6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworCisgICAgLy8gcG9pbnRlciB0byBvYmplY3Qgc3RhdGljYWxseSBhbGxvY2F0ZWQgaW4gc3ViY2xhc3NlcworICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgICAgICptU3RyZWFtSW50ZXJuYWwgPSBudWxscHRyOworCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworCisgICAgc3RkOjphdG9taWM8aW50PiAgICAgICAgIG1SdW5uaW5nU3RyZWFtQ291bnR7MH07Cit9OworCit9CisKKyNlbmRpZiAvL0FBVURJT19TRVJWSUNFX0VORFBPSU5UX1NIQVJFRF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKaW5kZXggNWY3ZDE3OS4uZDliODc2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcApAQCAtMTgsMTIgKzE4LDE3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPG11dGV4PgogCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAorI2luY2x1ZGUgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgogI2luY2x1ZGUgIlRpbWVzdGFtcFNjaGVkdWxlci5oIgogCkBAIC0zNSw5ICs0MCwxMSBAQAogICogQHJldHVybgogICovCiAKLUFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpCitBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZShudWxscHRyKQotICAgICAgICAsIG1BQXVkaW9UaHJlYWQoKSB7CisgICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgpCisgICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCisgICAgICAgICwgbUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHsKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZSA9IFN0cmluZzE2KCIiKTsKQEAgLTQ3LDYxICs1NCwxNTMgQEAKICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6On5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVECi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2Ugc3RyZWFtIHN0aWxsIG9wZW4sIHN0YXRlID0gJWQiLCBtU3RhdGUpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZSBzdHJlYW0gc3RpbGwgb3Blbiwgc3RhdGUgPSAlZCIsIGdldFN0YXRlKCkpOworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiAgICBUICAgSGFuZGxlICAgVUlkIFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOwogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKLSAgICByZXN1bHQgPDwgIiAgICAgIC0tLS0tLS0tIGhhbmRsZSA9IDB4IiA8PCBzdGQ6OmhleCA8PCBtSGFuZGxlIDw8IHN0ZDo6ZGVjIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBzdGF0ZSAgICAgICAgICA9ICIgPDwgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChtU3RhdGUpIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBmb3JtYXQgICAgICAgICA9ICIgPDwgbUF1ZGlvRm9ybWF0IDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBmcmFtZXNQZXJCdXJzdCA9ICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBjaGFubmVsQ291bnQgICA9ICIgPDwgbVNhbXBsZXNQZXJGcmFtZSA8PCAiXG4iOwotICAgIHJlc3VsdCA8PCAiICAgICAgY2FwYWNpdHlGcmFtZXMgPSAiIDw8IG1DYXBhY2l0eUluRnJhbWVzIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBvd25lciB1aWQgICAgICA9ICIgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleCA8PCBtSGFuZGxlCisgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpIDsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDYpIDw8IG1NbWFwQ2xpZW50LmNsaWVudFVpZDsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDQpIDw8IChpc1J1bm5pbmcoKSA/ICJ5ZXMiIDogIiBubyIpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0U3RhdGUoKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDcpIDw8IGdldEZvcm1hdCgpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbUZyYW1lc1BlckJ1cnN0OworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNSkgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg5KSA8PCBnZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgIG1NbWFwQ2xpZW50LnBhY2thZ2VOYW1lLnNldFRvKFN0cmluZzE2KCIiKSk7IC8vIEZJWE1FIHdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/CisgICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUuc2V0VG8oU3RyaW5nMTYoIiIpKTsgLy8gVE9ETyBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPwogCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tVcE1lc3NhZ2VRdWV1ZSk7Ci0gICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9IGVsc2UgeworICAgIC8vIExpbWl0IHNjb3BlIG9mIGxvY2sgdG8gYXZvaWQgcmVjdXJzaXZlIGxvY2sgaW4gY2xvc2UoKS4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOworICAgICAgICBpZiAobVVwTWVzc2FnZVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbigpIGNhbGxlZCB0d2ljZSIpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICB9CisKICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbmV3IFNoYXJlZFJpbmdCdWZmZXIoKTsKLSAgICAgICAgcmV0dXJuIG1VcE1lc3NhZ2VRdWV1ZS0+YWxsb2NhdGUoc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSwgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMpOworICAgICAgICByZXN1bHQgPSBtVXBNZXNzYWdlUXVldWUtPmFsbG9jYXRlKHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgbm90IHByb3RlY3RlZCBieSBhIGxvY2sgYmVjYXVzZSB0aGUgc3RyZWFtIGNhbm5vdCBiZQorICAgICAgICAvLyByZWZlcmVuY2VkIHVudGlsIHRoZSBzZXJ2aWNlIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGNsaWVudC4KKyAgICAgICAgLy8gU28gb25seSBvbmUgdGhyZWFkIGNhbiBvcGVuIGEgc3RyZWFtLgorICAgICAgICBtU2VydmljZUVuZHBvaW50ID0gbUVuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQobUF1ZGlvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSk7CisgICAgICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbigpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvLyBTYXZlIGEgd2VhayBwb2ludGVyIHRoYXQgd2Ugd2lsbCB1c2UgdG8gYWNjZXNzIHRoZSBlbmRwb2ludC4KKyAgICAgICAgbVNlcnZpY2VFbmRwb2ludFdlYWsgPSBtU2VydmljZUVuZHBvaW50OworCisgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgICAgIGNvcHlGcm9tKCptU2VydmljZUVuZHBvaW50KTsKICAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCkgewotICAgIGlmIChtU3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfQorCisgICAgc3RvcCgpOworCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbmRwb2ludC0+dW5yZWdpc3RlclN0cmVhbSh0aGlzKTsKKyAgICAgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZlbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGVuZHBvaW50TWFuYWdlci5jbG9zZUVuZHBvaW50KGVuZHBvaW50KTsKKworICAgICAgICAvLyBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgpIHByZXZlbnRzIHR3byB0aHJlYWRzIGZyb20gY2xvc2luZyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB1bnRpbCB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgIH0KKworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICAgICAgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1VwTWVzc2FnZVF1ZXVlKTsKICAgICAgICAgZGVsZXRlIG1VcE1lc3NhZ2VRdWV1ZTsKICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ7CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydERldmljZSgpIHsKKyAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICByZXR1cm4gZW5kcG9pbnQtPnN0YXJ0U3RyZWFtKHRoaXMsICZtQ2xpZW50SGFuZGxlKTsKK30KKworLyoqCisgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgorICoKKyAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KKyAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworCiAgICAgaWYgKGlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQorCisgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KKyAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisKKyAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICByZXN1bHQgPSBzdGFydERldmljZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSBnb3RvIGVycm9yOworCisgICAgLy8gVGhpcyBzaG91bGQgaGFwcGVuIGF0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0LgogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgbVRocmVhZEVuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgcmV0dXJuIG1BQXVkaW9UaHJlYWQuc3RhcnQodGhpcyk7CisgICAgcmVzdWx0ID0gbVRpbWVzdGFtcFRocmVhZC5zdGFydCh0aGlzKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgZ290byBlcnJvcjsKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIGRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCkgewpAQCAtMTA5LDE1ICsyMDgsMzAgQEAKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorCisgICAgLy8gU2VuZCBpdCBub3cgYmVjYXVzZSB0aGUgdGltZXN0YW1wIGdldHMgcm91bmRlZCB1cCB3aGVuIHN0b3BTdHJlYW0oKSBpcyBjYWxsZWQgYmVsb3cuCisgICAgLy8gQWxzbyB3ZSBkb24ndCBuZWVkIHRoZSB0aW1lc3RhbXBzIHdoaWxlIHdlIGFyZSBzaHV0dGluZyBkb3duLgogICAgIHNlbmRDdXJyZW50VGltZXN0YW1wKCk7Ci0gICAgbVRocmVhZEVuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIHJlc3VsdCA9IG1BQXVkaW9UaHJlYWQuc3RvcCgpOworCisgICAgcmVzdWx0ID0gc3RvcFRpbWVzdGFtcFRocmVhZCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICByZXN1bHQgPSBlbmRwb2ludC0+c3RvcFN0cmVhbSh0aGlzLCBtQ2xpZW50SGFuZGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6cGF1c2UoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgZGlzY29ubmVjdCgpOyAvLyBUT0RPIHNob3VsZCB3ZSByZXR1cm4gb3IgcGF1c2UgQmFzZSBmaXJzdD8KKyAgICB9CisKICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ7CisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTEyNiwxNSArMjQwLDMxIEBACiAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAvLyBUT0RPIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkIG91dAorCisgICAgLy8gU2VuZCBpdCBub3cgYmVjYXVzZSB0aGUgdGltZXN0YW1wIGdldHMgcm91bmRlZCB1cCB3aGVuIHN0b3BTdHJlYW0oKSBpcyBjYWxsZWQgYmVsb3cuCisgICAgLy8gQWxzbyB3ZSBkb24ndCBuZWVkIHRoZSB0aW1lc3RhbXBzIHdoaWxlIHdlIGFyZSBzaHV0dGluZyBkb3duLgogICAgIHNlbmRDdXJyZW50VGltZXN0YW1wKCk7IC8vIHdhcm5pbmcgLSB0aGlzIGNhbGxzIGEgdmlydHVhbCBmdW5jdGlvbgogICAgIHJlc3VsdCA9IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgLy8gVE9ETyB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCBvdXQKKyAgICByZXN1bHQgPSBlbmRwb2ludC0+c3RvcFN0cmVhbSh0aGlzLCBtQ2xpZW50SGFuZGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RvcCgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgIC8vIFRPRE8gd2hhdCB0byBkbyB3aXRoIHJlc3VsdCBoZXJlPworICAgIH0KKwogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCk7Ci0gICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEOworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTQyLDE0ICsyNzIsMjAgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIC8vIGNsZWFyIGZsYWcgdGhhdCB0ZWxscyB0aHJlYWQgdG8gbG9vcAogICAgIGlmIChtVGhyZWFkRW5hYmxlZC5leGNoYW5nZShmYWxzZSkpIHsKLSAgICAgICAgcmVzdWx0ID0gbUFBdWRpb1RocmVhZC5zdG9wKCk7CisgICAgICAgIHJlc3VsdCA9IG1UaW1lc3RhbXBUaHJlYWQuc3RvcCgpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKSBzdHJlYW0gbm90IHBhdXNlZCwgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQobVN0YXRlKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgLy8gRGF0YSB3aWxsIGdldCBmbHVzaGVkIHdoZW4gdGhlIGNsaWVudCByZWNlaXZlcyB0aGUgRkxVU0hFRCBldmVudC4KICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQpOwotICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRDsKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTE1Nyw3ICsyOTMsNyBAQAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewogICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgZW50ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7Ci0gICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgbVNhbXBsZVJhdGUpOworICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zZXRCdXJzdFBlcmlvZChtRnJhbWVzUGVyQnVyc3QsIGdldFNhbXBsZVJhdGUoKSk7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnN0YXJ0KEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIGludDY0X3QgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwogICAgIHdoaWxlKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgewpAQCAtMTc3LDkgKzMxMyw5IEBACiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICB9CiB9CiAKQEAgLTE5NSw3ICszMzEsNyBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OndyaXRlVXBNZXNzYWdlUXVldWUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKmNvbW1hbmQpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1VwTWVzc2FnZVF1ZXVlKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICBpZiAobVVwTWVzc2FnZVF1ZXVlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIndyaXRlVXBNZXNzYWdlUXVldWUoKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKQEAgLTIxMSwxNSArMzQ3LDMxIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZEN1cnJlbnRUaW1lc3RhbXAoKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKKyAgICAvLyBTZW5kIGEgdGltZXN0YW1wIGZvciB0aGUgY2xvY2sgbW9kZWwuCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgLy8gICAgQUxPR0QoInNlbmRDdXJyZW50VGltZXN0YW1wKCk6IHBvc2l0aW9uID0gJWxsZCwgbmFub3MgPSAlbGxkIiwKLSAgICAvLyAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKLSAgICAvLyAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOwotICAgICAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QOworICAgICAgICBBTE9HVigic2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBTRVJWSUNFICAlOGxsZCBhdCAlbGxkIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCisgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgICAgIGNvbW1hbmQud2hhdCA9IEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpUSU1FU1RBTVBfU0VSVklDRTsKICAgICAgICAgcmVzdWx0ID0gd3JpdGVVcE1lc3NhZ2VRdWV1ZSgmY29tbWFuZCk7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIC8vIFNlbmQgYSBoYXJkd2FyZSB0aW1lc3RhbXAgZm9yIHByZXNlbnRhdGlvbiB0aW1lLgorICAgICAgICAgICAgcmVzdWx0ID0gZ2V0SGFyZHdhcmVUaW1lc3RhbXAoJmNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpIEhBUkRXQVJFICU4bGxkIGF0ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9IQVJEV0FSRTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB3cml0ZVVwTWVzc2FnZVF1ZXVlKCZjb21tYW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7IC8vIFRPRE8gcmV2aWV3IGJlc3QgZXJyb3IgY29kZQogICAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7IC8vIGp1c3Qgbm90IGF2YWlsYWJsZSB5ZXQsIHRyeSBhZ2FpbiBsYXRlcgogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjMwLDggKzM4MiwxOSBAQAogICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgogICovCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmdldERlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7Ci0gICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtZXNzYWdlIHF1ZXVlLgotICAgIG1VcE1lc3NhZ2VRdWV1ZS0+ZmlsbFBhcmNlbGFibGUocGFyY2VsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUubVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSk7Ci0gICAgcmV0dXJuIGdldERvd25EYXRhRGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0RGVzY3JpcHRpb24oKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtZXNzYWdlIHF1ZXVlLgorICAgICAgICBtVXBNZXNzYWdlUXVldWUtPmZpbGxQYXJjZWxhYmxlKHBhcmNlbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5tVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKTsKKyAgICB9CisgICAgcmV0dXJuIGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKHBhcmNlbGFibGUpOworfQorCit2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvblZvbHVtZUNoYW5nZWQoZmxvYXQgdm9sdW1lKSB7CisgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsIHZvbHVtZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCBjZWJlZmVjLi44MTViMWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxtdXRleD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCkBAIC0yNyw3MSArMjgsOTcgQEAKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KKyNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAogI2luY2x1ZGUgIlNoYXJlZFJpbmdCdWZmZXIuaCIKICNpbmNsdWRlICJBQXVkaW9UaHJlYWQuaCIKIAorbmFtZXNwYWNlIGFuZHJvaWQgeworICAgIGNsYXNzIEFBdWRpb1NlcnZpY2U7Cit9CisKIG5hbWVzcGFjZSBhYXVkaW8gewogCitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ7CisKIC8vIFdlIGV4cGVjdCB0aGUgcXVldWUgdG8gb25seSBoYXZlIGEgZmV3IGNvbW1hbmRzLgogLy8gVGhpcyBzaG91bGQgYmUgd2F5IG1vcmUgdGhhbiB3ZSBuZWVkLgogI2RlZmluZSBRVUVVRV9VUF9DQVBBQ0lUWV9DT01NQU5EUyAoMTI4KQogCiAvKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgc3RyZWFtIGluIHRoZSBBQXVkaW8gc2VydmljZS4KKyAqIEVhY2ggaW5zdGFuY2Ugb2YgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgY29ycmVzcG9uZHMgdG8gYSBjbGllbnQgc3RyZWFtLgorICogSXQgdXNlcyBhIHN1YmNsYXNzIG9mIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIGRldmljZSBvciBwb3J0LgogICovCiBjbGFzcyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZQogICAgIDogcHVibGljIHZpcnR1YWwgYW5kcm9pZDo6UmVmQmFzZQorICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMKICAgICAsIHB1YmxpYyBSdW5uYWJsZSAgewogCiBwdWJsaWM6Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKTsKKyAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKKwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCk7CiAKICAgICBlbnVtIHsKICAgICAgICAgSUxMRUdBTF9USFJFQURfSUQgPSAwCiAgICAgfTsKIAotICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhlYWRlcigpOworCisgICAgLy8gZG9lcyBub3QgaW5jbHVkZSBFT0wKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvKioKICAgICAgKiBPcGVuIHRoZSBkZXZpY2UuCiAgICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgPSAwOwogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKTsKIAogICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCisgICAgICogU3RhcnQgdGhlIGZsb3cgb2YgYXVkaW8gZGF0YS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KKyAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKTsKIAogICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGggbG9zcyBvZiBkYXRhLgotICAgICAqLworICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KKyAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KKyAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCk7CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgYWZ0ZXIgZGF0YSBpbiBidWZmZXIgaGFzIHBsYXllZC4KKyAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgYWZ0ZXIgdGhlIGN1cnJlbnRseSBxdWV1ZWQgZGF0YSBoYXMgZmluaXNoZWQgcGxheWluZy4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KKyAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCisgICAgICoKICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wKCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwogCiAgICAgLyoqCi0gICAgICogIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KKyAgICAgKiBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKTsKIAorCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydENsaWVudCglcCwgLi4uKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiLCAmY2xpZW50KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlIF9fdW51c2VkKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcENsaWVudCglZCkgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIiwgY2xpZW50SGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKQEAgLTEyNiwxNCArMTUzLDE0IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgfQogCi0gICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhtQXVkaW9Gb3JtYXQpOwotICAgIH0KLQogICAgIHZvaWQgcnVuKCkgb3ZlcnJpZGU7IC8vIHRvIGltcGxlbWVudCBSdW5uYWJsZQogCiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKKyAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCAmZ2V0QXVkaW9DbGllbnQoKSB7CisgICAgICAgIHJldHVybiBtTW1hcENsaWVudDsKKyAgICB9CisKICAgICB1aWRfdCBnZXRPd25lclVzZXJJZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1NbWFwQ2xpZW50LmNsaWVudFVpZDsKICAgICB9CkBAIC0xNTMsMTIgKzE4MCwyNiBAQAogICAgICAgICByZXR1cm4gbVN0YXRlOwogICAgIH0KIAorICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGZsb2F0IHZvbHVtZSk7CisKIHByb3RlY3RlZDoKIAorICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRldmljZS4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKwogICAgIHZvaWQgc2V0U3RhdGUoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKSB7CiAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIERldmljZSBzcGVjaWZpYyBzdGFydHVwLgorICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIG5lZ2F0aXZlIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0RGV2aWNlKCk7CisKICAgICBhYXVkaW9fcmVzdWx0X3Qgd3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKQEAgLTE3MCwyNyArMjExLDM1IEBACiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpID0gMDsKIAogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkQ2xpZW50VGhyZWFkID0gSUxMRUdBTF9USFJFQURfSUQ7CiAKICAgICBTaGFyZWRSaW5nQnVmZmVyKiAgICAgICBtVXBNZXNzYWdlUXVldWU7Ci0gICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbUxvY2tVcE1lc3NhZ2VRdWV1ZTsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtVXBNZXNzYWdlUXVldWVMb2NrOwogCi0gICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbUFBdWRpb1RocmVhZDsKKyAgICBBQXVkaW9UaHJlYWQgICAgICAgICAgICBtVGltZXN0YW1wVGhyZWFkOwogICAgIC8vIFRoaXMgaXMgdXNlZCBieSBvbmUgdGhyZWFkIHRvIHRlbGwgYW5vdGhlciB0aHJlYWQgdG8gZXhpdC4gU28gaXQgbXVzdCBiZSBhdG9taWMuCi0gICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVRocmVhZEVuYWJsZWQ7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVRocmVhZEVuYWJsZWR7ZmFsc2V9OwogCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgbUF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSAwOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgbU1tYXBDbGllbnQ7CisgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgbU1tYXBDbGllbnQ7IC8vIHNldCBpbiBvcGVuLCB1c2VkIGluIE1NQVAgc3RhcnQoKQogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisKKyAgICBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZtQXVkaW9TZXJ2aWNlOworCisgICAgLy8gVGhlIG1TZXJ2aWNlRW5kcG9pbnQgdmFyaWFibGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuCisgICAgLy8gU28gd2UgYWNjZXNzIGl0IGJ5IGxvY2FsbHkgcHJvbW90aW5nIGEgd2VhayBwb2ludGVyIHRvIGEgc21hcnQgcG9pbnRlciwKKyAgICAvLyB3aGljaCBpcyB0aHJlYWQtc2FmZS4KKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG1TZXJ2aWNlRW5kcG9pbnQ7CisgICAgYW5kcm9pZDo6d3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBtU2VydmljZUVuZHBvaW50V2VhazsKKwogcHJpdmF0ZToKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDA4ZGQ2ODAuLjJlN2ZmOGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTE5LDIyNSArMTksODEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmg+CiAKKyNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCisjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCi0jaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgIlNoYXJlZE1lbW9yeVByb3h5LmgiCi0jaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0jZGVmaW5lIEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOICAgIDQgKiA1MTIKLSNkZWZpbmUgQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQgICAgNDgwMDAKLQogLyoqCiAgKiBTZXJ2aWNlIFN0cmVhbSB0aGF0IHVzZXMgYW4gTU1BUCBidWZmZXIuCiAgKi8KIAotQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBzZXJ2aWNlQ2xpZW50LAorQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpblNlcnZpY2UpCi0gICAgICAgIDogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKQotICAgICAgICAsIG1NbWFwU3RyZWFtQ2FsbGJhY2sobmV3IE15TW1hcFN0cmVhbUNhbGxiYWNrKCp0aGlzKSkKLSAgICAgICAgLCBtUHJldmlvdXNGcmFtZUNvdW50ZXIoMCkKLSAgICAgICAgLCBtTW1hcFN0cmVhbShudWxscHRyKQotICAgICAgICAsIG1TZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpCisgICAgICAgIDogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoYUF1ZGlvU2VydmljZSkKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkgewogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmNsb3NlKCkgewotICAgIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KKwogICAgIHN0b3AoKTsKLSAgICBpZiAobU1tYXBTdHJlYW0gIT0gMCkgewotICAgICAgICBtTW1hcFN0cmVhbS5jbGVhcigpOyAvLyBUT0RPIHJldmlldy4gSXMgdGhhdCBhbGwgd2UgaGF2ZSB0byBkbz8KLSAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgYWJvdmUgY2xvc2UgaXMgYXN5bmNocm9ub3VzLiBBbiBhdHRlbXB0IHRvIG9wZW4gYSBuZXcgZGV2aWNlCi0gICAgICAgIC8vIHJpZ2h0IGFmdGVyIGEgY2xvc2UgY2FuIGZhaWwuIEFsc28gc29tZSBjYWxsYmFja3MgbWF5IHN0aWxsIGJlIGluIGZsaWdodCEKLSAgICAgICAgLy8gRklYTUUgTWFrZSBjbG9zaW5nIHN5bmNocm9ub3VzLgotICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcEZvck5hbm9zKDEwMCAqIEFBVURJT19OQU5PU19QRVJfTUlMTElTRUNPTkQpOwotICAgIH0KIAogICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKTsKIH0KIAogLy8gT3BlbiBzdHJlYW0gb24gSEFMIGFuZCBwYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBiYWNrIHRvIHRoZSBjbGllbnQuCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7Ci0gICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7Ci0gICAgICAgIC5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgIC51c2FnZSA9IEFVRElPX1VTQUdFX01FRElBLAotICAgICAgICAuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLAotICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAotICAgICAgICAudGFncyA9ICIiCi0gICAgfTsKLSAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUD4ga2VlcCh0aGlzKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlIG9wZW4gcmV0dXJuZWQgJWQiLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25JbnB1dCA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXREZXZpY2VJZCgpOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCi0gICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gY29uZmlndXJhdGlvbklucHV0LmdldEZvcm1hdCgpOwotICAgIGlmIChhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7Ci0gICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLQotICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIGFhdWRpb1NhbXBsZVJhdGUgPSBBQVVESU9fU0FNUExFX1JBVEVfREVGQVVMVDsKLSAgICB9Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gYWF1ZGlvU2FtcGxlUmF0ZTsKLQotICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlc1BlckZyYW1lID0gY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwotCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwotICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICAoYWF1ZGlvU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuTW1hcFN0cmVhbSAtIGludmFsaWQgZGlyZWN0aW9uID0gJWQiLCBkaXJlY3Rpb24pOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICBNbWFwU3RyZWFtSW50ZXJmYWNlOjpzdHJlYW1fZGlyZWN0aW9uX3Qgc3RyZWFtRGlyZWN0aW9uID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKLSAgICAgICAgPyBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUIDogTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX0lOUFVUOwotCi0gICAgLy8gT3BlbiBIQUwgc3RyZWFtLgotICAgIHN0YXR1c190IHN0YXR1cyA9IE1tYXBTdHJlYW1JbnRlcmZhY2U6Om9wZW5NbWFwU3RyZWFtKHN0cmVhbURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUG9ydEhhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICByZXN1bHQgPSBlbmRwb2ludC0+cmVnaXN0ZXJTdHJlYW0oa2VlcCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3BlbigpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIE1NQVAvTk9JUlEgYnVmZmVyLgotICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRCdWZmZXJDYXBhY2l0eSgpOwotICAgIGlmIChtaW5TaXplRnJhbWVzIDw9IDApIHsgLy8gemVybyB3aWxsIGdldCByZWplY3RlZAotICAgICAgICBtaW5TaXplRnJhbWVzID0gQUFVRElPX0JVRkZFUl9DQVBBQ0lUWV9NSU47Ci0gICAgfQotICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiY3JlYXRlTW1hcEJ1ZmZlciBzdGF0dXMgPSAlZCwgYnVmZmVyX3NpemUgPSAlZCwgYnVyc3Rfc2l6ZSAlZCIKLSAgICAgICAgICAgICAgICAiLCBTaGFyYWJsZSBGRDogJXMiLAotICAgICAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgICAgIGFicyhtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKSwKLSAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzIDwgMCA/ICJZZXMiIDogIk5vIik7Ci0gICAgfQotCi0gICAgbUNhcGFjaXR5SW5GcmFtZXMgPSBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzOwotICAgIC8vIEZJWE1FOiB0aGUgYXVkaW8gSEFMIGluZGljYXRlcyBpZiB0aGUgc2hhcmVkIG1lbW9yeSBmZCBjYW4gYmUgc2hhcmVkIG91dHNpZGUgb2YgYXVkaW9zZXJ2ZXIKLSAgICAvLyBieSByZXR1cm5pbmcgYSBuZWdhdGl2ZSBidWZmZXIgc2l6ZQotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA8IDApIHsKLSAgICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgaXMgcG9zc2libGUgZnJvbSBhbnkgY2xpZW50Ci0gICAgICAgIG1DYXBhY2l0eUluRnJhbWVzID0gLW1DYXBhY2l0eUluRnJhbWVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGV4Y2x1c2l2ZSBtb2RlIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIGZpbmFsIGZkIGRlc3RpbmF0aW9uIGlzIGluc2lkZSBhdWRpb3NlcnZlcgotICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmNsaWVudFVpZCAhPSBtU2VydmljZUNsaWVudC5jbGllbnRVaWQpICYmCi0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbklucHV0LmdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmVhbSBhbmQgcGFzcyBpdCBiYWNrIHRvIHRoZSBjYWxsZXIuCi0gICAgbVNhbXBsZXNQZXJGcmFtZSA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKTsKLQotICAgIC8vIEFBdWRpbyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIEZEIGFuZCByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgY29weS4KLSAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KLSAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7Ci0gICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oKSAtIGNvdWxkIG5vdCBkdXAgc2hhcmVkX21lbW9yeV9mZCIpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOyAvLyBUT0RPIHJldmlldwotICAgIH0KLSAgICBtRnJhbWVzUGVyQnVyc3QgPSBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXM7Ci0gICAgbUF1ZGlvRm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpOwotICAgIG1TYW1wbGVSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCi0gICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KLSAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIHdha2luZyB0aGUgQ1BVIHRvbyBvZnRlbiB3aGVuIHRoZSBIVyBidXJzdCBpcyB2ZXJ5IHNtYWxsCi0gICAgLy8gb3IgYXQgaGlnaCBzYW1wbGUgcmF0ZXMuCi0gICAgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKLSAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChidXJzdE1pY3JvcyA+IDApIHsgIC8vIHNraXAgZmlyc3QgbG9vcAotICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ICo9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgYnVyc3RNaWNyb3MgPSBtRnJhbWVzUGVyQnVyc3QgKiBzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSAvIG1TYW1wbGVSYXRlOwotICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOwotCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKCkgb3JpZ2luYWwgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQsIGZpbmFsIGJ1cnN0ID0gJWRcbiIsCi0gICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKLQotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWRcbiIsCi0gICAgICAgICAgbVNhbXBsZVJhdGUsIG1TYW1wbGVzUGVyRnJhbWUsIGRldmljZUlkKTsKLQotICAgIC8vIEZpbGwgaW4gQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbgotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTYW1wbGVzUGVyRnJhbWUobVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRGb3JtYXQobUF1ZGlvRm9ybWF0KTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldERldmljZUlkKGRldmljZUlkKTsKLQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CisKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiAvKioKICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RhcnQoKSB7Ci0gICAgaWYgKGlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQobVNlcnZpY2VDbGllbnQsICZtUG9ydEhhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0KCkgbU1tYXBTdHJlYW0tPnN0YXJ0KCkgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCk7Ci0gICAgICAgIGlmICghbUluU2VydmljZSAmJiByZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBzdGFydENsaWVudChtTW1hcENsaWVudCwgJm1DbGllbnRIYW5kbGUpOwotICAgICAgICB9CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0RGV2aWNlKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKTsKKyAgICBpZiAoIW1JblNlcnZpY2UgJiYgcmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYW4gc29tZXRpbWVzIHRha2UgMjAwIHRvIDMwMCBtc2VjIGZvciBhIGNvbGQgc3RhcnQhCisgICAgICAgIHJlc3VsdCA9IHN0YXJ0Q2xpZW50KG1NbWFwQ2xpZW50LCAmbUNsaWVudEhhbmRsZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yNDksMTA0ICsxMDUsMTA2IEBACiAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KLSAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQxID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpwYXVzZSgpOworICAgIC8vIFRPRE8gcHV0IGJlZm9yZSBiYXNlOjpwYXVzZSgpPwogICAgIGlmICghbUluU2VydmljZSkgewotICAgICAgICBzdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOworICAgICAgICAodm9pZCkgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPnN0b3AobVBvcnRIYW5kbGUpOwotICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsKLSAgICByZXR1cm4gKHJlc3VsdDEgIT0gQUFVRElPX09LKSA/IHJlc3VsdDEgOiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RvcCgpIHsKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQotICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDEgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcCgpOworICAgIC8vIFRPRE8gcHV0IGJlZm9yZSBiYXNlOjpzdG9wKCk/CiAgICAgaWYgKCFtSW5TZXJ2aWNlKSB7Ci0gICAgICAgIHN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7Ci0gICAgfQotICAgIGFhdWRpb19yZXN1bHRfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RvcChtUG9ydEhhbmRsZSk7Ci0gICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOwotICAgIHJldHVybiAocmVzdWx0MSAhPSBBQVVESU9fT0spID8gcmVzdWx0MSA6ICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotfQotCi0vKioKLSAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCi0gKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKLSAgICAvLyBUT0RPIGhvdyBkbyB3ZSBmbHVzaCBhbiBNTUFQL05PSVJRIGJ1ZmZlcj8gc3luYyBwb2ludGVycz8KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCk7OwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gcG9zaXRpb247Ci0gICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKLSAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewotICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgeWV0Iik7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZyYW1lc1JlYWQudXBkYXRlMzIocG9zaXRpb24ucG9zaXRpb25fZnJhbWVzKTsKLSAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gbUZyYW1lc1JlYWQuZ2V0KCk7Ci0gICAgICAgICp0aW1lTmFub3MgPSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzOworICAgICAgICAodm9pZCkgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25UZWFyRG93bigpIHsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKLSAgICBkaXNjb25uZWN0KCk7Ci19OworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CisgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgb24gYmVoYWxmIG9mIHRoZSBhcHBsaWNhdGlvbi4gR2VuZXJhdGUgYSBuZXcgcG9ydGhhbmRsZS4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPnN0YXJ0Q2xpZW50KGNsaWVudCwgY2xpZW50SGFuZGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCi12b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvblZvbHVtZUNoYW5nZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgewotICAgIC8vIFRPRE8gZG8gd2UgcmVhbGx5IG5lZWQgYSBkaWZmZXJlbnQgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWw/Ci0gICAgZmxvYXQgdm9sdW1lID0gdmFsdWVzWzBdOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25Wb2x1bWVDaGFuZ2VkKCkgdm9sdW1lWzBdID0gJWYiLCB2b2x1bWUpOwotICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FLCB2b2x1bWUpOwotfTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CisgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CiAKLXZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25Sb3V0aW5nQ2hhbmdlZCgpIGNhbGxlZCB3aXRoICVkLCBvbGQgPSAlZCIsCi0gICAgICAgICAgZGV2aWNlSWQsIG1EZXZpY2VJZCk7Ci0gICAgaWYgKG1EZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICAmJiBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKKy8vIEdldCBmcmVlLXJ1bm5pbmcgRFNQIG9yIERNQSBoYXJkd2FyZSBwb3NpdGlvbiBmcm9tIHRoZSBIQUwuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEZyZWVSdW5uaW5nUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCgqcG9zaXRpb25GcmFtZXMsICp0aW1lTmFub3MpOworICAgICAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICB9Ci0gICAgbURldmljZUlkID0gZGV2aWNlSWQ7Ci19OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOworCisgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKKyAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpICsgc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0SGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MoKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KK30KIAogLyoqCiAgKiBHZXQgYW4gaW1tdXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIHF1ZXVlIGZyb20gdGhlIEhBTC4KICAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7Ci0gICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHF1ZXVlIGJhc2VkIG9uIEhBTCBpbmZvLgotICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKTsKLSAgICBpbnQzMl90IGNhcGFjaXR5SW5CeXRlcyA9IG1DYXBhY2l0eUluRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKLSAgICBpbnQgZmRJbmRleCA9IHBhcmNlbGFibGUuYWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldHVwTWVtb3J5KGZkSW5kZXgsIDAsIGNhcGFjaXR5SW5CeXRlcyk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Qnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldENhcGFjaXR5SW5GcmFtZXMobUNhcGFjaXR5SW5GcmFtZXMpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKKyAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gc2VydmljZUVuZHBvaW50TU1BUCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQICo+KGVuZHBvaW50LmdldCgpKTsKKyAgICByZXR1cm4gc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCmluZGV4IGI2OWRjNDYuLmUyNDE1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaApAQCAtMzcsMjcgKzM3LDIwIEBACiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi0gICAgLyoqCi0gICAgICogTWFuYWdlIG9uZSBtZW1vcnkgbWFwcGVkIGJ1ZmZlciB0aGF0IG9yaWdpbmF0ZWQgZnJvbSBhIEhBTC4KLSAgICAgKi8KLWNsYXNzIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQCi0gICAgOiBwdWJsaWMgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UKLSAgICAsIHB1YmxpYyBhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgeworCisvKioKKyAqIFRoZXNlIGNvcnJlc3BvbmRzIHRvIGFuIEVYQ0xVU0lWRSBtb2RlIE1NQVAgY2xpZW50IHN0cmVhbS4KKyAqIEl0IGhhcyBleGNsdXNpdmUgdXNlIG9mIG9uZSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcKKyAqIGRldmljZSBvciBwb3J0LgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSB7CiAKIHB1YmxpYzoKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgc2VydmljZUNsaWVudCwgYm9vbCBpblNlcnZpY2UpOworICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpblNlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKCkgPSBkZWZhdWx0OwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCi0gICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc28gdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCkBAIC02OSw3OSArNjIsMzQgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgb3ZlcnJpZGU7CiAKLSAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpOwotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7Ci0KICAgICAvKioKICAgICAgKiBTZW5kIGEgTU1BUC9OT0lSUSBidWZmZXIgdGltZXN0YW1wIHRvIHRoZSBjbGllbnQuCiAgICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLSBDYWxsYmFjayBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBEZXZpY2Ugc3BlY2lmaWMgc3RhcnR1cC4KKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvci4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnREZXZpY2UoKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKLSAgICAvLyBUaGlzIHByb3h5IGNsYXNzIHdhcyBuZWVkZWQgdG8gcHJldmVudCBhIGNyYXNoIGluIEF1ZGlvRmxpbmdlcgotICAgIC8vIHdoZW4gdGhlIHN0cmVhbSB3YXMgY2xvc2VkLgotICAgIGNsYXNzIE15TW1hcFN0cmVhbUNhbGxiYWNrIDogcHVibGljIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBNeU1tYXBTdHJlYW1DYWxsYmFjayhhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgJnNlcnZpY2VDYWxsYmFjaykKLSAgICAgICAgICAgIDogbVNlcnZpY2VDYWxsYmFjayhzZXJ2aWNlQ2FsbGJhY2spe30KLSAgICAgICAgdmlydHVhbCB+TXlNbWFwU3RyZWFtQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFjay5vblRlYXJEb3duKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdm9pZCBvblZvbHVtZUNoYW5nZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSBvdmVycmlkZQotICAgICAgICB7Ci0gICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChjaGFubmVscywgdmFsdWVzKTsKLSAgICAgICAgfTsKLQotICAgICAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFjay5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKLSAgICAgICAgfTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayAmbVNlcnZpY2VDYWxsYmFjazsKLSAgICB9OwotCi0gICAgYW5kcm9pZDo6c3A8TXlNbWFwU3RyZWFtQ2FsbGJhY2s+ICAgbU1tYXBTdHJlYW1DYWxsYmFjazsKLSAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsKLSAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNGcmFtZUNvdW50ZXIgPSAwOyAgIC8vIGZyb20gSEFMCi0KLSAgICAvLyBJbnRlcmZhY2UgdG8gdGhlIEF1ZGlvRmxpbmdlciBNTUFQIHN1cHBvcnQuCi0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TW1hcFN0cmVhbUludGVyZmFjZT4gbU1tYXBTdHJlYW07Ci0gICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2xpZW50OwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICAgICAgICAgICAgICAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3I7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCA1NjU0MTEzLi5mNTVjNDBkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtdXRleD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KQEAgLTQwLDggKzQyLDMyIEBACiAjZGVmaW5lIE1BWF9GUkFNRVNfUEVSX0JVRkZFUiAgICAgICAoMzIgKiAxMDI0KQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKLSAgICA6IG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKQotICAgIHsKKyAgICA6IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGF1ZGlvU2VydmljZSkKKyAgICAsIG1UaW1lc3RhbXBQb3NpdGlvbk9mZnNldCgwKQorICAgICwgbVhSdW5Db3VudCgwKSB7Cit9CisKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmR1bXBIZWFkZXIoKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpOworICAgIHJlc3VsdCA8PCAiICAgIFdyaXRlIyAgICAgUmVhZCMgICBBdmFpbCAgIFhSdW5zIjsKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpOworCisgICAgYXV0byBmaWZvID0gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7CisgICAgaW50MzJfdCByZWFkQ291bnRlciA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CisgICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDEwKSA8PCB3cml0ZUNvdW50ZXI7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgcmVhZENvdW50ZXI7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg4KSA8PCAod3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgZ2V0WFJ1bkNvdW50KCk7CisKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCiBpbnQzMl90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KGludDMyX3QgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsCkBAIC05MCw4OSArMTE2LDc5IEBACiAgICAgcmV0dXJuIGNhcGFjaXR5SW5GcmFtZXM7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgIHsKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2Ugb3BlbigpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uSW5wdXQgPSByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwogCi0gICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLCBjb25maWd1cmF0aW9uT3V0cHV0LCBkaXJlY3Rpb24pOwotICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtU2VydmljZUVuZFBvaW50ID0gJXAiLCBtU2VydmljZUVuZHBvaW50KTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwotICAgIG1BdWRpb0Zvcm1hdCA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKTsKLSAgICBpZiAobUF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbUF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9Gb3JtYXQgIT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIG1BdWRpb0Zvcm1hdCk7CisgICAgc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBnZXRGb3JtYXQoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBtU2FtcGxlUmF0ZSA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgaWYgKG1TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtU2FtcGxlUmF0ZSA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKTsKLSAgICB9IGVsc2UgaWYgKG1TYW1wbGVSYXRlICE9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSkgeworICAgIHNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZVJhdGUoKSk7CisgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2V0U2FtcGxlUmF0ZShlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICB9IGVsc2UgaWYgKGdldFNhbXBsZVJhdGUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCi0gICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9SQVRFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgaWYgKG1TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICB9IGVsc2UgaWYgKG1TYW1wbGVzUGVyRnJhbWUgIT0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKKyAgICBzZXRTYW1wbGVzUGVyRnJhbWUoY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKLSAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU2VydmljZUVuZHBvaW50LT5nZXRGcmFtZXNQZXJCdXJzdCgpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbVNhbXBsZVJhdGUgPSAlZCwgbUZyYW1lc1BlckJ1cnN0ID0gJWQiLAotICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVzUGVyQnVyc3QpOwotCi0gICAgbUNhcGFjaXR5SW5GcmFtZXMgPSBjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eShjb25maWd1cmF0aW9uSW5wdXQuZ2V0QnVmZmVyQ2FwYWNpdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QpOwotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA8IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbUNhcGFjaXR5SW5GcmFtZXM7IC8vIG5lZ2F0aXZlIGVycm9yIGNvZGUKLSAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSAwOworICAgIHNldEJ1ZmZlckNhcGFjaXR5KGNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRCdWZmZXJDYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCkpOworICAgIGlmIChnZXRCdWZmZXJDYXBhY2l0eSgpIDwgMCkgeworICAgICAgICByZXN1bHQgPSBnZXRCdWZmZXJDYXBhY2l0eSgpOyAvLyBuZWdhdGl2ZSBlcnJvciBjb2RlCisgICAgICAgIHNldEJ1ZmZlckNhcGFjaXR5KDApOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIC8vIENyZWF0ZSBhdWRpbyBkYXRhIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGZvciBjbGllbnQuCi0gICAgbUF1ZGlvRGF0YVF1ZXVlID0gbmV3IFNoYXJlZFJpbmdCdWZmZXIoKTsKLSAgICByZXN1bHQgPSBtQXVkaW9EYXRhUXVldWUtPmFsbG9jYXRlKGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSwgbUNhcGFjaXR5SW5GcmFtZXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgY291bGQgbm90IGFsbG9jYXRlIEZJRk8gd2l0aCAlZCBmcmFtZXMiLAotICAgICAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyk7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKKyAgICAgICAgLy8gQ3JlYXRlIGF1ZGlvIGRhdGEgc2hhcmVkIG1lbW9yeSBidWZmZXIgZm9yIGNsaWVudC4KKyAgICAgICAgbUF1ZGlvRGF0YVF1ZXVlID0gbmV3IFNoYXJlZFJpbmdCdWZmZXIoKTsKKyAgICAgICAgcmVzdWx0ID0gbUF1ZGlvRGF0YVF1ZXVlLT5hbGxvY2F0ZShjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBjb3VsZCBub3QgYWxsb2NhdGUgRklGTyB3aXRoICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgICBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9OT19NRU1PUlk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfQogCiAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKLSAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVNhbXBsZXNQZXJGcmFtZSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogCi0gICAgLy8gRmlsbCBpbiBjb25maWd1cmF0aW9uIGZvciBjbGllbnQuCi0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNhbXBsZXNQZXJGcmFtZShtU2FtcGxlc1BlckZyYW1lKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldEZvcm1hdChtQXVkaW9Gb3JtYXQpOwotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0RGV2aWNlSWQobVNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7Ci0KLSAgICByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKKyAgICByZXN1bHQgPSBlbmRwb2ludC0+cmVnaXN0ZXJTdHJlYW0oa2VlcCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xODUsMTIxICsyMDEsMzAgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vKioKLSAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCi0gKgotICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RhcnQoKSAgewotICAgIGlmIChpc1J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludDsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotICAgIC8vIEZvciBvdXRwdXQgc3RyZWFtcywgdGhpcyB3aWxsIGFkZCB0aGUgc3RyZWFtIHRvIHRoZSBtaXhlci4KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPnN0YXJ0U3RyZWFtKHRoaXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdGFydCgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gZW5kcG9pbnQtPmdldFN0cmVhbUludGVybmFsKCktPnN0YXJ0Q2xpZW50KG1NbWFwQ2xpZW50LCAmbUNsaWVudEhhbmRsZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KLSAqCi0gKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSovCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6cGF1c2UoKSAgewotICAgIGlmICghaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnQ7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLSAgICBlbmRwb2ludC0+Z2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPnN0b3BTdHJlYW0odGhpcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnBhdXNlKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsgLy8gVE9ETyBzaG91bGQgd2UgcmV0dXJuIG9yIHBhdXNlIEJhc2UgZmlyc3Q/Ci0gICAgfQotICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnN0b3AoKSAgewotICAgIGlmICghaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnQ7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLSAgICBlbmRwb2ludC0+Z2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPnN0b3BTdHJlYW0odGhpcyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnN0b3AoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0b3AoKTsKLX0KLQotLyoqCi0gKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICoKLSAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmZsdXNoKCkgIHsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludDsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotICAgIGlmIChtU3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpIHsKLSAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpmbHVzaCgpIHN0cmVhbSBub3QgcGF1c2VkLCBzdGF0ZSA9ICVzIiwKLSAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQobVN0YXRlKSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0gICAgLy8gRGF0YSB3aWxsIGdldCBmbHVzaGVkIHdoZW4gdGhlIGNsaWVudCByZWNlaXZlcyB0aGUgRkxVU0hFRCBldmVudC4KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCk7Ci19CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjbG9zZSgpICB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCk7CiAKLSAgICBzdG9wKCk7Ci0KLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludDsKLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotCi0gICAgZW5kcG9pbnQtPnVucmVnaXN0ZXJTdHJlYW0odGhpcyk7Ci0KLSAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7Ci0gICAgbUVuZHBvaW50TWFuYWdlci5jbG9zZUVuZHBvaW50KGVuZHBvaW50KTsKLSAgICBtU2VydmljZUVuZHBvaW50ID0gbnVsbHB0cjsKLQotICAgIGlmIChtQXVkaW9EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CiAgICAgICAgIGRlbGV0ZSBtQXVkaW9EYXRhUXVldWU7CiAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZSA9IG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKTsKKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgogICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBjcmVhdGVkIGJ5IHRoaXMgc2VydmljZS4KICAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQogeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOworICAgIGlmIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICB9CiAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHF1ZXVlLgogICAgIG1BdWRpb0RhdGFRdWV1ZS0+ZmlsbFBhcmNlbGFibGUocGFyY2VsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlKTsKQEAgLTMwNywxNSArMjMyLDQzIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjptYXJrVHJhbnNmZXJUaW1lKGludDY0X3QgbmFub3NlY29uZHMpIHsKLSAgICBtTWFya2VkUG9zaXRpb24gPSBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+Z2V0UmVhZENvdW50ZXIoKTsKLSAgICBtTWFya2VkVGltZSA9IG5hbm9zZWNvbmRzOwordm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjptYXJrVHJhbnNmZXJUaW1lKFRpbWVzdGFtcCAmdGltZXN0YW1wKSB7CisgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogfQogCisvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgbWl4ZXIgb3IgZGlzdHJpYnV0b3IuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCisgICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CisgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KK30KKworLy8gR2V0IHRpbWVzdGFtcCBmcm9tIGxvd2VyIGxldmVsIHNlcnZpY2UuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgLy8gVE9ETyBnZXQgdGhlc2UgdHdvIG51bWJlcnMgYXMgYW4gYXRvbWljIHBhaXIKLSAgICAqcG9zaXRpb25GcmFtZXMgPSBtTWFya2VkUG9zaXRpb247Ci0gICAgKnRpbWVOYW5vcyA9IG1NYXJrZWRUaW1lOwotICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gMDsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOworICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+Z2V0VGltZXN0YW1wKCZwb3NpdGlvbiwgdGltZU5hbm9zKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBpbnQ2NF90IG9mZnNldCA9IG1UaW1lc3RhbXBQb3NpdGlvbk9mZnNldC5sb2FkKCk7CisgICAgICAgIC8vIFRPRE8sIGRvIG5vdCBnbyBiZWxvdyBzdGFydGluZyB2YWx1ZQorICAgICAgICBwb3NpdGlvbiAtPSBvZmZzZXQ7IC8vIE9mZnNldCBmcm9tIHNoYXJlZCBNTUFQIHN0cmVhbQorICAgICAgICBBTE9HVigiZ2V0SGFyZHdhcmVUaW1lc3RhbXAoKSAlOGxsZCA9ICU4bGxkIC0gJThsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKSBwb3NpdGlvbiwgKGxvbmcgbG9uZykgKHBvc2l0aW9uICsgb2Zmc2V0KSwgKGxvbmcgbG9uZykgb2Zmc2V0KTsKKyAgICB9CisgICAgKnBvc2l0aW9uRnJhbWVzID0gcG9zaXRpb247CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAppbmRleCA2YjY3MzM3Li44NDk5ZWE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCkBAIC00Niw1MyArNDYsNTUgQEAKICAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKSA9IGRlZmF1bHQ7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSBvdmVycmlkZTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhlYWRlcigpOwogCi0gICAgLyoqCi0gICAgICogU3RhcnQgdGhlIGZsb3cgb2YgYXVkaW8gZGF0YS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KLSAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHNvIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGhvdXQgbG9zcyBvZiBkYXRhLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgb3ZlcnJpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgYWZ0ZXIgZGF0YSBpbiBidWZmZXIgaGFzIHBsYXllZC4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KLSAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgYW5kcm9pZDo6Rmlmb0J1ZmZlciAqZ2V0RGF0YUZpZm9CdWZmZXIoKSB7IHJldHVybiBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsgfQorICAgIC8qKgorICAgICAqIFRoaXMgbXVzdCBiZSBsb2NrZWQgd2hlbiBjYWxsaW5nIGdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpIGFuZCB3aGlsZQorICAgICAqIHVzaW5nIHRoZSBGaWZvQnVmZmVyIGl0IHJldHVybnMuCisgICAgICovCisgICAgc3RkOjptdXRleCAmZ2V0QXVkaW9EYXRhUXVldWVMb2NrKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvRGF0YVF1ZXVlTG9jazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsIHVuZGVyIGdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpGaWZvQnVmZmVyICpnZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKSB7IHJldHVybiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7IH0KIAogICAgIC8qIEtlZXAgYSByZWNvcmQgb2Ygd2hlbiBhIGJ1ZmZlciB0cmFuc2ZlciBjb21wbGV0ZWQuCiAgICAgICogVGhpcyBhbGxvd3MgZm9yIGEgbW9yZSBhY2N1cmF0ZSB0aW1pbmcgbW9kZWwuCiAgICAgICovCi0gICAgdm9pZCBtYXJrVHJhbnNmZXJUaW1lKGludDY0X3QgbmFub3NlY29uZHMpOworICAgIHZvaWQgbWFya1RyYW5zZmVyVGltZShUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CisKKyAgICB2b2lkIHNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KGludDY0X3QgZGVsdGFGcmFtZXMpIHsKKyAgICAgICAgbVRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0LnN0b3JlKGRlbHRhRnJhbWVzKTsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudFhSdW5Db3VudCgpIHsKKyAgICAgICAgbVhSdW5Db3VudCsrOworICAgIH0KKworICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVhSdW5Db3VudC5sb2FkKCk7CisgICAgfQogCiBwcm90ZWN0ZWQ6CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3RlZENhcGFjaXR5RnJhbWVzCiAgICAgICogQHBhcmFtIGZyYW1lc1BlckJ1cnN0CkBAIC0xMDIsMTIgKzEwNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KTsKIAogcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICAmbUF1ZGlvU2VydmljZTsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgICAqbVNlcnZpY2VFbmRwb2ludCA9IG51bGxwdHI7Ci0gICAgU2hhcmVkUmluZ0J1ZmZlciAgICAgICAgKm1BdWRpb0RhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgU2hhcmVkUmluZ0J1ZmZlciAgICAgICAgKm1BdWRpb0RhdGFRdWV1ZSA9IG51bGxwdHI7IC8vIHByb3RlY3RlZCBieSBtQXVkaW9EYXRhUXVldWVMb2NrCisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZUxvY2s7CiAKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbU1hcmtlZFBvc2l0aW9uID0gMDsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbU1hcmtlZFRpbWUgPSAwOworICAgIHN0ZDo6YXRvbWljPGludDY0X3Q+ICAgICBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQ7CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICAgIG1YUnVuQ291bnQ7CisKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg4YjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbVRyYWNrZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworI2luY2x1ZGUgIkFBdWRpb1N0cmVhbVRyYWNrZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6cmVtb3ZlU3RyZWFtQnlIYW5kbGUoCisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGFuZGxlTG9jayk7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW07CisgICAgYXV0byBpdCA9IG1TdHJlYW1zQnlIYW5kbGUuZmluZChzdHJlYW1IYW5kbGUpOworICAgIGlmIChpdCAhPSBtU3RyZWFtc0J5SGFuZGxlLmVuZCgpKSB7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBpdC0+c2Vjb25kOworICAgICAgICBtU3RyZWFtc0J5SGFuZGxlLmVyYXNlKGl0KTsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW07Cit9CisKK3NwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpnZXRTdHJlYW1CeUhhbmRsZSgKKyAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKKyAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5maW5kKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOworfQorCisvLyBhZHZhbmNlIHRvIG5leHQgbGVnYWwgaGFuZGxlIHZhbHVlCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK2FhdWRpb19oYW5kbGVfdCBBQXVkaW9TdHJlYW1UcmFja2VyOjpidW1wSGFuZGxlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBoYW5kbGUrKzsKKyAgICAvLyBPbmx5IHVzZSBwb3NpdGl2ZSBpbnRlZ2Vycy4KKyAgICBpZiAoaGFuZGxlIDw9IDApIHsKKyAgICAgICAgaGFuZGxlID0gMTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworYWF1ZGlvX2hhbmRsZV90IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmFkZFN0cmVhbUZvckhhbmRsZShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKKyAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbVByZXZpb3VzSGFuZGxlLmxvYWQoKTsKKyAgICAvLyBBc3NpZ24gYSB1bmlxdWUgaGFuZGxlLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGhhbmRsZSA9IGJ1bXBIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IG9sZFNlcnZpY2VTdHJlYW0gPSBtU3RyZWFtc0J5SGFuZGxlW2hhbmRsZV07CisgICAgICAgIC8vIElzIHRoaXMgYW4gdW51c2VkIGhhbmRsZT8gSXQgd291bGQgYmUgZXh0cmVtZWx5IHVubGlrZWx5IHRvIHdyYXAKKyAgICAgICAgLy8gYXJvdW5kIGFuZCBjb2xsaWRlIHdpdGggYSB2ZXJ5IG9sZCBoYW5kbGUuIEJ1dCBqdXN0IGluIGNhc2UuCisgICAgICAgIGlmIChvbGRTZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zQnlIYW5kbGVbaGFuZGxlXSA9IHNlcnZpY2VTdHJlYW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUHJldmlvdXNIYW5kbGUuc3RvcmUoaGFuZGxlKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TdHJlYW1UcmFja2VyOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKKyAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1IYW5kbGVMb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKKyAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAorICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CisgICAgaWYgKCFpc0xvY2tlZCkgeworICAgICAgICByZXN1bHQgPDwgIkFBdWRpb1N0cmVhbVRyYWNrZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0IDw8ICJTdHJlYW0gSGFuZGxlczpcbiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgIGl0IDogbVN0cmVhbXNCeUhhbmRsZSkgeworICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IGl0LnNlY29uZC0+Z2V0SGFuZGxlKCk7CisgICAgICAgICAgICByZXN1bHQgPDwgIiAgICAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4IDw8IGhhbmRsZQorICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpIDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBtSGFuZGxlTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ0NDBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBVURJT19BQVVESU9fU1RSRUFNX1RSQUNLRVJfSAorI2RlZmluZSBBQVVESU9fQUFVRElPX1NUUkVBTV9UUkFDS0VSX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgorCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKKworbmFtZXNwYWNlIGFhdWRpbyB7CisKK2NsYXNzIEFBdWRpb1N0cmVhbVRyYWNrZXIgeworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCisgICAgICogQHBhcmFtIHN0cmVhbUhhbmRsZQorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBmb3VuZCBvciB0byBudWxscHRyCisgICAgICovCisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHJlbW92ZVN0cmVhbUJ5SGFuZGxlKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworCisgICAgLyoqCisgICAgICogTG9vayB1cCBhIHN0cmVhbSBiYXNlZCBvbiB0aGUgaGFuZGxlLgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKKyAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQgb3IgdG8gbnVsbHB0cgorICAgICAqLworICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGdldFN0cmVhbUJ5SGFuZGxlKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworCisgICAgLyoqCisgICAgICogU3RvcmUgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgc3RyZWFtIGFuZCByZXR1cm4gYSB1bmlxdWUgaGFuZGxlIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorICAgICAqIFRoZSBoYW5kbGUgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29sbGlkZSB3aXRoIGFuIGV4aXN0aW5nIHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gc2VydmljZVN0cmVhbQorICAgICAqIEByZXR1cm4gaGFuZGxlIGZvciBpZGVudGlmeWluZyB0aGUgc3RyZWFtCisgICAgICovCisgICAgYWF1ZGlvX2hhbmRsZV90IGFkZFN0cmVhbUZvckhhbmRsZShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHN0cmluZyB0aGF0IGNhbiBiZSBhZGRlZCB0byBkdW1wc3lzCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyBhYXVkaW9faGFuZGxlX3QgYnVtcEhhbmRsZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8vIFRyYWNrIHN0cmVhbSB1c2luZyBhIHVuaXF1ZSBoYW5kbGUgdGhhdCB3cmFwcy4gT25seSB1c2UgcG9zaXRpdmUgaGFsZi4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgbUhhbmRsZUxvY2s7CisgICAgc3RkOjphdG9taWM8YWF1ZGlvX2hhbmRsZV90PiAgICAgIG1QcmV2aW91c0hhbmRsZXswfTsKKyAgICBzdGQ6Om1hcDxhYXVkaW9faGFuZGxlX3QsIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtU3RyZWFtc0J5SGFuZGxlOworfTsKKworCit9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KKworI2VuZGlmIC8qIEFBVURJT19BQVVESU9fU1RSRUFNX1RSQUNLRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKaW5kZXggZWJiNTBmOC4uYzZmYjU3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCkBAIC01Myw3ICs1Myw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9UaHJlYWQ6OnN0YXJ0KFJ1bm5hYmxlICpydW5uYWJsZSkgewogICAgIGlmIChtSGFzVGhyZWFkKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9UaHJlYWQ6OnN0YXJ0KCkgLSBtSGFzVGhyZWFkLmxvYWQoKSBhbHJlYWR5IHRydWUiKTsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1RocmVhZDo6c3RhcnQoKSAtIG1IYXNUaHJlYWQgYWxyZWFkeSB0cnVlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgLy8gbVJ1bm5hYmxlIHdpbGwgYmUgcmVhZCBieSB0aGUgbmV3IHRocmVhZCB3aGVuIGl0IHN0YXJ0cy4KQEAgLTcxLDYgKzcxLDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RvcCgpIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1RocmVhZDo6c3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBhODk2YTdhLi41ODRiMmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTIyLDcgKzIyLDYgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCiAKIExPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgJChMSUJBQVVESU9fU1JDX0RJUikvdXRpbGl0eS9IYW5kbGVUcmFja2VyLmNwcCBcCiAgICAgU2hhcmVkTWVtb3J5UHJveHkuY3BwIFwKICAgICBTaGFyZWRSaW5nQnVmZmVyLmNwcCBcCiAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAgXApAQCAtMzEsMTAgKzMwLDEzIEBACiAgICAgQUF1ZGlvU2VydmljZS5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIFwKKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgXAorICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBcCisgICAgQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAgXAogICAgIFRpbWVzdGFtcFNjaGVkdWxlci5jcHAgXAogICAgIEFBdWRpb1RocmVhZC5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvT1dORVJTIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDUxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9PV05FUlMKQEAgLTAsMCArMSBAQAorcGhpbGJ1cmtAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCmluZGV4IGZjNDUzMmMuLmMzMTU1N2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKQEAgLTE2LDEyICsxNiwxMSBAQAogCiAjZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgIlNoYXJlZE1lbW9yeVByb3h5LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogU2hhcmVkTWVtb3J5UHJveHk6On5TaGFyZWRNZW1vcnlQcm94eSgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rIGIvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MGRjMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFJhZGlvU2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJyYWRpbyBcCi0gICAgbGlicmFkaW9fbWV0YWRhdGEKLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFJhZGlvSGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEhpZGxVdGlscy5jcHAgXAotICAgIFJhZGlvSGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5icm9hZGNhc3RyYWRpb0AxLjAKLWVuZGlmCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGlicmFkaW9zZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAgYi9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk1Mzc3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jZGVmaW5lIExPR19UQUcgIkhpZGxVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KLQotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6TWV0YWRhdGFUeXBlOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpCYW5kOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpEZWVtcGhhc2lzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZHM7Ci0KLS8vc3RhdGljCi1pbnQgSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KFJlc3VsdCByZXN1bHQpCi17Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzoKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURToKLSAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOwotICAgICAgICBjYXNlIFJlc3VsdDo6VElNRU9VVDoKLSAgICAgICAgICAgIHJldHVybiAtRVRJTUVET1VUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotfQotCi0KLS8vc3RhdGljCi12b2lkIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGhhbENvbmZpZy0+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+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb3BlcnRpZXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmRDb25maWc7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb2dyYW1JbmZvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhRGF0YTsKLQotY2xhc3MgSGlkbFV0aWxzIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgaW50IGNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdGcm9tSGFsKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhbmRDb25maWcgKmhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb3BlcnRpZXNGcm9tSGFsKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnRpZXMgKmhhbFByb3BlcnRpZXMpOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoQmFuZENvbmZpZyAqaGFsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydFByb2dyYW1JbmZvRnJvbUhhbChyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2dyYW1JbmZvICpoYWxJbmZvKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFGcm9tSGFsKHJhZGlvX21ldGFkYXRhX3QgKiptZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPE1ldGFEYXRhPiYgaGFsTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzcyNzUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSYWRpb0hhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vUmFkaW9NZXRhZGF0YVdyYXBwZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JQnJvYWRjYXN0UmFkaW9GYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlICJSYWRpb0hhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkNsYXNzOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpEaXJlY3Rpb247Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb3BlcnRpZXM7Ci0KLQotLyogc3RhdGljICovCi1zcDxSYWRpb0ludGVyZmFjZT4gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotewotICAgIHJldHVybiBuZXcgUmFkaW9IYWxIaWRsKGNsYXNzSWQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IG1vZHVsZSA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFByb3BlcnRpZXMgaGFsUHJvcGVydGllczsKLSAgICBSZXN1bHQgaGFsUmVzdWx0ID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbW9kdWxlLT5nZXRQcm9wZXJ0aWVzKFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgaWYgKGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydFByb3BlcnRpZXNGcm9tSGFsKHByb3BlcnRpZXMsICZoYWxQcm9wZXJ0aWVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBtb2R1bGUgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gbmV3IFR1bmVyKGNhbGxiYWNrLCB0aGlzKTsKLQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIFJlc3VsdCBoYWxSZXN1bHQgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBzcDxJVHVuZXI+IGhhbFR1bmVyOwotCi0gICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbW9kdWxlLT5vcGVuVHVuZXIoaGFsQ29uZmlnLCBhdWRpbywgdHVuZXJJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElUdW5lcj4mIHR1bmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lciA9IHR1bmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICBpZiAoaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIHR1bmVyID0gdHVuZXJJbXBsOwotICAgIH0KLQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6Y2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBzdGF0aWNfY2FzdDxUdW5lciAqPih0dW5lci5nZXQoKSk7Ci0gICAgc3A8SVR1bmVyPiBjbGVhclR1bmVyOwotICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoY2xlYXJUdW5lcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVJhZGlvSGFsSGlkbDo6UmFkaW9IYWxIaWRsKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLSAgICA6IG1DbGFzc0lkKGNsYXNzSWQpCi17Ci19Ci0KLVJhZGlvSGFsSGlkbDo6flJhZGlvSGFsSGlkbCgpCi17Ci19Ci0KLXNwPElCcm9hZGNhc3RSYWRpbz4gUmFkaW9IYWxIaWRsOjpnZXRTZXJ2aWNlKCkKLXsKLSAgICBpZiAobUhhbE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHNwPElCcm9hZGNhc3RSYWRpb0ZhY3Rvcnk+IGZhY3RvcnkgPSBJQnJvYWRjYXN0UmFkaW9GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChmYWN0b3J5ICE9IDApIHsKLSAgICAgICAgICAgIGZhY3RvcnktPmNvbm5lY3RNb2R1bGUoc3RhdGljX2Nhc3Q8Q2xhc3M+KG1DbGFzc0lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHJldHZhbCwgY29uc3QgOjphbmRyb2lkOjpzcDxJQnJvYWRjYXN0UmFkaW8+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUhhbE1vZHVsZSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiJXMgT1VUIG1vZHVsZSAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbE1vZHVsZS5nZXQoKSk7Ci0gICAgcmV0dXJuIG1IYWxNb2R1bGU7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpjbGVhclNlcnZpY2UoKQotewotICAgIEFMT0dWKCIlcyBJTiBtb2R1bGUgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxNb2R1bGUuZ2V0KCkpOwotICAgIG1IYWxNb2R1bGUuY2xlYXIoKTsKLX0KLQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0KLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwotCi0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9IG1IYWxUdW5lci0+c2V0Q29uZmlndXJhdGlvbihoYWxDb25maWcpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIEJhbmRDb25maWcgaGFsQ29uZmlnOwotICAgIFJlc3VsdCBoYWxSZXN1bHQ7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPQotICAgICAgICAgICAgbUhhbFR1bmVyLT5nZXRDb25maWd1cmF0aW9uKFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFsUmVzdWx0ID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbENvbmZpZyA9IGNvbmZpZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIGlmIChoaWRsUmV0dXJuLmlzT2soKSAmJiBoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbChjb25maWcsICZoYWxDb25maWcpOwotICAgIH0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+c2NhbihzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KGRpcmVjdGlvbiksIHNraXBfc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+c3RlcChzdGF0aWNfY2FzdDxEaXJlY3Rpb24+KGRpcmVjdGlvbiksIHNraXBfc3ViX2NoYW5uZWwpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPQotICAgICAgICAgICAgbUhhbFR1bmVyLT50dW5lKGNoYW5uZWwsIHN1Yl9jaGFubmVsKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Y2FuY2VsKCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9IG1IYWxUdW5lci0+Y2FuY2VsKCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKGluZm8gPT0gbnVsbHB0ciB8fCBpbmZvLT5tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFByb2dyYW1JbmZvIGhhbEluZm87Ci0gICAgUmVzdWx0IGhhbFJlc3VsdDsKLSAgICBSZXR1cm48dm9pZD4gaGlkbFJldHVybiA9IG1IYWxUdW5lci0+Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKAotICAgICAgICBbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pIHsKLSAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGhhbEluZm8gPSBpbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBpZiAoaGlkbFJldHVybi5pc09rKCkgJiYgaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKGluZm8sICZoYWxJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6aGFyZHdhcmVGYWlsdXJlKCkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIGhhbmRsZUh3RmFpbHVyZSgpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmNvbmZpZ0NoYW5nZShSZXN1bHQgcmVzdWx0LCBjb25zdCBCYW5kQ29uZmlnJiBjb25maWcpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YocmFkaW9faGFsX2V2ZW50X3QpKTsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQ09ORklHOwotICAgIGV2ZW50LnN0YXR1cyA9IEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChyZXN1bHQpOwotICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdGcm9tSGFsKCZldmVudC5jb25maWcsICZjb25maWcpOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0dW5lQ29tcGxldGUoUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQuaW5mby5tZXRhZGF0YSk7Ci0KLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7Ci0gICAgZXZlbnQuc3RhdHVzID0gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KHJlc3VsdCk7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKCZldmVudC5pbmZvLCAmaW5mbyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmFmU3dpdGNoKGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQgPSB7fTsKLSAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmV2ZW50LmluZm8ubWV0YWRhdGEpOwotCi0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0FGX1NXSVRDSDsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwoJmV2ZW50LmluZm8sICZpbmZvKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6YW50ZW5uYVN0YXRlQ2hhbmdlKGJvb2wgY29ubmVjdGVkKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0FOVEVOTkE7Ci0gICAgZXZlbnQub24gPSBjb25uZWN0ZWQ7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjp0cmFmZmljQW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1RBOwotICAgIGV2ZW50Lm9uID0gYWN0aXZlOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6ZW1lcmdlbmN5QW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0VBOwotICAgIGV2ZW50Lm9uID0gYWN0aXZlOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6bmV3TWV0YWRhdGEodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPE1ldGFEYXRhPiYgbWV0YWRhdGEpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudCA9IHt9OwotICAgIFJhZGlvTWV0YWRhdGFXcmFwcGVyIG1ldGFkYXRhV3JhcHBlcigmZXZlbnQubWV0YWRhdGEpOwotCi0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX01FVEFEQVRBOwotICAgIEhpZGxVdGlsczo6Y29udmVydE1ldGFEYXRhRnJvbUhhbCgmZXZlbnQubWV0YWRhdGEsIG1ldGFkYXRhLCBjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi0KLVJhZGlvSGFsSGlkbDo6VHVuZXI6OlR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLCBzcDxSYWRpb0hhbEhpZGw+IG1vZHVsZSkKLSAgICA6IFR1bmVySW50ZXJmYWNlKCksIG1IYWxUdW5lcihOVUxMKSwgbUNhbGxiYWNrKGNhbGxiYWNrKSwgbVBhcmVudE1vZHVsZShtb2R1bGUpCi17Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBoYW5kbGVyIHdlIGFyZSBwYXNzaW5nIGluIG9ubHkgZGVhbHMgd2l0aCBjb25zdCBtZW1iZXJzLAotICAgIC8vIGFzIGl0IGNhbiBiZSBjYWxsZWQgb24gYW4gYXJiaXRyYXJ5IHRocmVhZC4KLSAgICBjb25zdCBhdXRvJiBzZWxmID0gdGhpczsKLSAgICBIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCktPnJlZ2lzdGVyQXRFeGl0SGFuZGxlcigKLSAgICAgICAgICAgIHRoaXMsIFsmc2VsZl0oKSB7IHNlbGYtPnNlbmRId0ZhaWx1cmVFdmVudCgpOyB9KTsKLX0KLQotCi1SYWRpb0hhbEhpZGw6OlR1bmVyOjp+VHVuZXIoKQotewotICAgIEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKS0+dW5yZWdpc3RlckF0RXhpdEhhbmRsZXIodGhpcyk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2V0SGFsVHVuZXIoc3A8SVR1bmVyPiYgaGFsVHVuZXIpIHsKLSAgICBpZiAobUhhbFR1bmVyICE9IDApIHsKLSAgICAgICAgbUhhbFR1bmVyLT51bmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSk7Ci0gICAgfQotICAgIG1IYWxUdW5lciA9IGhhbFR1bmVyOwotICAgIGlmIChtSGFsVHVuZXIgIT0gMCkgewotICAgICAgICBtSGFsVHVuZXItPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6aGFuZGxlSHdGYWlsdXJlKCkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPFJhZGlvSGFsSGlkbD4gcGFyZW50TW9kdWxlID0gbVBhcmVudE1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHBhcmVudE1vZHVsZSAhPSAwKSB7Ci0gICAgICAgIHBhcmVudE1vZHVsZS0+Y2xlYXJTZXJ2aWNlKCk7Ci0gICAgfQotICAgIHNlbmRId0ZhaWx1cmVFdmVudCgpOwotICAgIG1IYWxUdW5lci5jbGVhcigpOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNlbmRId0ZhaWx1cmVFdmVudCgpIGNvbnN0Ci17Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6Om9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KSBjb25zdAotewotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoaGFsRXZlbnQpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4NDIwZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JQnJvYWRjYXN0UmFkaW8uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JVHVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Jyb2FkY2FzdHJhZGlvLzEuMC9JVHVuZXJDYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJlc3VsdDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SUJyb2FkY2FzdFJhZGlvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJVHVuZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklUdW5lckNhbGxiYWNrOwotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmRDb25maWc7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlByb2dyYW1JbmZvOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhRGF0YTsKLQotY2xhc3MgUmFkaW9IYWxIaWRsIDogcHVibGljIFJhZGlvSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIFJhZGlvSGFsSGlkbChyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFJhZGlvSW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcyk7Ci0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcik7Ci0KLSAgICAgICAgY2xhc3MgVHVuZXIgIDogcHVibGljIFR1bmVySW50ZXJmYWNlLCBwdWJsaWMgdmlydHVhbCBJVHVuZXJDYWxsYmFjawotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFR1bmVyKHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLCBzcDxSYWRpb0hhbEhpZGw+IG1vZHVsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1bmVySW50ZXJmYWNlCi0gICAgICAgICAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgY2FuY2VsKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJVHVuZXJDYWxsYmFjawotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gaGFyZHdhcmVGYWlsdXJlKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25maWdDaGFuZ2UoUmVzdWx0IHJlc3VsdCwgY29uc3QgQmFuZENvbmZpZyYgY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHR1bmVDb21wbGV0ZShSZXN1bHQgcmVzdWx0LCBjb25zdCBQcm9ncmFtSW5mbyYgaW5mbyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhZlN3aXRjaChjb25zdCBQcm9ncmFtSW5mbyYgaW5mbyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhbnRlbm5hU3RhdGVDaGFuZ2UoYm9vbCBjb25uZWN0ZWQpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gdHJhZmZpY0Fubm91bmNlbWVudChib29sIGFjdGl2ZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBlbWVyZ2VuY3lBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbmV3TWV0YWRhdGEodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8TWV0YURhdGE+JiBtZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIHZvaWQgc2V0SGFsVHVuZXIoc3A8SVR1bmVyPiYgaGFsVHVuZXIpOwotICAgICAgICAgICAgc3A8SVR1bmVyPiBnZXRIYWxUdW5lcigpIHsgcmV0dXJuIG1IYWxUdW5lcjsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB2aXJ0dWFsICAgICAgICAgIH5UdW5lcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgIG9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgaGFuZGxlSHdGYWlsdXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgIHNlbmRId0ZhaWx1cmVFdmVudCgpIGNvbnN0OwotCi0gICAgICAgICAgICBzcDxJVHVuZXI+IG1IYWxUdW5lcjsKLSAgICAgICAgICAgIGNvbnN0IHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFjazsKLSAgICAgICAgICAgIHdwPFJhZGlvSGFsSGlkbD4gbVBhcmVudE1vZHVsZTsKLSAgICAgICAgfTsKLQotICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW8+IGdldFNlcnZpY2UoKTsKLSAgICAgICAgdm9pZCBjbGVhclNlcnZpY2UoKTsKLQotcHJpdmF0ZToKLSAgICAgICAgdmlydHVhbCAgICAgICAgIH5SYWRpb0hhbEhpZGwoKTsKLQotICAgICAgICAgICAgICAgIHJhZGlvX2NsYXNzX3QgbUNsYXNzSWQ7Ci0gICAgICAgICAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBtSGFsTW9kdWxlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGNjZDQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvSGFsTGVnYWN5IgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgIlJhZGlvSGFsTGVnYWN5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY29uc3QgY2hhciAqUmFkaW9IYWxMZWdhY3k6OnNDbGFzc01vZHVsZU5hbWVzW10gPSB7Ci0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0ZNLCAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19BTV9GTSAqLwotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TQVQsICAvKiBjb3JyZXNwb25kcyB0byBSQURJT19DTEFTU19TQVQgKi8KLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfRFQsICAgLyogY29ycmVzcG9uZHMgdG8gUkFESU9fQ0xBU1NfRFQgKi8KLX07Ci0KLS8qIHN0YXRpYyAqLwotc3A8UmFkaW9JbnRlcmZhY2U+IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLXsKLSAgICByZXR1cm4gbmV3IFJhZGlvSGFsTGVnYWN5KGNsYXNzSWQpOwotfQotCi1SYWRpb0hhbExlZ2FjeTo6UmFkaW9IYWxMZWdhY3kocmFkaW9fY2xhc3NfdCBjbGFzc0lkKQotICAgIDogUmFkaW9JbnRlcmZhY2UoKSwgbUNsYXNzSWQoY2xhc3NJZCksIG1Id0RldmljZShOVUxMKQotewotfQotCi12b2lkIFJhZGlvSGFsTGVnYWN5OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLSAgICBBTE9HSSgiJXMgbUNsYXNzSWQgJWQiLCBfX0ZVTkNUSU9OX18sIG1DbGFzc0lkKTsKLQotICAgIG1Id0RldmljZSA9IE5VTEw7Ci0KLSAgICBpZiAoKG1DbGFzc0lkIDwgMCkgfHwKLSAgICAgICAgICAgIChtQ2xhc3NJZCA+PSBORUxFTShzQ2xhc3NNb2R1bGVOYW1lcykpKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGNsYXNzIElEICVkIiwgbUNsYXNzSWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR0koIiVzIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCAlcyAlcyIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIHNDbGFzc01vZHVsZU5hbWVzW21DbGFzc0lkXSk7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBzQ2xhc3NNb2R1bGVOYW1lc1ttQ2xhc3NJZF0sICZtb2QpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHJhZGlvIG1vZHVsZSAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBzQ2xhc3NNb2R1bGVOYW1lc1ttQ2xhc3NJZF0sIHN0cmVycm9yKC1yYykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJjID0gcmFkaW9faHdfZGV2aWNlX29wZW4obW9kLCAmbUh3RGV2aWNlKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiByYWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiAhPSBSQURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgewotICAgICAgICBBTE9HRSgid3JvbmcgcmFkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYWRpb19od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICB9Ci19Ci0KLVJhZGlvSGFsTGVnYWN5Ojp+UmFkaW9IYWxMZWdhY3koKQotewotICAgIGlmIChtSHdEZXZpY2UgIT0gTlVMTCkgewotICAgICAgICByYWRpb19od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICB9Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6Z2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0KLSAgICBpbnQgcmMgPSBtSHdEZXZpY2UtPmdldF9wcm9wZXJ0aWVzKG1Id0RldmljZSwgcHJvcGVydGllcyk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6b3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IG5ldyBUdW5lcihjYWxsYmFjayk7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyOwotICAgIGludCByYyA9IG1Id0RldmljZS0+b3Blbl90dW5lcihtSHdEZXZpY2UsIGNvbmZpZywgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Y2FsbGJhY2ssIHR1bmVySW1wbC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbFR1bmVyKTsKLSAgICBpZiAocmMgPT0gMCkgewotICAgICAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgdHVuZXIgPSB0dW5lckltcGw7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAodHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IChUdW5lciAqKXR1bmVyLmdldCgpOwotICAgIHJldHVybiBtSHdEZXZpY2UtPmNsb3NlX3R1bmVyKG1Id0RldmljZSwgdHVuZXJJbXBsLT5nZXRIYWxUdW5lcigpKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c2V0X2NvbmZpZ3VyYXRpb24obUhhbFR1bmVyLCBjb25maWcpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5nZXRfY29uZmlndXJhdGlvbihtSGFsVHVuZXIsIGNvbmZpZyk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zY2FuKG1IYWxUdW5lciwgZGlyZWN0aW9uLCBza2lwX3N1Yl9jaGFubmVsKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnN0ZXAobUhhbFR1bmVyLCBkaXJlY3Rpb24sIHNraXBfc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT50dW5lKG1IYWxUdW5lciwgY2hhbm5lbCwgc3ViX2NoYW5uZWwpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpjYW5jZWwoKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Y2FuY2VsKG1IYWxUdW5lcik7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmdldF9wcm9ncmFtX2luZm9ybWF0aW9uKG1IYWxUdW5lciwgaW5mbyk7Ci19Ci0KLXZvaWQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpvbkNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGhhbEV2ZW50KTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Y2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpCi17Ci0gICAgd3A8UmFkaW9IYWxMZWdhY3k6OlR1bmVyPiB3ZWFrID0gd3A8UmFkaW9IYWxMZWdhY3k6OlR1bmVyPigoUmFkaW9IYWxMZWdhY3k6OlR1bmVyICopY29va2llKTsKLSAgICBzcDxSYWRpb0hhbExlZ2FjeTo6VHVuZXI+IHR1bmVyID0gd2Vhay5wcm9tb3RlKCk7Ci0gICAgaWYgKHR1bmVyICE9IDApIHsKLSAgICAgICAgdHVuZXItPm9uQ2FsbGJhY2soaGFsRXZlbnQpOwotICAgIH0KLX0KLQotUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaykKLSAgICA6IFR1bmVySW50ZXJmYWNlKCksIG1IYWxUdW5lcihOVUxMKSwgbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi0KLVJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6flR1bmVyKCkKLXsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0ODMxYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbExlZ2FjeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfTEVHQUNZX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgIlJhZGlvSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmFkaW9IYWxMZWdhY3kgOiBwdWJsaWMgUmFkaW9JbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICAgICAgUmFkaW9IYWxMZWdhY3kocmFkaW9fY2xhc3NfdCBjbGFzc0lkKTsKLQotICAgICAgICAvLyBSYWRpb0ludGVyZmFjZQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpOwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotICAgICAgICB2aXJ0dWFsIGludCBjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgICAgICBjbGFzcyBUdW5lciAgOiBwdWJsaWMgVHVuZXJJbnRlcmZhY2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBjYW5jZWwoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbyk7Ci0KLSAgICAgICAgICAgIHN0YXRpYyB2b2lkIGNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLQotICAgICAgICAgICAgdm9pZCBzZXRIYWxUdW5lcihjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyKSB7IG1IYWxUdW5lciA9IGhhbFR1bmVyOyB9Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmdldEhhbFR1bmVyKCkgeyByZXR1cm4gbUhhbFR1bmVyOyB9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZpcnR1YWwgICAgICB+VHVuZXIoKTsKLQotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICAgICptSGFsVHVuZXI7Ci0gICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiAgbUNhbGxiYWNrOwotICAgICAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgICAgIH5SYWRpb0hhbExlZ2FjeSgpOwotCi1wcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIHNDbGFzc01vZHVsZU5hbWVzW107Ci0KLSAgICAgICAgcmFkaW9fY2xhc3NfdCBtQ2xhc3NJZDsKLSAgICAgICAgc3RydWN0IHJhZGlvX2h3X2RldmljZSAgKm1Id0RldmljZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0xFR0FDWV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmYjRkNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSAiVHVuZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmFkaW9JbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIC8qIGdldCBhIHNvdW5kIHRyaWdnZXIgSEFMIGluc3RhbmNlICovCi0gICAgICAgIHN0YXRpYyBzcDxSYWRpb0ludGVyZmFjZT4gY29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJldHJpZXZlIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBwcm9wZXJ0aWVzOiB3aGVyZSB0byByZXR1cm4gdGhlIG1vZHVsZSBwcm9wZXJ0aWVzCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIG5vIGVycm9yCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9wZW4gYSB0dW5lciBpbnRlcmZhY2UgZm9yIHRoZSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICogSWYgbm8gb3RoZXIgdHVuZXIgaXMgb3BlbmVkLCB0aGlzIHdpbGwgYWN0aXZhdGUgdGhlIHJhZGlvIG1vZHVsZS4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogdGhlIGJhbmQgY29uZmlndXJhdGlvbiB0byBhcHBseQotICAgICAgICAgKiAtIGF1ZGlvOiB0aGlzIHR1bmVyIHdpbGwgYmUgdXNlZCBmb3IgbGl2ZSByYWRpbyBsaXN0ZW5pbmcgYW5kIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8KLSAgICAgICAgICogdGhlIHJhZGlvIGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICogLSBjYWxsYmFjazogdGhlIGV2ZW50IGNhbGxiYWNrCi0gICAgICAgICAqIC0gY29va2llOiB0aGUgY29va2llIHRvIHBhc3Mgd2hlbiBjYWxsaW5nIHRoZSBjYWxsYmFjawotICAgICAgICAgKiAtIHR1bmVyOiB3aGVyZSB0byByZXR1cm4gdGhlIHR1bmVyIGludGVyZmFjZQotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBIVyB3YXMgcG93ZXJlZCB1cCBhbmQgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBhcHBsaWVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGlzIGludmFsaWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX0NPTkZJRyBNVVNUIGJlIGNhbGxlZCBvbmNlIHRoZQotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGlzIGFwcGxpZWQgb3IgYSBmYWlsdXJlIG9jY3VycyBvciBhZnRlciBhIHRpbWUgb3V0LgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ2xvc2UgYSB0dW5lciBpbnRlcmZhY2UuCi0gICAgICAgICAqIElmIHRoZSBsYXN0IHR1bmVyIGlzIGNsb3NlZCwgdGhlIHJhZGlvIG1vZHVsZSBpcyBkZWFjdGl2YXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIHR1bmVyOiB0aGUgdHVuZXIgaW50ZXJmYWNlIHRvIGNsb3NlCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHBvd2VyZWQgZG93biBzdWNjZXNzZnVsbHkuCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGFuIGludmFsaWQgYXJndW1lbnQgaXMgcGFzc2VkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIFJhZGlvSW50ZXJmYWNlKCkge30KLSAgICAgICAgdmlydHVhbCAgICAgflJhZGlvSW50ZXJmYWNlKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MGVlODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSAgICA4NzUwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEgICAgMTA4MDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxICAxMDAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIgICAgODc5MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyICAgIDEwNzkwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMiAgMjAwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiAgICA3NjAwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOICAgIDkwMDAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTiAgMTAwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJUICAgIDY1ODAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCAgICA3NDAwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVCAgMTAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0xXICAgICAgICAgMTUzCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTFcgICAgICAgICAyNzkKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0xXICAgICAgIDkKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEgICAgNTMxCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMSAgICAxNjExCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxICA5Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyICAgIDU0MAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIgICAgMTYxMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMiAgMTAKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX1NXICAgICAgICAgMjMwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX1NXICAgICAgICAgMjYxMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX1NXICAgICAgIDUKLQotCi0jaWZuZGVmIEFSUkFZX1NJWkUKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0jZW5kaWYKLQotY29uc3QgcmFkaW9fYmFuZF9jb25maWdfdCBzS25vd25SZWdpb25Db25maWdzW10gPSB7Ci0gICAgeyAgIC8vIEZNIElUVSAxCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBBbWVyaWNhcwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfVVMsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gSmFwYW4KLSAgICAgICAgUkFESU9fUkVHSU9OX0pBUEFOLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSkFQQU4sCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0pBUEFOLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSkFQQU59LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEtvcmVhCi0gICAgICAgIFJBRElPX1JFR0lPTl9LT1JFQSwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUxfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBPSVJUCi0gICAgICAgIFJBRElPX1JFR0lPTl9PSVJULAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fT0lSVCwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fT0lSVCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX09JUlR9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1dPUkxELAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIFVTIEhEIHJhZGlvCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9GTV9IRCwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfVVMsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gTFcKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAotICAgICAgICB7Ci0gICAgICAgICAgICBSQURJT19CQU5EX0FNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0xXLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9MVywKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0xXfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIFNXCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9TVywKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfU1csCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19TV30sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBNVyBJVFUxCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQxLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMX0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBNVyBJVFUyCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9NV19JVVQyLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9NV19JVFUyLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMn0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViN2MwOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KLSNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJSYWRpb1JlZ2lvbnMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciBrUmFkaW9UdW5lckF1ZGlvRGV2aWNlTmFtZVtdID0gIlJhZGlvIHR1bmVyIHNvdXJjZSI7Ci0KLXN0YXRpYyBjb25zdCBTdHJpbmcxNiBSQURJT19QRVJNSVNTSU9OKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZNX1JBRElPIik7Ci0KLVJhZGlvU2VydmljZTo6UmFkaW9TZXJ2aWNlKCkKLSAgICA6IEJuUmFkaW9TZXJ2aWNlKCksIG1OZXh0VW5pcXVlSWQoMSkKLXsKLSAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6b25GaXJzdFJlZigpCi17Ci0gICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHNwPFJhZGlvSW50ZXJmYWNlPiBkZXYgPSBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShSQURJT19DTEFTU19BTV9GTSk7Ci0KLSAgICBpZiAoZGV2ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX3Byb3BlcnRpZXMgaGFsUHJvcGVydGllczsKLSAgICBpbnQgcmMgPSBkZXYtPmdldFByb3BlcnRpZXMoJmhhbFByb3BlcnRpZXMpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByYWRpb19wcm9wZXJ0aWVzX3QgcHJvcGVydGllczsKLSAgICBwcm9wZXJ0aWVzLmhhbmRsZSA9Ci0gICAgICAgICAgICAocmFkaW9faGFuZGxlX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKLSAgICBjb252ZXJ0UHJvcGVydGllcygmcHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOwotCi0gICAgQUxPR0koImxvYWRlZCBkZWZhdWx0IG1vZHVsZSAlcywgdmVyICVzLCBoYW5kbGUgJWQiLCBwcm9wZXJ0aWVzLnByb2R1Y3QsCi0gICAgICAgIHByb3BlcnRpZXMudmVyc2lvbiwgcHJvcGVydGllcy5oYW5kbGUpOwotCi0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBuZXcgTW9kdWxlKGRldiwgcHJvcGVydGllcyk7Ci0gICAgbU1vZHVsZXMuYWRkKHByb3BlcnRpZXMuaGFuZGxlLCBtb2R1bGUpOwotfQotCi1SYWRpb1NlcnZpY2U6On5SYWRpb1NlcnZpY2UoKQotewotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Omxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOwotCi0gICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgdWludDMyX3QgbWF4TW9kdWxlcyA9ICpudW1Nb2R1bGVzOwotICAgICpudW1Nb2R1bGVzID0gbU1vZHVsZXMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpICYmIGkgPCBtYXhNb2R1bGVzOyBpKyspIHsKLSAgICAgICAgcHJvcGVydGllc1tpXSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSktPnByb3BlcnRpZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBTE9HVigiJXMgJWQgY29uZmlnICVwIHdpdGhBdWRpbyAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlLCBjb25maWcsIHdpdGhBdWRpbyk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOwotICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNzaXplX3QgaW5kZXggPSBtTW9kdWxlcy5pbmRleE9mS2V5KGhhbmRsZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmZpZyA9IG1vZHVsZS0+Z2V0RGVmYXVsdENvbmZpZygpOwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiJXMgcmVnaW9uICVkIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZy0+cmVnaW9uLCBjb25maWctPmJhbmQudHlwZSk7Ci0KLSAgICByYWRpbyA9IG1vZHVsZS0+YWRkQ2xpZW50KGNsaWVudCwgY29uZmlnLCB3aXRoQXVkaW8pOwotCi0gICAgaWYgKHJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKLQotc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCi17Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBSYWRpb1NlcnZpY2UiKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gUmFkaW9TZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKLSAgICAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlJhZGlvU2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0KLS8qIHN0YXRpYyAqLwotdm9pZCBSYWRpb1NlcnZpY2U6OmNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKQotewotICAgIG1lbXNldChwcm9wZXJ0aWVzLCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICBwcm9wZXJ0aWVzLT5jbGFzc19pZCA9IGhhbFByb3BlcnRpZXMtPmNsYXNzX2lkOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+aW1wbGVtZW50b3IsIGhhbFByb3BlcnRpZXMtPmltcGxlbWVudG9yLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdCwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnZlcnNpb24sIGhhbFByb3BlcnRpZXMtPnZlcnNpb24sCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5zZXJpYWwsIGhhbFByb3BlcnRpZXMtPnNlcmlhbCwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtX3R1bmVyczsKLSAgICBwcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlcyA9IGhhbFByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzOwotICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNLbm93blJlZ2lvbkNvbmZpZ3MpOyBpKyspIHsKLSAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmJhbmQgPSAmc0tub3duUmVnaW9uQ29uZmlnc1tpXS5iYW5kOwotICAgICAgICBzaXplX3QgajsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kczsgaisrKSB7Ci0gICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqaGFsQmFuZCA9ICZoYWxQcm9wZXJ0aWVzLT5iYW5kc1tqXTsKLSAgICAgICAgICAgIHNpemVfdCBrOwotICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgIT0gaGFsQmFuZC0+dHlwZSkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+bG93ZXJfbGltaXQgPCBoYWxCYW5kLT5sb3dlcl9saW1pdCkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dXBwZXJfbGltaXQgPiBoYWxCYW5kLT51cHBlcl9saW1pdCkgY29udGludWU7Ci0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaGFsQmFuZC0+bnVtX3NwYWNpbmdzOyBrKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFuZC0+c3BhY2luZ3NbMF0gPT0gaGFsQmFuZC0+c3BhY2luZ3Nba10pIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGsgPT0gaGFsQmFuZC0+bnVtX3NwYWNpbmdzKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChiYW5kLT50eXBlID09IFJBRElPX0JBTkRfQU0pIGJyZWFrOwotICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5kZWVtcGhhc2lzICYgaGFsQmFuZC0+Zm0uZGVlbXBoYXNpcykgPT0gMCkgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoaGFsQmFuZC0+Zm0ucmRzID09IDApIGJyZWFrOwotICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5yZHMgJiBoYWxCYW5kLT5mbS5yZHMpICE9IDApIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqID09IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kcykgY29udGludWU7Ci0KLSAgICAgICAgQUxPR0koImNvbnZlcnRQcm9wZXJ0aWVzKCkgQWRkaW5nIGJhbmQgdHlwZSAlZCByZWdpb24gJWQiLAotICAgICAgICAgICAgICBzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQudHlwZSAsIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0ucmVnaW9uKTsKLQotICAgICAgICBtZW1jcHkoJnByb3BlcnRpZXMtPmJhbmRzW3Byb3BlcnRpZXMtPm51bV9iYW5kcysrXSwKLSAgICAgICAgICAgICAgICZzS25vd25SZWdpb25Db25maWdzW2ldLAotICAgICAgICAgICAgICAgc2l6ZW9mKHJhZGlvX2JhbmRfY29uZmlnX3QpKTsKLSAgICB9Ci19Ci0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQiCi0KLVJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OkNhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkKLSAgICA6IG1Nb2R1bGVDbGllbnQobW9kdWxlQ2xpZW50KSwgbU1lbW9yeURlYWxlcihuZXcgTWVtb3J5RGVhbGVyKDEwMjQgKiAxMDI0LCAiUmFkaW9TZXJ2aWNlIikpCi17Ci19Ci0KLVJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6On5DYWxsYmFja1RocmVhZCgpCi17Ci0gICAgbUV2ZW50UXVldWUuY2xlYXIoKTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4oIlJhZGlvU2VydmljZSBjYmsiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Ci19Ci0KLWJvb2wgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7Ci0gICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OwotICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOwotICAgICAgICAgICAgd2hpbGUgKG1FdmVudFF1ZXVlLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHNsZWVwIik7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZC53YWl0KG1DYWxsYmFja0xvY2spOwotICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHdha2UgdXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBldmVudE1lbW9yeSA9IG1FdmVudFF1ZXVlWzBdOwotICAgICAgICAgICAgbUV2ZW50UXVldWUucmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICBtb2R1bGVDbGllbnQgPSBtTW9kdWxlQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kdWxlQ2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIG1vZHVsZUNsaWVudC0+b25DYWxsYmFja0V2ZW50KGV2ZW50TWVtb3J5KTsKLSAgICAgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OmV4aXQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1DYWxsYmFja0NvbmQuYnJvYWRjYXN0KCk7Ci19Ci0KLXNwPElNZW1vcnk+IFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7Ci0KLSAgICAvLyBUaGUgZXZlbnQgbGF5b3V0IGluIHNoYXJlZCBtZW1vcnkgaXM6Ci0gICAgLy8gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgYnl0ZXMgOiB0aGUgZXZlbnQgaXRzZWxmCi0gICAgLy8gNCBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBzaXplIG9yIDAKLSAgICAvLyBOIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ldGFkYXRhIGlmIHByZXNlbnQKLSAgICB1aW50MzJfdCBtZXRhZGF0YU9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpICsgc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50MzJfdCBtZXRhZGF0YVNpemUgPSAwOwotCi0gICAgc3dpdGNoIChoYWxFdmVudC0+dHlwZSkgewotICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6Ci0gICAgICAgIGlmIChyYWRpb19tZXRhZGF0YV9jaGVjayhoYWxFdmVudC0+aW5mby5tZXRhZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgbWV0YWRhdGFTaXplID0gKHVpbnQzMl90KXJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgotICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfY2hlY2soaGFsRXZlbnQtPm1ldGFkYXRhKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0YWRhdGFTaXplID0gKHVpbnQzMl90KXJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5tZXRhZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUobWV0YWRhdGFPZmZzZXQgKyBtZXRhZGF0YVNpemUpOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7Ci0gICAgfQotCi0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotCi0gICAgKih1aW50MzJfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQgLSBzaXplb2YodWludDMyX3QpKSA9IG1ldGFkYXRhU2l6ZTsKLQotICAgIGV2ZW50LT50eXBlID0gaGFsRXZlbnQtPnR5cGU7Ci0gICAgZXZlbnQtPnN0YXR1cyA9IGhhbEV2ZW50LT5zdGF0dXM7Ci0KLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9DT05GSUc6Ci0gICAgICAgIGV2ZW50LT5jb25maWcuYmFuZCA9IGhhbEV2ZW50LT5jb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6Ci0gICAgICAgIGV2ZW50LT5pbmZvID0gaGFsRXZlbnQtPmluZm87Ci0gICAgICAgIGlmIChtZXRhZGF0YVNpemUgIT0gMCkgewotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCwgaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UQToKLSAgICBjYXNlIFJBRElPX0VWRU5UX0VBOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQU5URU5OQToKLSAgICBjYXNlIFJBRElPX0VWRU5UX0NPTlRST0w6Ci0gICAgICAgIGV2ZW50LT5vbiA9IGhhbEV2ZW50LT5vbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0LCBoYWxFdmVudC0+bWV0YWRhdGEsIG1ldGFkYXRhU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9IV19GQUlMVVJFOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBldmVudE1lbW9yeTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KQotIHsKLSAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlRXZlbnQoZXZlbnQpOwotICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgQXV0b011dGV4IGxvY2sobUNhbGxiYWNrTG9jayk7Ci0gICAgIG1FdmVudFF1ZXVlLmFkZChldmVudE1lbW9yeSk7Ci0gICAgIG1DYWxsYmFja0NvbmQuc2lnbmFsKCk7Ci0gICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKLX0KLQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6Ok1vZHVsZSIKLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Ok1vZHVsZShzcDxSYWRpb0ludGVyZmFjZT4gaHdEZXZpY2UsIHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcykKLSA6IG1Id0RldmljZShod0RldmljZSksIG1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtTXV0ZSh0cnVlKQotewotfQotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZTo6fk1vZHVsZSgpIHsKLSAgICBtSHdEZXZpY2UuY2xlYXIoKTsKLSAgICBtTW9kdWxlQ2xpZW50cy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6ZHVtcChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNwPFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50PiBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6YWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbykKLXsKLSAgICBBTE9HVigiYWRkQ2xpZW50KCkgJXAgY29uZmlnICVwIHByb2R1Y3QgJXMiLCB0aGlzLCBjb25maWcsIG1Qcm9wZXJ0aWVzLnByb2R1Y3QpOwotCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAobUh3RGV2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Y2xpZW50KCkgPT0gY2xpZW50KSB7Ci0gICAgICAgICAgICAvLyBjbGllbnQgYWxyZWFkeSBjb25uZWN0ZWQ6IHJlamVjdAotICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtb2R1bGVDbGllbnQgPSBuZXcgTW9kdWxlQ2xpZW50KHRoaXMsIGNsaWVudCwgY29uZmlnLCBhdWRpbyk7Ci0KLSAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICBoYWxDb25maWcgPSBjb25maWctPmJhbmQ7Ci0KLSAgICAvLyBUdW5lciBwcmVlbXB0aW9uIGxvZ2ljOgotICAgIC8vIFRoZXJlIGlzIGEgbGltaXRlZCBhbW91bnQgb2YgdHVuZXJzIGFuZCBhIGxpbWl0ZWQgYW1vdW50IG9mIHJhZGlvIGF1ZGlvIHNvdXJjZXMgcGVyIG1vZHVsZS4KLSAgICAvLyBUaGUgbWluaW11bSBpcyBvbmUgdHVuZXIgYW5kIG9uZSBhdWRpbyBzb3VyY2UuCi0gICAgLy8gVGhlIG51bWJlcnMgb2YgdHVuZXJzIGFuZCBzb3VyY2VzIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIG1vZHVsZSBwcm9wZXJ0aWVzLgotICAgIC8vIE5PVEU6IGN1cnJlbnQgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgb25lIHJhZGlvIGF1ZGlvIHNvdXJjZS4KLSAgICAvLyBJdCBpcyBwb3NzaWJsZSB0byBvcGVuIG1vcmUgdGhhbiBvbmUgdHVuZXIgYXQgYSB0aW1lIGJ1dCBvbmx5IG9uZSB0dW5lciBjYW4gYmUgY29ubmVjdGVkCi0gICAgLy8gdG8gdGhlIHJhZGlvIGF1ZGlvIHNvdXJjZSAoQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKS4KLSAgICAvLyBUaGUgYmFzZSBydWxlIGlzIHRoYXQgYSBuZXdseSBjb25uZWN0ZWQgdHVuZXIgYWx3YXlzIHdpbnMsIGkuZS4gYWx3YXlzIGdldHMgYSB0dW5lcgotICAgIC8vIGFuZCBjYW4gdXNlIHRoZSBhdWRpbyBzb3VyY2UgaWYgcmVxdWVzdGVkLgotICAgIC8vIElmIGFub3RoZXIgY2xpZW50IGlzIHByZWVtcHRlZCwgaXQgaXMgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoIFJBRElPX0VWRU5UX0NPTlRST0wKLSAgICAvLyBpbmRpY2F0aW5nIGxvc3Mgb2YgY29udHJvbC4KLSAgICAvLyAtIElmIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50IHJlcXVlc3RzIHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IHRydWUpOgotICAgIC8vICAgIC0gaWYgYW4gYXVkaW8gc291cmNlIGlzIGF2YWlsYWJsZQotICAgIC8vICAgICAgICAgIG5vIHByb2JsZW0KLSAgICAvLyAgICAtIGlmIG5vdDoKLSAgICAvLyAgICAgICAgICB0aGUgb2xkZXN0IGNsaWVudCBpbiB0aGUgbGlzdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQuCi0gICAgLy8gLSBJZiB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudCBkb2VzIG5vdCByZXF1ZXN0IHRoZSBhdWRpbyBzb3VyY2UgKGF1ZGlvID09IGZhbHNlKToKLSAgICAvLyAgICAtIGlmIGEgdHVuZXIgaXMgYXZhaWxhYmxlCi0gICAgLy8gICAgICAgICAgbm8gcHJvYmxlbQotICAgIC8vICAgIC0gaWYgbm90OgotICAgIC8vICAgICAgICAgIFRoZSBvbGRlc3QgY2xpZW50IG5vdCB1c2luZyBhdWRpbyBpcyBwcmVlbXB0ZWQgZmlyc3QgYW5kIGlmIG5vbmUgaXMgZm91bmQgdGhlCi0gICAgLy8gICAgICAgICAgdGhlIG9sZGVzdCBjbGllbnQgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkLgotICAgIC8vIEVhY2ggdGltZSBhIHR1bmVyIHVzaW5nIHRoZSBhdWRpbyBzb3VyY2UgaXMgb3BlbmVkIG9yIGNsb3NlZCwgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzCi0gICAgLy8gbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24gb3IgZGlzY29ubmVjdGlvbiBvZiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIuCi0KLSAgICBzcDxNb2R1bGVDbGllbnQ+IG9sZGVzdFR1bmVyOwotICAgIHNwPE1vZHVsZUNsaWVudD4gb2xkZXN0QXVkaW87Ci0gICAgc2l6ZV90IGFsbG9jYXRlZFR1bmVycyA9IDA7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZEF1ZGlvID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+Z2V0VHVuZXIoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkZXN0QXVkaW8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvbGRlc3RBdWRpbyA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRBdWRpbysrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob2xkZXN0VHVuZXIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBvbGRlc3RUdW5lciA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRUdW5lcnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPFR1bmVySW50ZXJmYWNlPiBoYWxUdW5lcjsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IHByZWVtdGVkQ2xpZW50OwotICAgIGlmIChhdWRpbykgewotICAgICAgICBpZiAoYWxsb2NhdGVkQXVkaW8gPj0gbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMpIHsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdEF1ZGlvICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRBdWRpby9vbGRlc3RBdWRpbyBtaXNtYXRjaCIpOwotICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyArIGFsbG9jYXRlZFR1bmVycyA+PSBtUHJvcGVydGllcy5udW1fdHVuZXJzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb2NhdGVkVHVuZXJzICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RUdW5lciAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkVHVuZXJzL29sZGVzdFR1bmVyIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RUdW5lcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAgICAgcHJlZW10ZWRDbGllbnQgPSBvbGRlc3RBdWRpbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocHJlZW10ZWRDbGllbnQgIT0gMCkgewotICAgICAgICBoYWxUdW5lciA9IHByZWVtdGVkQ2xpZW50LT5nZXRUdW5lcigpOwotICAgICAgICBzcDxUdW5lckludGVyZmFjZT4gY2xlYXI7Ci0gICAgICAgIHByZWVtdGVkQ2xpZW50LT5zZXRUdW5lcihjbGVhcik7Ci0gICAgICAgIG1Id0RldmljZS0+Y2xvc2VUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIGlmIChwcmVlbXRlZENsaWVudC0+YXVkaW8oKSkgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuVHVuZXIoJmhhbENvbmZpZywgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIHNldFR1bmVyICVwIiwgaGFsVHVuZXIuZ2V0KCkpOwotICAgICAgICBtb2R1bGVDbGllbnQtPnNldFR1bmVyKGhhbFR1bmVyKTsKLSAgICAgICAgbU1vZHVsZUNsaWVudHMuYWRkKG1vZHVsZUNsaWVudCk7Ci0gICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoImFkZENsaWVudCgpIERPTkUgbW9kdWxlQ2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiJXMgb3Blbl90dW5lciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgbW9kdWxlQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6cmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkgewotICAgIEFMT0dWKCJyZW1vdmVDbGllbnQoKSIpOwotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpbnQgcmV0OwotICAgIHNzaXplX3QgaW5kZXggPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldID09IG1vZHVsZUNsaWVudCkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtTW9kdWxlQ2xpZW50cy5yZW1vdmVBdChpbmRleCk7Ci0gICAgc3A8VHVuZXJJbnRlcmZhY2U+IGhhbFR1bmVyID0gbW9kdWxlQ2xpZW50LT5nZXRUdW5lcigpOwotICAgIGlmIChoYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUh3RGV2aWNlICE9IDApIHsKLSAgICAgICAgbUh3RGV2aWNlLT5jbG9zZVR1bmVyKGhhbFR1bmVyKTsKLSAgICB9Ci0KLSAgICBpZiAobW9kdWxlQ2xpZW50LT5hdWRpbygpKSB7Ci0gICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24oZmFsc2UsICIiKTsKLSAgICB9Ci0KLSAgICBtTXV0ZSA9IHRydWU7Ci0KLSAgICBpZiAobU1vZHVsZUNsaWVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUh3RGV2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFR1bmVyIHJlYWxsb2NhdGlvbiBsb2dpYzoKLSAgICAvLyBXaGVuIGEgY2xpZW50IGlzIHJlbW92ZWQgYW5kIHdhcyBjb250cm9sbGluZyBhIHR1bmVyLCB0aGlzIHR1bmVyIHdpbGwgYmUgYWxsb2NhdGVkIHRvIGEKLSAgICAvLyBwcmV2aW91c2x5IHByZWVtcHRlZCBjbGllbnQuIFRoaXMgY2xpZW50IHdpbGwgYmUgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoCi0gICAgLy8gUkFESU9fRVZFTlRfQ09OVFJPTCBpbmRpY2F0aW5nIGdhaW4gb2YgY29udHJvbC4KLSAgICAvLyAtIElmIGEgcHJlZW1wdGVkIGNsaWVudCBpcyB3YWl0aW5nIGZvciBhbiBhdWRpbyBzb3VyY2UgYW5kIG9uZSBiZWNvbWVzIGF2YWlsYWJsZToKLSAgICAvLyAgICBBbGxvY2F0ZSB0aGUgdHVuZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgY2xpZW50IHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZQotICAgIC8vIC0gSWYgbm90OgotICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQuCi0gICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKLSAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KLQotICAgIHNwPE1vZHVsZUNsaWVudD4geW91bmdlc3RDbGllbnQ7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudEF1ZGlvOwotICAgIHNpemVfdCBhbGxvY2F0ZWRUdW5lcnMgPSAwOwotICAgIHNpemVfdCBhbGxvY2F0ZWRBdWRpbyA9IDA7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSBtTW9kdWxlQ2xpZW50cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmdldFR1bmVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50QXVkaW8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudCA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR19BU1NFUlQoYWxsb2NhdGVkVHVuZXJzICsgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fdHVuZXJzLAotICAgICAgICAgICAgICAgICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBidXQgbm8gdHVuZXIgYXZhaWxhYmxlIik7Ci0KLSAgICBBTE9HX0FTU0VSVCghbW9kdWxlQ2xpZW50LT5hdWRpbygpIHx8IGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgYXVkaW8gY2xpZW50IGJ1dCBubyB0dW5lciB3aXRoIGF1ZGlvIGF2YWlsYWJsZSIpOwotCi0gICAgaWYgKGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMgJiYgeW91bmdlc3RDbGllbnRBdWRpbyAhPSAwKSB7Ci0gICAgICAgIHlvdW5nZXN0Q2xpZW50ID0geW91bmdlc3RDbGllbnRBdWRpbzsKLSAgICB9Ci0KLSAgICBBTE9HX0FTU0VSVCh5b3VuZ2VzdENsaWVudCAhPSAwLCAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBjbGllbnQgbm8gY2FuZGlkYXRlIGZvdW5kIGZvciB0dW5lciIpOwotCi0gICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWcgPSB5b3VuZ2VzdENsaWVudC0+aGFsQ29uZmlnKCk7Ci0gICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuVHVuZXIoJmhhbENvbmZpZywgeW91bmdlc3RDbGllbnQtPmF1ZGlvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIpOwotCi0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIHlvdW5nZXN0Q2xpZW50LT5zZXRUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIGlmICh5b3VuZ2VzdENsaWVudC0+YXVkaW8oKSkgewotICAgICAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbih0cnVlLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpzZXRNdXRlKGJvb2wgbXV0ZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtdXRlICE9IG1NdXRlKSB7Ci0gICAgICAgIG1NdXRlID0gbXV0ZTsKLSAgICAgICAgLy9UT0RPIG5vdGlmaWZ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG9mIG1lZGlhIGFjdGl2aXR5IG9uIHJhZGlvIGF1ZGlvIGRldmljZQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAqbXV0ZSA9IG1NdXRlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi1jb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKlJhZGlvU2VydmljZTo6TW9kdWxlOjpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QKLXsKLSAgICBpZiAobVByb3BlcnRpZXMubnVtX2JhbmRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAmbVByb3BlcnRpZXMuYmFuZHNbMF07Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6Om5vdGlmeURldmljZUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpIHsKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA/IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIGtSYWRpb1R1bmVyQXVkaW9EZXZpY2VOYW1lKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLX0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQiCi0KLVJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvKQotIDogbU1vZHVsZShtb2R1bGUpLCBtQ2xpZW50KGNsaWVudCksIG1Db25maWcoKmNvbmZpZyksIG1BdWRpbyhhdWRpbyksIG1UdW5lcigwKQotewotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcyk7Ci0gICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPmxpbmtUb0RlYXRoKHRoaXMpOwotfQotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6fk1vZHVsZUNsaWVudCgpIHsKLSAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChtQ2FsbGJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KGhhbEV2ZW50KTsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmR1bXAoaW50IGZkIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZGV0YWNoKCkgewotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBzdHJvbmdNZSA9IHRoaXM7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICAgICAgbUNsaWVudC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbW9kdWxlLT5yZW1vdmVDbGllbnQodGhpcyk7Ci19Ci0KLXJhZGlvX2hhbF9iYW5kX2NvbmZpZ190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpoYWxDb25maWcoKSBjb25zdAotewotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gbUNvbmZpZy5iYW5kOwotfQotCi1zcDxUdW5lckludGVyZmFjZT4mIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRUdW5lcigpCi17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBtVHVuZXI7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldFR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpCi17Ci0gICAgQUxPR1YoIiVzICVwIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtVHVuZXIgPSB0dW5lcjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9DT05UUk9MOwotICAgIGV2ZW50LnN0YXR1cyA9IDA7Ci0gICAgZXZlbnQub24gPSBtVHVuZXIgIT0gMDsKLSAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRFdmVudCgmZXZlbnQpOwotICAgIEFMT0dWKCIlcyBET05FIiwgX19GVU5DVElPTl9fKTsKLQotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnLT5iYW5kOwotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zZXRDb25maWd1cmF0aW9uKCZoYWxDb25maWcpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ29uZmlnID0gKmNvbmZpZzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Db25maWcgPSAqY29uZmlnOwotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLQotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0Q29uZmlndXJhdGlvbigmaGFsQ29uZmlnKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gaGFsQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotICAgICpjb25maWcgPSBtQ29uZmlnOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGU7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgaWYgKG1UdW5lciA9PSAwIHx8ICFtQXVkaW8pIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtb2R1bGUtPnNldE11dGUobXV0ZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TXV0ZShib29sICptdXRlKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGU7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZS0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c2NhbihkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c3RlcChkaXJlY3Rpb24sIHNraXBTdWJDaGFubmVsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnR1bmUodWludDMyX3QgY2hhbm5lbCwgdWludDMyX3Qgc3ViQ2hhbm5lbCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnR1bmUoY2hhbm5lbCwgc3ViQ2hhbm5lbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpjYW5jZWwoKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Y2FuY2VsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmdldFByb2dyYW1JbmZvcm1hdGlvbihpbmZvKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6aGFzQ29udHJvbChib29sICpoYXNDb250cm9sKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICpoYXNDb250cm9sID0gbVR1bmVyICE9IDA7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQotewotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByYWRpb19ldmVudF90ICpldmVudCA9IChyYWRpb19ldmVudF90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgewotICAgICAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKLSAgICAgICAgICAgIG1Db25maWcuYmFuZCA9IGV2ZW50LT5jb25maWcuYmFuZDsKLSAgICAgICAgICAgIGV2ZW50LT5jb25maWcucmVnaW9uID0gbUNvbmZpZy5yZWdpb247Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKLSAgICB9Ci0gICAgaWYgKGNsaWVudCAhPSAwKSB7Ci0gICAgICAgIGNsaWVudC0+b25FdmVudChldmVudE1lbW9yeSk7Ci0gICAgfQotfQotCi0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmJpbmRlckRpZWQoCi0gICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgewotICAgIEFMT0dXKCJjbGllbnQgYmluZGVyIGRpZWQgZm9yIGNsaWVudCAlcCIsIHRoaXMpOwotICAgIGRldGFjaCgpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZWI3YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0vLyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlICJSYWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lbW9yeUhlYXBCYXNlOwotCi1jbGFzcyBSYWRpb1NlcnZpY2UgOgotICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFJhZGlvU2VydmljZT4sCi0gICAgcHVibGljIEJuUmFkaW9TZXJ2aWNlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPjsKLQotcHVibGljOgotICAgIGNsYXNzIE1vZHVsZUNsaWVudDsKLSAgICBjbGFzcyBNb2R1bGU7Ci0KLSAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEucmFkaW8iOyB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU2VydmljZSgpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgflJhZGlvU2VydmljZSgpOwotCi0gICAgLy8gSVJhZGlvU2VydmljZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0KLSAgICBjbGFzcyBNb2R1bGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICBNb2R1bGUoc3A8UmFkaW9JbnRlcmZhY2U+IGh3RGV2aWNlLAotICAgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKLQotICAgICAgIHZpcnR1YWwgfk1vZHVsZSgpOwotCi0gICAgICAgICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IGFkZENsaWVudChjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7Ci0KLSAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7Ci0KLSAgICAgICAgICAgICAgIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgc3A8UmFkaW9JbnRlcmZhY2U+IGh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9Ci0gICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJuIG1Qcm9wZXJ0aWVzOyB9Ci0gICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpnZXREZWZhdWx0Q29uZmlnKCkgY29uc3QgOwotCi0gICAgcHJpdmF0ZToKLQotICAgICAgIHZvaWQgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihib29sIGNvbm5lY3RlZCwgY29uc3QgY2hhciAqYWRkcmVzcyk7Ci0KLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgICAgIC8vIHByb3RlY3RzICBtTW9kdWxlQ2xpZW50cwotICAgICAgICBzcDxSYWRpb0ludGVyZmFjZT4gICAgICAgICAgICBtSHdEZXZpY2U7ICAgICAgLy8gSEFMIGhhcmR3YXJlIGRldmljZQotICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBtUHJvcGVydGllczsgICAgLy8gY2FjaGVkIGhhcmR3YXJlIG1vZHVsZSBwcm9wZXJ0aWVzCi0gICAgICAgIFZlY3Rvcjwgc3A8TW9kdWxlQ2xpZW50PiA+ICAgIG1Nb2R1bGVDbGllbnRzOyAvLyBsaXN0IG9mIGF0dGFjaGVkIGNsaWVudHMKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbU11dGU7ICAgICAgICAgIC8vIHJhZGlvIGF1ZGlvIHNvdXJjZSBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB1bm11dGVkLCBhdWRpbyBpcyByb3V0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBtZWRpYSB1c2UgY2FzZS4KLSAgICB9OyAvLyBjbGFzcyBNb2R1bGUKLQotICAgIGNsYXNzIENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIGV4cGxpY2l0IENhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7Ci0KLSAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tUaHJlYWQoKTsKLQotCi0gICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgICAgICAgICAgICAgIHZvaWQgZXhpdCgpOwotCi0gICAgICAgICAgICAgICAgdm9pZCBzZW5kRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHdwPE1vZHVsZUNsaWVudD4gICAgICBtTW9kdWxlQ2xpZW50OyAgICAvLyBjbGllbnQgbW9kdWxlIHRoZSB0aHJlYWQgYmVsb25ncyB0bwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgbUNhbGxiYWNrQ29uZDsgICAgLy8gY29uZGl0aW9uIHNpZ25hbGVkIHdoZW4gYSBuZXcgZXZlbnQgaXMgcG9zdGVkCi0gICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tMb2NrOyAgICAvLyBwcm90ZWN0cyBtRXZlbnRRdWV1ZQotICAgICAgICBWZWN0b3I8IHNwPElNZW1vcnk+ID4gbUV2ZW50UXVldWU7ICAgICAgLy8gcGVuZGluZyBjYWxsYmFjayBldmVudHMKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiAgICAgIG1NZW1vcnlEZWFsZXI7ICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIGNhbGxiYWNrIGV2ZW50Ci0gICAgfTsgLy8gY2xhc3MgQ2FsbGJhY2tUaHJlYWQKLQotICAgIGNsYXNzIE1vZHVsZUNsaWVudCA6IHB1YmxpYyBCblJhZGlvLAotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHVuZXJDYWxsYmFja0ludGVyZmFjZSB7Ci0gICAgcHVibGljOgotCi0gICAgICAgTW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7Ci0KLSAgICAgICB2aXJ0dWFsIH5Nb2R1bGVDbGllbnQoKTsKLQotICAgICAgIC8vIElSYWRpbwotICAgICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbyk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgICAgICAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9Ci0gICAgICAgICAgICAgICB3cDxNb2R1bGU+IG1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KLSAgICAgICAgICAgICAgIHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190IGhhbENvbmZpZygpIGNvbnN0OwotICAgICAgICAgICAgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+IGNhbGxiYWNrVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrVGhyZWFkOyB9Ci0gICAgICAgICAgICAgICB2b2lkIHNldFR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiBnZXRUdW5lcigpOwotICAgICAgICAgICAgICAgYm9vbCBhdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpbzsgfQotCi0gICAgICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnQpOwotCi0gICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotCi0gICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7Ci0KLSAgICAgICAvLyBUdW5lckNhbGxiYWNrSW50ZXJmYWNlCi0gICAgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgLy8gcHJvdGVjdHMgbUNsaWVudCwgbUNvbmZpZyBhbmQgbVR1bmVyCi0gICAgICAgIHdwPE1vZHVsZT4gICAgICAgICAgICAgICAgICBtTW9kdWxlOyAgICAgICAgIC8vIFRoZSBtb2R1bGUgdGhpcyBjbGllbnQgaXMgYXR0YWNoZWQgdG8KLSAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiAgICAgICAgICAgIG1DbGllbnQ7ICAgICAgICAgLy8gZXZlbnQgY2FsbGJhY2sgYmluZGVyIGludGVyZmFjZQotICAgICAgICByYWRpb19iYW5kX2NvbmZpZ190ICAgICAgICAgbUNvbmZpZzsgICAgICAgICAvLyBjdXJyZW50IGJhbmQgY29uZmlndXJhdGlvbgotICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOyAvLyBldmVudCBjYWxsYmFjayB0aHJlYWQKLSAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1BdWRpbzsKLSAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+ICAgICAgICAgIG1UdW5lcjsgICAgICAgIC8vIEhBTCB0dW5lciBpbnRlcmZhY2UuIE5VTEwgaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNsaWVudCBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb24gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVuZXIKLSAgICB9OyAvLyBjbGFzcyBNb2R1bGVDbGllbnQKLQotCi0gICAgc3RhdGljIHZvaWQgY2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpOwotCi1wcml2YXRlOgotCi0gICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKTsKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsgICAvLyBwcm90ZWN0cyBtTW9kdWxlcwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU5leHRVbmlxdWVJZDsgIC8vIGZvciBtb2R1bGUgSUQgYWxsb2NhdGlvbgotICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcmFkaW9faGFuZGxlX3QsIHNwPE1vZHVsZT4gPiBtTW9kdWxlczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9yYWRpby9UdW5lckNhbGxiYWNrSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzNjY2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9DQUxMQkFDS19JTlRFUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVHVuZXJDYWxsYmFja0ludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpID0gMDsKLQotcHJvdGVjdGVkOgotICAgICAgICAgICAgICAgICBUdW5lckNhbGxiYWNrSW50ZXJmYWNlKCkge30KLSAgICB2aXJ0dWFsICAgICAgflR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UoKSB7fQotCi19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0NBTExCQUNLX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oIGIvc2VydmljZXMvcmFkaW8vVHVuZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2NTdkMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9yYWRpby9UdW5lckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVFVORVJfSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFR1bmVySW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSBjdXJyZW50IHJhZGlvIGJhbmQgY29uZmlndXJhdGlvbiAoYmFuZCwgcmFuZ2UsIGNoYW5uZWwgc3BhY2luZyAuLi4pLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB0aGUgYmFuZCBjb25maWd1cmF0aW9uIHRvIGFwcGx5Ci0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgYXBwbGllZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBpcyBpbnZhbGlkCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9DT05GSUcgTVVTVCBiZSBjYWxsZWQgb25jZSB0aGUKLSAgICAgICAgICogY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkIG9yIGEgZmFpbHVyZSBvY2N1cnMgb3IgYWZ0ZXIgYSB0aW1lIG91dC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgY3VycmVudCByYWRpbyBiYW5kIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHdoZXJlIHRvIHJldHVybiB0aGUgYmFuZCBjb25maWd1cmF0aW9uCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHZhbGlkIGNvbmZpZ3VyYXRpb24gaXMgcmV0dXJuZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBnZXRDb25maWd1cmF0aW9uKHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCBzY2FubmluZyB1cCB0byBuZXh0IHZhbGlkIHN0YXRpb24uCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBkaXJlY3Rpb246IFJBRElPX0RJUkVDVElPTl9VUCBvciBSQURJT19ESVJFQ1RJT05fRE9XTgotICAgICAgICAgKiAtIHNraXBfc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiBpZ25vcmUgc3ViIGNoYW5uZWxzCi0gICAgICAgICAqICAoZS5nIFNQUyBmb3IgSEQgcmFkaW8pLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBzY2FuIHN1Y2Nlc3NmdWxseSBzdGFydGVkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiAgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqICBsb2NrZWQgb24gYSBzdGF0aW9uIG9yIGFmdGVyIGEgdGltZSBvdXQgb3IgZnVsbCBmcmVxdWVuY3kgc2NhbiBpZgotICAgICAgICAgKiAgbm8gc3RhdGlvbiBmb3VuZC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUgaWYgYSB2YWxpZCBzdGF0aW9uCi0gICAgICAgICAqICBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNb3ZlIG9uZSBjaGFubmVsIHNwYWNpbmcgdXAgb3IgZG93bi4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGRpcmVjdGlvbjogUkFESU9fRElSRUNUSU9OX1VQIG9yIFJBRElPX0RJUkVDVElPTl9ET1dOCi0gICAgICAgICAqIC0gc2tpcF9zdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IGlnbm9yZSBzdWIgY2hhbm5lbHMKLSAgICAgICAgICogIChlLmcgU1BTIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHN0ZXAgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfVFVORUQgTVVTVCBiZSBjYWxsZWQgb25jZQotICAgICAgICAgKiBzdGVwIGNvbXBsZXRlZCBvciBhZnRlciBhIHRpbWUgb3V0LiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZQotICAgICAgICAgKiBpZiBhIHZhbGlkIHN0YXRpb24gaXMgdHVuZWQgb3Igbm90LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVHVuZSB0byBzcGVjaWZpZWQgZnJlcXVlbmN5LgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY2hhbm5lbDogY2hhbm5lbCB0byB0dW5lIHRvLiBBIGZyZXF1ZW5jeSBpbiBrSHogZm9yIEFNL0ZNL0hEIFJhZGlvIGJhbmRzLgotICAgICAgICAgKiAtIHN1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogKGUuZyBTUFMgbnVtYmVyIGZvciBIRCByYWRpbykuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHR1bmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQKLSAgICAgICAgICogIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZQotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9UVU5FRCBNVVNUIGJlIGNhbGxlZCBvbmNlCi0gICAgICAgICAqIHR1bmVkIG9yIGFmdGVyIGEgdGltZSBvdXQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlCi0gICAgICAgICAqIGlmIGEgdmFsaWQgc3RhdGlvbiBpcyB0dW5lZCBvciBub3QuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENhbmNlbCBhIHNjYW4sIHN0ZXAgb3IgdHVuZSBvcGVyYXRpb24uCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIGEgc2Nhbiwgc3RlcCBvciB0dW5lIG9wZXJhdGlvbiBpcyBwZW5kaW5nCi0gICAgICAgICAqIChjYWxsYmFjayBub3QgeWV0IHNlbnQpLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBzdWNjZXNzZnVsCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGNhbGxiYWNrIGlzIG5vdCBzZW50LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBjYW5jZWwoKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmV0cmlldmUgY3VycmVudCBzdGF0aW9uIGluZm9ybWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gaW5mbzogd2hlcmUgdG8gcmV0dXJuIHRoZSBwcm9ncmFtIGluZm8uCi0gICAgICAgICAqIElmIGluZm8tPm1ldGFkYXRhIGlzIE5VTEwuIG5vIG1ldGEgZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICAgICAqIElmIG1ldGEgZGF0YSBtdXN0IGJlIHJldHVybmVkLCB0aGV5IHNob3VsZCBiZSBhZGRlZCB0byBvciBjbG9uZWQgdG8KLSAgICAgICAgICogaW5mby0+bWV0YWRhdGEsIG5vdCBwYXNzZWQgZnJvbSBhIG5ld2x5IGNyZWF0ZWQgbWV0YSBkYXRhIGJ1ZmZlci4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgdHVuZWQgYW5kIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldFByb2dyYW1JbmZvcm1hdGlvbihyYWRpb19wcm9ncmFtX2luZm9fdCAqaW5mbykgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgVHVuZXJJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgICAgIH5UdW5lckludGVyZmFjZSgpIHt9Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVFVORVJfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9PV05FUlMgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2Y2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQordGhvcm50b25jQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggMTlkZDQxZS4uMjI1MTlhMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTg5LDcgKzg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCiB7CiAgICAgQUxPR1YoImxpc3RNb2R1bGVzIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTExMCw3ICsxMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZUludGVyZmFjZSkKIHsKICAgICBBTE9HVigiYXR0YWNoIG1vZHVsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTg1Niw3ICs4NTgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgYm9vbCBzdXBwb3J0c19zdG9wX2FsbCA9Ci0gICAgICAgICAgICAgICAgKG1IYWxJbnRlcmZhY2UgIT0gMCkgJiYgKG1IYWxJbnRlcmZhY2UtPnN0b3BBbGxSZWNvZ25pdGlvbnMoKSA9PSBFTk9TWVMpOworICAgICAgICAgICAgICAgIChtSGFsSW50ZXJmYWNlICE9IDApICYmIChtSGFsSW50ZXJmYWNlLT5zdG9wQWxsUmVjb2duaXRpb25zKCkgIT0gLUVOT1NZUyk7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kZWxzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaSk7CkBAIC05NjAsNyArOTYyLDggQEAKIAogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZGV0YWNoKCkgewogICAgIEFMT0dWKCJkZXRhY2goKSIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC05ODMsNyArOTg2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBBTE9HVigibG9hZFNvdW5kTW9kZWwoKSBoYW5kbGUiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtOTk3LDcgKzEwMDEsOCBAQAogc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEFMT0dWKCJ1bmxvYWRTb3VuZE1vZGVsKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTAxMiw3ICsxMDE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQogewogICAgIEFMT0dWKCJzdGFydFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTAyNiw3ICsxMDMyLDggQEAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEFMT0dWKCJzdG9wUmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvT1dORVJTIGIvc291bmR0cmlnZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNmNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2VsYXVyZW50QGdvb2dsZS5jb20KK3Rob3JudG9uY0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9PV05FUlMgYi90b29scy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjYjAzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGFuZHJvaWQuY29tCg==