ZGlmZiAtLWdpdCBhL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYyBiL2Qvc2VoZXIvaGFldXNlci90b29scy9nZW5lcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU0YzJiCi0tLSAvZGV2L251bGwKKysrIGIvZC9zZWhlci9oYWV1c2VyL3Rvb2xzL2dlbmVyYXRvci5jCkBAIC0wLDAgKzEsNzQwIEBACisjaW5jbHVkZSAiLi4vaGF1cy5oIgorCitpbmhlcml0ICIvcC9zZXJ2aWNlL3dhcmdvbi9zbS9zdGF0ZW1hY2hpbmUiOworCisjaW5jbHVkZSAiL3Avc2VydmljZS93YXJnb24vc20vc3RhdGVtYWNoaW5lLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIFNUQVRFX0lETEUgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfSE9VU0UgICAgICAgICAgMQorI2RlZmluZSBTVEFURV9ST09NICAgICAgICAgICAyCisjZGVmaW5lIFNUQVRFX0NIRVNUICAgICAgICAgIDMKKyNkZWZpbmUgU1RBVEVfREVUQUlMICAgICAgICAgNAorI2RlZmluZSBTVEFURV9SREVUQUlMICAgICAgICA1CisjZGVmaW5lIFNUQVRFX0NPTU1BTkQgICAgICAgIDYKKyNkZWZpbmUgU1RBVEVfRklOQUxJWkUgICAgICAgNworI2RlZmluZSBTVEFURV9FWElUUyAgICAgICAgICA4CisKKyNkZWZpbmUgU0lHX0lOSVRJQUxJWkUgICAgICAgMAorI2RlZmluZSBTSUdfSE9VU0UgICAgICAgICAgICAxCisjZGVmaW5lIFNJR19IT1VTRV9ET05FICAgICAgIDIKKyNkZWZpbmUgU0lHX1JPT00gICAgICAgICAgICAgMworI2RlZmluZSBTSUdfRE9fQ0hFU1QgICAgICAgICA0CisjZGVmaW5lIFNJR19ET19ERVRBSUwgICAgICAgIDUKKyNkZWZpbmUgU0lHX0RFVEFJTF9ET05FICAgICAgNgorI2RlZmluZSBTSUdfUkRFVEFJTF9ET05FICAgICA3CisjZGVmaW5lIFNJR19DT01NQU5EX0RPTkUgICAgIDgKKyNkZWZpbmUgU0lHX0RPX0VYSVRTICAgICAgICAgOQorI2RlZmluZSBTSUdfUk9PTV9ET05FICAgICAgIDEwCisKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBmaWxlOworcHJpdmF0ZSBub3NhdmUgaW50ICAgIGZpbmFsOworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHJhdW07Citwcml2YXRlIG5vc2F2ZSBpbnQgICAgbnI7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgaGF1c21laXN0ZXI7Citwcml2YXRlIG5vc2F2ZSBtaXhlZCAgaG1hcmdzOworCitzdHJpbmcgZHVtcChvYmplY3QgZW52LCBpbnQgZmluYWwsIG1peGVkIGFyZ3MpOworCitwcml2YXRlIHN0cmluZyBzcGVjaWFsKHN0cmluZyBzdHIpOworcHJpdmF0ZSB2b2lkIHJlbW92ZU91dHB1dEZpbGUoKTsKK3ByaXZhdGUgdm9pZCBkdW1wSG91c2UoKTsKK3ByaXZhdGUgdm9pZCBkdW1wUm9vbUhlYWRlcigpOworcHJpdmF0ZSB2b2lkIGR1bXBDaGVzdCgpOworcHJpdmF0ZSB2b2lkIGR1bXBEZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcFJlYWREZXRhaWxzKCk7Citwcml2YXRlIHZvaWQgZHVtcENvbW1hbmRzKCk7Citwcml2YXRlIHZvaWQgZG9GaW5hbGl6ZSgpOworcHJpdmF0ZSB2b2lkIGR1bXBFeGl0cygpOworcHJpdmF0ZSB2b2lkIGR1bXBSb29tVHJhaWxlcigpOworcHJpdmF0ZSB2b2lkIGRvUmV0dXJuKCk7Citwcml2YXRlIHZvaWQgc1Byb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgc3RyaW5nIHBTdHIpOworc3RhdGljIHZvaWQgbVByb3Aoc3RyaW5nIGZpbGUsIHN0cmluZyBwTmFtZSwgbWl4ZWQgbWFwX2xkZmllZCwgaW50IHBvcywgaW50IHNpZ25hbCk7CitzdGF0aWMgdm9pZCBjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpOworcHJpdmF0ZSB2b2lkIHByZXR0eVN0cmluZyhzdHJpbmcgZmlsZSwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpOworcHJpdmF0ZSB2b2lkIHByZXR0eUFycmF5KHN0cmluZyBmaWxlLCBzdHJpbmcgKmFyciwgaW50IHNlcCk7Citwcml2YXRlIHZvaWQgaGVhZGVyUm9vbSgpOworcHJpdmF0ZSB2b2lkIHRyYWlsZXJSb29tKCk7Citwcml2YXRlIHZvaWQgaGVhZGVySG91c2UoKTsKK3ByaXZhdGUgdm9pZCB0cmFpbGVySG91c2UoKTsKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIAorICBBZGRTdGF0ZShTVEFURV9JRExFLCAwLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfSE9VU0UsICAgICMnZHVtcEhvdXNlLCAwKTsKKyAgQWRkU3RhdGUoU1RBVEVfUk9PTSwgICAgICMnZHVtcFJvb21IZWFkZXIsIDApOworICBBZGRTdGF0ZShTVEFURV9DSEVTVCwgICAgIydkdW1wQ2hlc3QsIDApOworICBBZGRTdGF0ZShTVEFURV9ERVRBSUwsICAgIydkdW1wRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX1JERVRBSUwsICAjJ2R1bXBSZWFkRGV0YWlscywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0NPTU1BTkQsICAjJ2R1bXBDb21tYW5kcywgMCk7CisgIEFkZFN0YXRlKFNUQVRFX0ZJTkFMSVpFLCAjJ2RvRmluYWxpemUsIDApOworICBBZGRTdGF0ZShTVEFURV9FWElUUywgICAgIydkdW1wRXhpdHMsIDApOworCisgIEFkZFRyYW5zaXRpb24oU01fSU5WQUxJRCwgU0lHX0lOSVRJQUxJWkUsIFNUQVRFX0lETEUsIDApOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBkZXMgSGF1c2VzCisgIEFkZFRyYW5zaXRpb24oU1RBVEVfSURMRSwgU0lHX0hPVVNFLCBTVEFURV9IT1VTRSwgIydyZW1vdmVPdXRwdXRGaWxlKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9IT1VTRSwgU0lHX0hPVVNFX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworCisgIC8vIFp1c3RhbmRzdWViZXJnYWVuZ2UgenVtIFNjaHJlaWJlbiBlaW5lcyBSYXVtcworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0lETEUsICAgICBTSUdfUk9PTSwgICAgICBTVEFURV9ST09NLCAjJ3JlbW92ZU91dHB1dEZpbGUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JPT00sICAgICBTSUdfRE9fQ0hFU1QsICBTVEFURV9DSEVTVCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfUk9PTSwgICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfQ0hFU1QsICAgIFNJR19ET19ERVRBSUwsIFNUQVRFX0RFVEFJTCk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfREVUQUlMLCAgIFNJR19ERVRBSUxfRE9ORSwgIFNUQVRFX1JERVRBSUwpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX1JERVRBSUwsICBTSUdfUkRFVEFJTF9ET05FLCBTVEFURV9DT01NQU5EKTsKKyAgQWRkVHJhbnNpdGlvbihTVEFURV9DT01NQU5ELCAgU0lHX0NPTU1BTkRfRE9ORSwgU1RBVEVfRklOQUxJWkUpOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0ZJTkFMSVpFLCBTSUdfRE9fRVhJVFMsICBTVEFURV9FWElUUyk7CisgIEFkZFRyYW5zaXRpb24oU1RBVEVfRklOQUxJWkUsIFNJR19ST09NX0RPTkUsIFNUQVRFX0lETEUsICMnZG9SZXR1cm4pOworICBBZGRUcmFuc2l0aW9uKFNUQVRFX0VYSVRTLCAgICBTSUdfUk9PTV9ET05FLCBTVEFURV9JRExFLCAjJ2R1bXBSb29tVHJhaWxlcik7CisgIAorICBTdGF0ZVRyYW5zaXRpb24oU0lHX0lOSVRJQUxJWkUpOworfQorCisKKy8vIEVyemV1Z2Ugbm9ybWFsZW4gTFBDLVF1ZWxsY29kZSBhdXMgZWluZW0gSGF1cyBvZGVyIFJhdW0uCisvLworLy8gUGFyYW1ldGVyOgorLy8gICBlbnY6IERhcyBIYXVzIG9kZXIgZGVyIFJhdW0sIGF1cyBkZW0gUXVlbGxjb2RlIGVyemV1Z3Qgd2VyZGVuIHNvbGwKKy8vICAgZmluOiBGYWxscyBnbGVpY2ggMCwgc28gd2lyZCBRdWVsbGNvZGUgZnVlciBUeXBvZml4ZXMgby5hZS4KKy8vICAgICAgICBlcnpldWd0OyBkYXMgZXJ6ZXVndGUgRmlsZSBoZWlzc3QgaW1tZXIgJ2ZpeGVkLmMnLgorLy8gICAgICAgIEFuZGVybmZhbGxzIHdpcmQgUXVlbGxjb2RlIGZ1ZXIgZWluIGVpZ2Vuc3RhZW5kaWdlcyBPYmpla3QKKy8vICAgICAgICBlcnpldWd0LiBEaWVzZXMga2FubiB6LkIuIHp1bSBBbnNjaGx1c3MgYWxzICJNYWdpZXJoYXVzIgorLy8gICAgICAgIHZlcndlbmRldCB3ZXJkZW4uIERpZSBlcnpldWd0ZW4gRmlsZXMgaGVpc3NlbgorLy8gICAgICAgICdyZXAvPG5hbWU+cmF1bTxucj4uYycgYnp3LiAncmVwLzxuYW1lPmhhdXMuYycuIEJlZmluZGV0IHNpY2gKKy8vICAgICAgICBpbiBkZW0gUmF1bSBkaWUgVHJ1aGUsIHdpcmQgenVzYWV0emxpY2ggZGllIERhdGVpCisvLyAgICAgICAgJ3JlcC88bmFtZT50cnVoZS5jJyBnZXNjaHJpZWJlbi4KKy8vCisvLyBSdWVja2dhYmV3ZXJ0OgorLy8gICBEZXIgRGF0ZWluYW1lLCBpbiBkZW4gZGllIERhdGVuIGdlc2NocmllYmVuIHd1cmRlbi4KKworc3RyaW5nCitkdW1wKG9iamVjdCBlbnYsIGludCBmaW4sIG1peGVkIGFyZ3MpCit7CisgIHN0cmluZyBvdXQ7CisgIGludCBudW07CisKKyAgaGF1c21laXN0ZXIgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgaG1hcmdzID0gYXJnczsKKyAgCisgIGlmIChRdWVyeVN0YXRlKCkgIT0gU1RBVEVfSURMRSkKKyAgeworICAgIHdyaXRlKCJEZXIgR2VuZXJhdG9yIGFyYmVpdGV0IG5vY2guLi5cbkJpdHRlIHdhcnRlbiFcbiIpOworICAgIHJldHVybiAiPGtlaW5lIERhdGVpIGdlbmVyaWVydD5cbiI7CisgIH0KKyAgCisgIC8vIEZhbGxzIGVpbiBSYXVtIGdlbmVyaWVydCB3aXJkLCBlcmhhZWx0IDxucj4gZGllIFJhdW1udW1tZXIuCisgIC8vIEJlaSBkZXIgQXVzc2VuYW5zaWNodCBkZXMgSGF1c2VzIHdpcmQgPG5yPiBhdWYgLTEgZ2VzZXR6dC4KKyAgaWYgKHNzY2FuZihvYmplY3RfbmFtZShlbnYpLCAiJXNyYXVtJWQiLCBvdXQsIG51bSkgPCAyKQorICB7CisgICAgbnVtID0gLTE7CisgIH0KKyAgCisgIGlmIChmaW4pCisgIHsKKyAgICBvdXQgPSBQQVRIKyJyZXAvIitlbnYtPlF1ZXJ5T3duZXIoKTsKKworICAgIGlmIChudW0gPj0gMCkKKyAgICB7CisgICAgICBvdXQgKz0gInJhdW0iK251bSsiLmMiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgb3V0ICs9ICJoYXVzLmMiOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBvdXQgPSBQQVRIKyJmaXhlZC5jIjsKKyAgfQorCisgIC8vIEluZm9ybWF0aW9uZW4gZnVlciBkaWUgU3RhdGVtYWNoaW5lIHNldHplbgorICBmaWxlID0gb3V0OworICBmaW5hbCA9IGZpbjsKKyAgcmF1bSA9IGVudjsKKyAgbnIgPSBudW07CisKKyAgaWYgKG51bSA+PSAwKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ST09NKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvLyBTb25kZXJ6ZWljaGVuIFwsICIgdW5kIFRBQiBrb3JyZWt0IHVtd2FuZGVsbgorcHJpdmF0ZSBzdHJpbmcgc3BlY2lhbChzdHJpbmcgcykKK3sKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXFwiKSwgIlxcXFwiKTsKKyAgcyA9IGltcGxvZGUoZXhwbG9kZShzLCAiXHQiKSwgIlxcdCIpOworICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcIiIpLCAiXFxcIiIpOworCisgIHJldHVybiBzOworfQorCisvKioqIEZ1bmt0aW9uZW4genVtIEdlbmVyaWVyZW4gZWluZXIgRGF0ZWkgYXVzIGRlbiBQcm9wZXJ0aWVzIGRlcyBIYXVzZXMgKioqLworCisjZGVmaW5lIEVYSVRfVE1QTCAiXCIvcGxheWVycy8lcy9zZWhlcmhhdXMvJXNyYXVtJWRcIiIKKworcHJpdmF0ZSB2b2lkCityZW1vdmVPdXRwdXRGaWxlKCkKK3sKKyAgY2F0Y2gocm0oZmlsZSkpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBIb3VzZSgpCit7CisgIGhlYWRlckhvdXNlKCk7CisgIAorICBzUHJvcChmaWxlLCAiUF9TSE9SVCIsIHJhdW0tPlF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0xPTkciLCByYXVtLT5RdWVyeVByb3AoUF9MT05HKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisKKyAgaWYgKGZpbmFsKQorICB7CisgICAgbWl4ZWQgbjsKKworICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiAgU2V0UHJvcChQX05PR0VULCAxKTtcbiIpOworICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9HRU5ERVIsICIrCisgICAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW3JhdW0tPlF1ZXJ5UHJvcChQX0dFTkRFUildKworICAgICAgICAgICAgICAgIiApO1xuICBTZXRQcm9wKFBfTkFNRSwgIik7CisgICAgbiA9IHJhdW0tPlF1ZXJ5UHJvcChQX05BTUUpOworCisgICAgaWYgKHN0cmluZ3AobikpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLCAiXCIiK24rIlwiIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgICB9CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICAgIHByZXR0eUFycmF5KGZpbGUsCisgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlQcm9wKFBfSURTKS0oeyAic2VoZVxyaGF1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iK3JhdW0tPlF1ZXJ5T3duZXIoKSsiaGF1cyIgfSksCisgICAgICAgICAgICAgICAgMCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorICB0cmFpbGVySG91c2UoKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0hPVVNFX0RPTkUpOworfQorCitwcml2YXRlIHZvaWQKK2R1bXBSb29tSGVhZGVyKCkKK3sKKyAgaGVhZGVyUm9vbSgpOworICAKKyAgc1Byb3AoZmlsZSwgIlBfSU5UX1NIT1JUIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX1NIT1JUKSk7CisgIHdyaXRlX2ZpbGUoZmlsZSwgIlxuIik7CisgIHNQcm9wKGZpbGUsICJQX0lOVF9MT05HIiwgcmF1bS0+UXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKworICBpZiAoZmluYWwgJiYgcmF1bS0+UXVlcnlQcm9wKEhfQ0hFU1QpKQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19DSEVTVCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ET19ERVRBSUwpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcENoZXN0KCkKK3sKKyAgbWl4ZWQgbjsKKyAgc3RyaW5nIGNmaWxlOworICBvYmplY3QgY2hlc3Q7CisKKyAgY2ZpbGUgPSBQQVRIKyJyZXAvIityYXVtLT5RdWVyeU93bmVyKCkrInRydWhlLmMiOworICBjaGVzdCA9IHByZXNlbnQoVFJVSEUsIHJhdW0pOworICAKKyAgY2F0Y2gocm0oY2ZpbGUpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLAorICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuI2luY2x1ZGUgPG1vdmluZy5oPlxuXG4iCisgICAgICAgICAgICAgImluaGVyaXQgXCIvZC93dWVzdGUvZHVyaWFuL2JlaGFlbHRlclwiO1xuXG4iCisgICAgICAgICAgICAgInZvaWQgY3JlYXRlKClcbntcbiAgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuXG4iCisgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIiApOworICBzUHJvcChjZmlsZSwgIlBfU0hPUlQiLCBjaGVzdC0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKKyAgc1Byb3AoY2ZpbGUsICJQX0xPTkciLCAgY2hlc3QtPlF1ZXJ5UHJvcChQX0xPTkcpKTsKKworICB3cml0ZV9maWxlKGNmaWxlLCAiICBTZXRQcm9wKFBfTk9HRVQsIDEpO1xuIik7CisgIHdyaXRlX2ZpbGUoY2ZpbGUsCisgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0dFTkRFUiwgIisKKyAgICAgICAgICAgICAoeyJORVVURVIiLCJNQUxFIiwiRkVNQUxFIn0pW2NoZXN0LT5RdWVyeVByb3AoUF9HRU5ERVIpXSsKKyAgICAgICAgICAgICAiICk7XG4gIFNldFByb3AoUF9OQU1FLCAiKTsKKworICBuID0gY2hlc3QtPlF1ZXJ5UHJvcChQX05BTUUpOworICBpZiAoc3RyaW5ncChuKSkKKyAgeworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICJcIiIrbisiXCIiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwcmV0dHlBcnJheShmaWxlLCBuLCAwKTsKKyAgfQorICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG5cbiAgQWRkSWQoICIpOworICBwcmV0dHlBcnJheShjZmlsZSwgY2hlc3QtPlF1ZXJ5UHJvcChQX0lEUyktKHsgVFJVSEUgfSksIDApOworICB3cml0ZV9maWxlKGNmaWxlLCAiICk7XG4iKTsKKworICBpZiAoKG49Y2hlc3QtPlF1ZXJ5UHJvcChQX0FESkVDVElWRVMpKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIEFkZEFkamVjdGl2ZSggIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIGlmICgobj1jaGVzdC0+UXVlcnlQcm9wKFBfTkFNRV9BREopKSAmJiBzaXplb2YobikpCisgIHsKKyAgICB3cml0ZV9maWxlKGNmaWxlLCAiXG4gIFNldFByb3AoUF9OQU1FX0FESiwgIik7CisgICAgcHJldHR5QXJyYXkoY2ZpbGUsIG4sIDApOworICAgIHdyaXRlX2ZpbGUoY2ZpbGUsICIgKTtcbiIpOworICB9CisgIHdyaXRlX2ZpbGUoY2ZpbGUsICJ9XG4iKTsKKworICBTdGF0ZVRyYW5zaXRpb24oU0lHX0RPX0RFVEFJTCk7Cit9CisKK3ByaXZhdGUgdm9pZAorZHVtcERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIGRldDsKKyAgCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgZGV0ID0gVkVSV0FMVEVSLT5QQ3J1bmNoKHByb3ApOworICAgIC8vIG5leHQgc3RhdGUgdHJhbnNpdGlvbiBoYXBwZW5zIHdoZW4gZG9fbVByb3AgaXMgZG9uZQorICAgIG1Qcm9wKGZpbGUsICJBZGREZXRhaWwiLCBkZXQsIHNpemVvZihkZXQpLTEsIFNJR19ERVRBSUxfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19ERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUmVhZERldGFpbHMoKQoreworICBtYXBwaW5nIHByb3A7CisgIG1peGVkIHJkZXQ7CisgIAorICBwcm9wID0gcmF1bS0+UXVlcnlQcm9wKFBfUkVBRF9ERVRBSUxTKTsKKworICBpZiAoc2l6ZW9mKHByb3ApKQorICB7CisgICAgcmRldCA9IFZFUldBTFRFUi0+UENydW5jaChwcm9wKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX21Qcm9wIGlzIGRvbmUKKyAgICBtUHJvcChmaWxlLCAiQWRkUmVhZERldGFpbCIsIHJkZXQsIHNpemVvZihyZGV0KS0xLCBTSUdfUkRFVEFJTF9ET05FKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBTdGF0ZVRyYW5zaXRpb24oU0lHX1JERVRBSUxfRE9ORSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCitkdW1wQ29tbWFuZHMoKQoreworICBtYXBwaW5nIGNvbW07CisgIG1peGVkIGNtZDsKKyAgCisgIGNvbW0gPSByYXVtLT5RdWVyeVByb3AoSF9DT01NQU5EUyk7CisKKyAgaWYgKHNpemVvZihjb21tKSkKKyAgeworICAgIGNtZCA9IFZFUldBTFRFUi0+UENydW5jaChjb21tKTsKKyAgICAvLyBuZXh0IHN0YXRlIHRyYW5zaXRpb24gaGFwcGVucyB3aGVuIGRvX2NQcm9wIGlzIGRvbmUKKyAgICBjUHJvcChmaWxlLCAiQWRkVXNlckNtZCIsIGNtZCwgc2l6ZW9mKGNtZCktMSwgU0lHX0NPTU1BTkRfRE9ORSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU3RhdGVUcmFuc2l0aW9uKFNJR19DT01NQU5EX0RPTkUpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZAorZG9GaW5hbGl6ZSgpCit7CisgIGlmIChmaW5hbCkKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfRE9fRVhJVFMpOworICB9CisgIGVsc2UKKyAgeworICAgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2R1bXBFeGl0cygpCit7CisgIHN0cmluZyAqaywgbzsKKyAgbWFwcGluZyBwcm9wOworICBpbnQgaSwgbnVtOworCisgIHByb3AgPSByYXVtLT5RdWVyeVByb3AoUF9FWElUUyk7CisgIGsgPSBtX2luZGljZXMocHJvcCk7CisgIGlmIChtZW1iZXIoaywgInJhdXMiKSA+PSAwKQorICB7CisgICAgayAtPSAoeyAicmF1cyIgfSk7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKCIgIEFkZEV4aXQoIFwicmF1c1wiLCBcIiVzXCIpO1xuIiwgcHJvcFsicmF1cyJdKSk7CisgIH0KKyAgCisgIGZvciAoaT1zaXplb2YoayktMTsgaT49MDsgaS0tKQorICB7CisgICAgaWYgKHNzY2FuZihwcm9wW2tbaV1dLCBQQVRIKyIlc3JhdW0lZCIsIG8sIG51bSkgIT0gMikKKyAgICB7CisgICAgICBwcmludGYoIktvbWlzY2hlciBFeGl0ICglTylcbiVzIC0+ICVzXG4iLCByYXVtLCBrW2ldLCBwcm9wW2tbaV1dKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmIChvID09IHJhdW0tPlF1ZXJ5T3duZXIoKSkKKyAgICAgIHsKKyAgICAgICAgbyA9IHNwcmludGYoRVhJVF9UTVBMLCBvLCBvLCBudW0pOworICAgICAgICB3cml0ZV9maWxlKGZpbGUsIHNwcmludGYoIiAgQWRkRXhpdCggXCIlc1wiLCAlcyk7XG4iLCBrW2ldLCBvKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIgIEFkZEV4aXQoIFwiJXNcIiwgXCIlc1wiKTtcbiIsIGtbaV0sIHByb3Bba1tpXV0pKTsKKyAgICAgICAgcHJpbnRmKCJFeGl0IHZvbiAlTyBuYWNoICVzIVxuIiwgcmF1bSwgcHJvcFtrW2ldXSk7CisgICAgICB9CisgICAgfQorICB9CisgIFN0YXRlVHJhbnNpdGlvbihTSUdfUk9PTV9ET05FKTsKK30KKworcHJpdmF0ZSB2b2lkCitkdW1wUm9vbVRyYWlsZXIoKQoreworICB0cmFpbGVyUm9vbSgpOworICBkb1JldHVybigpOworfQorCitwcml2YXRlIHZvaWQKK2RvUmV0dXJuKCkKK3sKKyAgaWYgKGhhdXNtZWlzdGVyICE9IDApCisgIHsKKyAgICBhcHBseSgjJ2NhbGxfb3RoZXIsIGhhdXNtZWlzdGVyLCAiR2VuZXJhdGlvbkRvbmUiLCBobWFyZ3MpOworICB9CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwcml2YXRlIHZvaWQKK3NQcm9wKHN0cmluZyBmLCBzdHJpbmcgcE5hbWUsIHN0cmluZyBwU3RyKQoreworICBzdHJpbmcgKnN0cjsKKworICB3cml0ZV9maWxlKGYsICIgIFNldFByb3AoICIrcE5hbWUrIiwiKTsKKworICBpZiAoIXBTdHIpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsICIwICk7XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBwU3RyID0gc3BlY2lhbChwU3RyKTsKKworICBpZiAoc2l6ZW9mKHN0cj1vbGRfZXhwbG9kZShwU3RyLCJcbiIpKSA+IDEpCisgIHsKKyAgICBwcmV0dHlTdHJpbmcoZiwgc3RyLCA0KTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoc2l6ZW9mKHN0cik9PTApCisgICAgeworICAgICAgc3RyID0gKHsiIn0pOworICAgIH0KKyAgICB3cml0ZV9maWxlKGYsICJcbiAgICAgXCIiK3N0clswXSk7CisKKyAgICBpZiAocFN0cls8MV0gPT0gJ1xuJykKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGYsICJcXG5cIiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd3JpdGVfZmlsZShmLCAiXCIiKTsKKyAgICB9CisgIH0KKyAgd3JpdGVfZmlsZShmLCAiICk7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK21Qcm9wKHN0cmluZyBmaWxlLCBzdHJpbmcgcE5hbWUsIG1peGVkIGNtZCwgaW50IHBvcywgaW50IHNpZ25hbCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqZXEsIHQxOworICAKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAwKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNik7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiICk7XG4iKTsKKyAgfQorCisgIC8vIEZhbGxzIHdpciBkaWUgZXZhbF9jb3N0IGF1c2dlcmVpenQgaGFiZW4sIGFiZXIgbm9jaCBuaWNodAorICAvLyBhbGxlIEVpbnRy5GdlIGJlYXJiZWl0ZXQgd3VyZGVuLCB3aXJkIGpldHp0IGRpZSBuYWVjaHN0ZQorICAvLyBSdW5kZSBnZXN0YXJ0ZXQKKyAgaWYgKGkgPj0gMCkKKyAgeworICAgIGNhbGxfb3V0KCJtUHJvcCIsIDEsIGZpbGUsIHBOYW1lLCBjbWQsIGksIHNpZ25hbCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gQW5zb25zdGVuIHdlY2hzZWxuIHdpciBqZXR6dCBpbiBkZW4gbmFlY2hzdGVuIFp1c3RhbmQKKyAgICB3cml0ZV9maWxlKGZpbGUsICJcbiIpOworICAgIFN0YXRlVHJhbnNpdGlvbihzaWduYWwpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitjUHJvcChzdHJpbmcgZmlsZSwgc3RyaW5nIHBOYW1lLCBtaXhlZCBjbWQsIGludCBwb3MsIGludCBzaWduYWwpCit7CisgIHN0cmluZyB0MSwgdDI7CisgIG1peGVkICBlcTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gcG9zOyAoaSA+PSAwKSAmJiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDApOyAtLWkpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgICIrcE5hbWUrIihcbiAgICAiKTsKKyAgICBlcSA9IGNtZFtpXVswXTsKKyAgICB0MSA9IGNtZFtpXVsxXTsKKyAgICB0MiA9IGNtZFtpXVsyXTsKKworICAgIHByZXR0eUFycmF5KGZpbGUsIGVxLCAxKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIsIDAsICIpOworCisgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDEpLCAiXG4iKSwgNCk7CisgICAgd3JpdGVfZmlsZShmaWxlLCAiLCAiKTsKKyAgICAKKyAgICBpZiAodDIpCisgICAgeworICAgICAgcHJldHR5U3RyaW5nKGZpbGUsIG9sZF9leHBsb2RlKHNwZWNpYWwodDIpLCAiXG4iKSwgNCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9maWxlKGZpbGUsICIwIik7CisgICAgfQorICAgIAorICAgIHdyaXRlX2ZpbGUoZmlsZSwgIiApO1xuIik7CisgIH0KKworICAvLyBGYWxscyB3aXIgZGllIGV2YWxfY29zdCBhdXNnZXJlaXp0IGhhYmVuLCBhYmVyIG5vY2ggbmljaHQKKyAgLy8gYWxsZSBFaW50cuRnZSBiZWFyYmVpdGV0IHd1cmRlbiwgd2lyZCBqZXR6dCBkaWUgbmFlY2hzdGUKKyAgLy8gUnVuZGUgZ2VzdGFydGV0CisgIGlmIChpID49IDApCisgIHsKKyAgICBjYWxsX291dCgiY1Byb3AiLCAxLCBmaWxlLCBwTmFtZSwgY21kLCBpLCBzaWduYWwpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIEFuc29uc3RlbiB3ZWNoc2VsbiB3aXIgamV0enQgaW4gZGVuIG5hZWNoc3RlbiBadXN0YW5kCisgICAgd3JpdGVfZmlsZShmaWxlLCAiXG4iKTsKKyAgICBTdGF0ZVRyYW5zaXRpb24oc2lnbmFsKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eVN0cmluZyhzdHJpbmcgZiwgc3RyaW5nICpzdHIsIGludCBpbmRlbnQpCit7CisgIHN0cmluZyBpbmQ7CisgIGludCBpOworCisgIGluZCA9IGV4dHJhY3QoIlxuICAgICAgICAgICIsMCxpbmRlbnQpOworCisgIGlmICghc2l6ZW9mKHN0cikpCisgIHsKKyAgICB3cml0ZV9maWxlKGYsIGluZCsiIFwiXFxuXCIiKTsKKyAgICByZXR1cm47CisgIH0KKworICB3cml0ZV9maWxlKGYsIGluZCsiIFwiIitzdHJbMF0rIlxcblwiIik7CisKKyAgZm9yIChpPTE7IGk8c2l6ZW9mKHN0cik7IGkrKykKKyAgeworICAgIHdyaXRlX2ZpbGUoZiwgaW5kKyIrXCIiK3N0cltpXSsiXFxuXCIiKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3ByZXR0eUFycmF5KHN0cmluZyBmLCBzdHJpbmcgKmFyciwgaW50IHNlcCkKK3sKKyAgaW50IGksajsKKyAgc3RyaW5nIHJlcywgdDEsIHQyOworCisgIHdyaXRlX2ZpbGUoZiwgIih7Iik7CisKKyAgaWYgKHNpemVvZihhcnIpKQorICB7CisgICAgdDEgPSAoIlwiIithcnJbMF0rIlwiIik7CisgICAgcmVzID0gIiAiK3QxOworICAgIHQyID0gIiI7CisKKyAgICBmb3IgKGk9MSwgaj1zaXplb2YoYXJyKTsgaTxqOyBpKyspCisgICAgeworICAgICAgdDIgPSAiXCIiK2FycltpXSsiXCIiOworICAgICAgaWYgKCFzZXApCisgICAgICB7CisJaWYgKChzaXplb2YodDEpICsgc2l6ZW9mKHQyKSkgPiA2OSkKKyAgICAgICAgeworCSAgcmVzICs9ICgiLFxuICAgICAgICIrdDIpOworCSAgdDEgPSB0MjsKKwkgIHQyID0gIiI7CisJfQorCWVsc2UgeworCSAgdDEgKz0gKCIsICIrdDIpOworCSAgcmVzICs9ICgiLCAiK3QyKTsKKwl9CisgICAgICB9CisgICAgICBlbHNlIHsKKwlyZXMgKz0gKCIsXG4gICAgICAgIit0Mik7CisgICAgICB9CisgICAgfQorICB9CisgIHdyaXRlX2ZpbGUoZiwgcmVzICsgIiB9KSIgKTsKK30KKworcHJpdmF0ZSB2b2lkCitoZWFkZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG5cbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwic3RkL3Jvb21cIjtcbiIKKyAgICAgICAgICAgICAgICJpbmhlcml0IFwiIitQQVRIKyJtb2R1bGVzL3VzZXJjbWRcIjtcblxuIgorICAgICAgICAgICAgICAgImNyZWF0ZSgpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgcm9vbTo6Y3JlYXRlKCk7XG4iCisgICAgICAgICAgICAgICAiICB1c2VyY21kOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0UHJvcChQX0xJR0hULCAxKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9JTkRPT1JTLCAxKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBSQVVNO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIik7XG4iCisgICAgICAgICAgICAgICAiICBMb2FkKCk7XG5cbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9ERVRBSUxTLCAoW10pKTtcbiIKKyAgICAgICAgICAgICAgICIgIFNldFByb3AoUF9SRUFEX0RFVEFJTFMsIChbXSkpO1xuXG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK3RyYWlsZXJSb29tKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLCAifVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiAgU2F2ZSgxKTtcblxuIgorICAgICAgICAgICAgICAgIiAgeyBvYmplY3QgcmF1bTtcbiIKKyAgICAgICAgICAgICAgICIgICAgaWYgKHJhdW0gPSBmaW5kX29iamVjdChSQVVNTkFNRSgiCisgICAgICAgICAgICAgICAiXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCIsICIrbnIrIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQKK2hlYWRlckhvdXNlKCkKK3sKKyAgaWYgKGZpbmFsKQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+XG4iCisgICAgICAgICAgICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIgorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiIitQQVRIKyJoYXVzLmhcIlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBcInN0ZC90aGluZ1wiO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgSEFVU1RVRVI7XG5cbiIKKyAgICAgICAgICAgICAgICJjcmVhdGUoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIHRoaW5nOjpjcmVhdGUoKTtcbiIKKyAgICAgICAgICAgICAgICIgIGhhdXN0dWVyOjpjcmVhdGUoKTtcblxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwiaGF1cy5oXCJcbiIKKyAgICAgICAgICAgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuXG4iCisgICAgICAgICAgICAgICAiaW5oZXJpdCBIQVVTO1xuIgorICAgICAgICAgICAgICAgImluaGVyaXQgXCIvc3RkL3RoaW5nL21vdmluZ1wiO1xuXG4iCisgICAgICAgICAgICAgICAiY3JlYXRlKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuO1xuIgorICAgICAgICAgICAgICAgIiAgOjpjcmVhdGUoKTtcblxuIgorICAgICAgICAgICAgICAgIiAgU2V0T3duZXIoXCIiK3JhdW0tPlF1ZXJ5T3duZXIoKSsiXCJcbiIKKyAgICAgICAgICAgICAgICIgIExvYWQoKTtcblxuIik7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkCit0cmFpbGVySG91c2UoKQoreworICBpZiAoZmluYWwpCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsIHJlYWRfZmlsZShQQVRIKyJ0b29scy9oYXVzLmFweCIpKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsICIgIHRoaXNfcGxheWVyKCktPm1vdmUoIik7CisgICAgd3JpdGVfZmlsZShmaWxlLCBzcHJpbnRmKEVYSVRfVE1QTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF1bS0+UXVlcnlPd25lcigpLCByYXVtLT5RdWVyeU93bmVyKCksIDApKTsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiLFxuXHRcdFx0TV9HTywgMCwgXCJiZXRyaXR0IFwiK25hbWUoV0VOLDEpLCBcImtvbW10IGhlcmVpblwiKTtcbiIKKyAgICAgICAgICAgICAgICIgIHJldHVybiAxO1xufVxuIik7CisgICAgaWYgKCFyYXVtLT5RdWVyeVByb3AoUF9TSE9SVCkpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLAorICAgICAgICAgICAgICAgICAiXG5zdHJpbmcgc2hvcnQoKVxuIgorICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAiICBzdHJpbmcgcmV0O1xuXG4iCisgICAgICAgICAgICAgICAgICIgIHJldCA9IDo6c2hvcnQoKTtcbiIKKyAgICAgICAgICAgICAgICAgIiAgaWYgKHByZXZpb3VzX29iamVjdCgpICE9IGVudmlyb25tZW50KCkgJiYgIXJldClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICByZXQgPVwiXCI7XG5cbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV0dXJuIHJldDtcbiIKKyAgICAgICAgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICB3cml0ZV9maWxlKGZpbGUsCisgICAgICAgICAgICAgICAiICBTYXZlKDEpO1xuXG4iCisgICAgICAgICAgICAgICAiICB7IG9iamVjdCByYXVtO1xuIgorICAgICAgICAgICAgICAgIiAgICBpZiAocmF1bSA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCIKKyAgICAgICAgICAgICAgICJcIiIrcmF1bS0+UXVlcnlPd25lcigpKyJcIikpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJhdW0tPkxvYWQoKTtcbiIKKyAgICAgICAgICAgICAgICIgIH1cblxuIgorICAgICAgICAgICAgICAgIiAgY2FsbF9vdXQoXCJyZW1vdmVcIiwwKTtcbn1cbiIpOworICB9Cit9Cg==