ZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvQWRkQ21kL0VpbmZ1ZWhydW5nLkFkZENtZC50eHQgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9FaW5mdWVocnVuZy5BZGRDbWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGY2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9FaW5mdWVocnVuZy5BZGRDbWQudHh0CkBAIC0wLDAgKzEsMTc0IEBACitIYWxsbyBNaXRtYWdpZXJJbm5lbiAqZyosCisKK09rLCBkYW5uIGdlaHRzIG1hbCBlaW4gYmlzY2hlbiB6dXIgU2FjaGU6CisKKy9zdGQvdGhpbmcvY29tbWFuZHMuYyB3dXJkZSBzbyBlcndlaXRlcnQsIGRhc3MgbWFuIGF1Y2gga29tcGxleGUgU3ludGF4CitkaXJla3QgaW0gQWRkQ21kIHZvcnBhcnNlbiBrYW5uLgorCitEYXp1IGVpbiBrdXJ6ZXMgQmVpc3BpZWw6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIGVpbmVtIE9iamVrdCAoZWluIEJ1c2NoKSBmaW5kZXQgc2ljaCBmb2xnZW5kZSBTeW50YXhkZWZpbml0aW9uLgorCisgQWRkQ21kKCJwZmx1ZWNrZXxlcm50ZSZmcnVlY2h0ZXxiZWVyZW4mQElEIiwiY21kX3BmbHVlY2tlbiIsCisgICAgICAgICJXYXMgd2lsbHN0IER1IGRlbm4gQHZlcmJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAdmVyYmVuPyIpOworCitEZXIgZXJzdGUgUGFyYW1ldGVyIGRlZmluaWVydCBkaWUgU3ludGF4LiBEYXMgWmVpY2hlbiAmIHRyZW5udCB2ZXJzY2hpZWRlbmUKK3p1IHBhcnNlbmRlIEl0ZW1zOgorCisxLiBwZmx1ZWNrZXxlcm50ZQorMi4gZnJ1ZWNodGV8YmVlcmVuCiszLiBASUQKKworVW50ZXIgMS4gZmluZGVuIHNpY2ggZGllIFZlcmJlbiAtIGRhcyBzaW5kIGRpZSBnbGVpY2hlbiwgZGllIG1hbiBpbiBkZXIKK2FsdGVuIFZlcnNpb24gYXVjaCBiZWxlZ2VuIGtvbm50ZS4gRGllIFJlZ2VsIHJlYWdpZXJ0IGFsc28gYXVmICJwZmx1ZWNrZSIKK29kZXIgYXVmICJlcm50ZSIuCisKK0FsbGUgd2VpdGVyZW4gUmVnZWxuIG11ZXNzZW4gZXJmdWVsbHQgd2VyZGVuLCBkYW1pdCBkZXIgendlaXRlIFBhcmFtZXRlcgorKGRpZSBGdW5rdGlvbikgYXVmZ2VydWZlbiB3aXJkLiBASUQgc3RlaHQgZGFiZWkgZnVlciBkaWUgSUQgZGVzIE9iamVrdGVzLAoraW4gZGVtIGRhcyBBZGRDbWQgc3RlaHQuIEhpZXIgYWxzbyBkZXIgQnVzY2guCisKK0RhenUgZWluaWdlIEJlaXNwaWVsZToKKworYSkgPiBwZmx1ZWNrZSBiZWVyZW4KKyAtPiBlcmZ1ZWxsdCAxIHVuZCAyLiBBYmVyIG5pY2h0IDMuID0+IEZlaGxlcm1lbGR1bmcuCisKK2IpID4gZXJudGUgdm9uIGJ1c2NoCisgLT4gZXJmdWVsbHQgMSB1bmQgMywgamVkb2NoIDIgbmljaHQuID0+IEZlaGxlcm1lbGR1bmcuCisKK2MpID4gcGZsdWVja2UgZnJ1ZWNodGUgdm9uIGJ1c2NoCisgLT4gZXJmdWVsbHQgMSwgMiB1bmQgMyAtPiBidXNjaC0+Y21kX3BmbHVlY2tlbigpIHdpcmQgYXVmZ2VydWZlbi4gRGFzICJ2b24iCisgICAgaXN0IEZ1ZWxsd2Vyay4gRGF2b24ga2FubiBiZWxpZWJpZyB2aWVsIGltIFN0cmluZyBzZWluLiBTaWUgd2VyZGVuIAorICAgIGlnbm9yaWVydC4KKyAgICBFcyBzaW5kIGFsc28gYXVjaCB1bnNpbm5pZ2UgU3ludGF4ZSByaWNodGlnLCBzb2xhbmdlIGRlciBTdHJpbmcgZGllIAorICAgIEl0ZW1zIGVydWZlbGx0LgorCitJbSBGYWxsIGMpIHdpcmQgZGFzIFZlcmhhbHRlbiBkZXMgQnVzY2hlcyBkdXJjaCBkaWUgRnVua3Rpb24gImNtZF9wZmx1ZWNrZW4iCitkZWZpbmllcnQsIHdpZSBhdWNoIGluIGRlciBhbHRlbiBWZXJzaW9uIHZvbiBBZGRDbWQuCisKK1dhcyBwYXNzaWVydCBhYmVyIGluIGRlbiBGYWVsbGVuIGEpIHVuZCBiKT8gRGFmdWVyIGlzdCBkZXIgZHJpdHRlCitQYXJhbWV0ZXIgZGE6CisgICJXYXMgd2lsbHN0IER1IGRlbm4gQFZFUkJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAVkVSQmVuPyIpOworCitIaWVyIHNpbmQgendlaSBGZWhsZXJtZWxkdW5nZW4sIGR1cmNoIHwgZ2V0cmVubnQsIGRlZmluaWVydDoKKworeCkgV2FzIHdpbGxzdCBEdSBkZW5uIEBWRVJCZW4/Cit5KSBXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIEBWRVJCZW4/CisKK0Vyc3Qgd2lyZCBnZXBydWVmdCwgb2IgMi4gZXJmdWVsbHQgaXN0LiBGYWxscyBuaWNodCwgZ2lidCBlcyBGZWhsZXJtZWxkdW5nIHgpCitEYW5uIHdpcmQgYXVmIDMuIGdlcHJ1ZWZ0LiBJc3QgZGFzIG5pY2h0IGVyZnVlbGx0IChhYmVyIDIuIHNjaG9uKSBnaWJ0IGVzCitGZWhsZXJtZWxkdW5nIHkpLgorCitJbSBGYWxsIGEgc2luZCAxIHVuZCAyIGVyZnVlbGx0LiBEZW1uYWNoIHdpcmQgeSkgYXVzZ2VnZWJlbi4gQFZFUkIgd2lyZAorZGFiZWkgZHVyY2ggZGFzIGJlbnV0enRlIFZlcmIgZXJzZXR6dCAoZGFzIGFic2NobGllc3NlbmRlIGVuLCBiencgZSB3aXJkCithYmdlc2Nobml0dGVuKToKKyBXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIHBmbHVlY2tlbj8KKworSW0gRmFsbCBiIGlzdCAxIGVydWZlbGx0LCAyIGFiZXIgc2Nob24gbmljaHQuIERhaGVyIGdpYnQgZXMgRmVobGVybWVsZHVuZworeCkuIEF1ZiAzLiB3aXJkIG5pY2h0IG1laHIgZ2VwcnVlZnQuCisgV2FzIHdpbGxzdCBEdSBkZW5uIGVybnRlbj8KKworV2llIHNjaG9uIGVyd2FlaG50IGVyZnVlbGx0IGMpIGFsbGUgQmVkaW5ndW5nZW4gdW5kIGVzIGdpYnQga2VpbmUgQXVzZ2FiZSAtCitTdGF0dCBkZXNzZW4ga2FubiBtYW4gZGFzIFBmbHVlY2tlbiBpbiBkZXIgRnVua3Rpb24gYWJoYW5kZWxuLgorCitJbiBkZW4gRmFlbGxlbiAxIHVuZCAyIHdpcmQgZGllIEZlaGxlcm1lbGR1bmcgdWViZXIgbm90aWZ5X2ZhaWwoKQorYWJnZWhhbmRlbHQuIEVyZ28gd2lyZCBoaWVyIGFuZGVyZW4gQmVmZWhsZW4gdm9uIGFuZGVyZW4gT2JqZWt0ZW4gbm9jaAorZWluZSBDaGFuY2UgZ2VnZWJlbi4gR2xlaWNoZXMgZ2lsdCBmdWVyIGRpZSBGdW5rdGlvbiBjbWRfcGZsdWVja2VuKCksIHdlbm4KK2RlcmVuIFJ1ZWNrZ2FiZXdlcnQgMCBpc3QuIEF1Y2ggaGllciBnaWJ0IGVzIGRpZSBBbmFsb2dpZSB6dW0gYWx0ZW4gQWRkQ21kLgorCitHaWJ0IGNtZF9wZmx1ZWNrZW4oKSBlaW5lbiBXZXJ0IHVuZ2xlaWNoIDAgenVydWVjaywgd2lyZCBkaWUgU3VjaGUgbmFjaAorZGVyIHJpY2h0aWdlbiBTeW50YXggZGFuYWNoIGFiZ2Vicm9jaGVuLCBzbyBkYXNzIGF1Y2gga2VpbiBhbmRlcmVzIE9iamVrdAorbWVociBnZWZyYWd0IHdpcmQgKHdpZSBnZWhhYnQpLgorCitEYXMgaXN0IGF1Y2ggZnVlciBGb3JzY2hlcnB1bmt0ZSB3aWNodGlnLiBGUCB3ZXJkZW4gZ2VuZXJlbGwgbnVyIGJlaSBlaW5lbQorUnVlY2tnYWJld2VydCB1bmdsZWljaCAwIHZlcmdlYmVuLgorCitFaW5lIGtsZWluZSBFcndlaXRlcnVuZyBkZXIgQmVpc3BpZWxzeW50YXg6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBBZGRDbWQoInBmbHVlY2tlfGVybnRlJmZydWVjaHRlfGJlZXJlbiZASURAXGltcG9zc2libGUiLDAsCisgICJXYXMgd2lsbHN0IER1IGRlbm4gQFZFUkJlbj98V28gd2lsbHN0IER1IGRlbm4gZGllIEJlZXJlbiBAVkVSQmVuP3wiCisgICJEdSBwZmx1ZWNrc3QgZWluIHBhYXIgQmVlcmVuIHVuZCBpc3N0IHNpZSBhdWYuXkBXRVIgaXNzdCBlaW4gcGFhcgorICBCZWVyZW4uIik7CisKK0VpbmUgbmV1ZSBSZWdlbDoKKworNC4gXGltcG9zc2libGUKKworVW5kIGVpbmUgbmV1ZSBGZWhsZXJtZWxkdW5nOgoreikgRHUgcGZsdWVja3N0IGVpbiBwYWFyIEJlZXJlbiB1bmQgaXNzdCBzaWUgYXVmLl5AV0VSIGlzc3QgZWluIHBhYXIgQmVlcmVuLgorCitadXIgUmVnZWw6CisKK0RpZSBSZWdlbCBpc3QgbmljaHQgZXJmdWVsbGJhciwgZGEgU3BpZWxlciBkYXMgXGkgbmljaHQgZXJ6ZXVnZW4KK2tvZW5uZW4uIFp3YW5nc2xhZXVmaWcgZ2lidCBlcyBhdWNoIGtlaW5lIEZ1bmt0aW9uLCBkaWUgYXVmZ2VydWZlbiB3ZXJkZW4KK2tvZW5udGUuCisKK0RhZnVlciBnaWJ0IGVzIGVpbmUgRmVobGVybWVsZHVuZywgZGllIGVpbiBuZXVlcyBFbGVtZW50IGVudGhhZWx0LiBEYXMKK14uIFdpcmQgZGllc2UgTWVsZHVuZyBhdXNnZWdlYmVuIGlzdCBkYXMgZ2VuYXUgd2llIGVpbiByZXR1cm4gMSBpbiBkZXIKK0Z1bmt0aW9uLiBEaWUgU3ludGF4IHdpcmQgYWxzIHJpY2h0aWcgYW5lcmthbm50LiAoRXMga2FubiBoaWVyZnVlciBhbHNvCithdWNoIEZQIGdlYmVuKS4KKworRGVyIFRleHQgdm9yIGRlbSBeIGdlaHQgYW4gZGVuIFNwaWVsZXIsIGFsbGVzIGRhaGludGVyIGdlaHQgYW4gZGllIFNwaWVsZXIKK2ltIFJhdW0uIFN0ZWh0IGhpbnRlciBkZW0gXiBuaWNodHMsIGdpYnQgZXMga2VpbmUgUmF1bW1lbGR1bmcuCisKK0F1ZiBkaWVzZSBXZWlzZSBrYW5uIG1hbiBsZWljaHQgZWluIFJhdW1rb21tYW5kbyBlcnN0ZWxsZW4sIGRhc3MgbnVyCitUZXh0YXVzZ2FiZW4gbWFjaHQsIGFiZXIga2VpbmUgRnVua3Rpb25hbGl0YWV0IGVudGhhZWx0LiBFcyBpc3Qga2VpbmUKK2VpZ2Vuc3RhZW5kaWdlIEZ1bmt0aW9uIG1pdCBpcmdlbmR3ZWxjaGVtIGVpZ2VuZW4gUGFyc2luZyBtZWhyIG5vZXRpZy4KKworRGFzIEBXRVIgd2lyZCBkdXJjaCB0aGlzX3BsYXllcigpLT5OYW1lKCkgZXJzZXR6dCwgc28gZGFzcyBtYW4gYXVjaCBlaW5lbgorUGVyc29lbmxpY2hlbiBiZXp1ZyBpbiBkZW4gTWVsZHVuZ2VuIGhlcnN0ZWxsZW4ga2Fubi4KKworQWJ3YWVydHNrb21wYXRpYmVsCistLS0tLS0tLS0tLS0tLS0tLS0KKworRGllIEVyd2VpdGVydW5nZW4gdm9uIEFkZENtZCBlcmxhdWJlbiBlaW4gZWluZmFjaGVyZXMgRXJzdGVsbGVuIHZvbgorU3RhbmRhcmQtS29tbWFuZG9zLCBvaG5lIGRhc3MgbWFuIHNpY2ggbWl0IGRlbSBQYXJzZW4gaW4gRnVua3Rpb25lbgorYmVzY2hhZWZ0aWdlbiBtdXNzLgorCitEaWUgQWVuZGVydW5nIGlzdCB2b2xsc3RhZW5kaWcgYWJ3YWVydHNrb21wYXRpYmVsLiBXZXIgc2ljaCBhbHNvIHNhZ3QsCitkYXMgZGFzIGFsbGVzIHZpZWwgenUga29tcGxpemllcnQgc2VpLCBrYW5uIHdlaXRlcmhpbjoKKworIEFkZENtZCgoeyJwZmx1ZWNrZSIsImVybnRlIn0pLCJjbWRfcGZsdWVja2VuIik7CisKK2JlbnV0emVuLiBEYXMgVmVyaGFsdGVuIGlzdCBoYWFyZ2VuYXUgZGFzIHNlbGJlIHdpZSBiaXNoZXIuIERlbWVudHNwcmVjaGVuZAoraXN0IGF1Y2gga2F1bSBBdWZ3YW5kIGJlaW0gRWlucGZsZWdlbiBkaWVzZXIgQWVuZGVydW5nIG5vdHdlbmRpZy4KKworWnVyIEJlYWNodHVuZworLS0tLS0tLS0tLS0tLQorCitVZWJlcmFsbCwgd28gZGlyZWt0IGF1ZiBQX0NPTU1BTkRTIHp1Z2VncmlmZmVuIHdpcmQsIGthbm4gZXMgcHJpbnppcGllbGwKK3p1IFByb2JsZW1lbiBrb21tZW4sIGRhIHNpY2ggZGllIFN0cnVrdHVyIGRlcyBNYXBwaW5ncyB1bmQgZGVyIFp1Z3JpZmYKK2RhcmF1ZiBnZWFlbmRlcnQgaGF0LgorCitJbSBGb2xnZWFydGlrZWwgZmluZGV0IHNpY2ggZWluZSBMaXN0ZSBtaXQgYWxsZW4gT2JqZWt0ZW4sIGRpZSBkYXMgbWFjaGVuLiBJbgorZGVuIG9lZmZlbnRsaWNoZW4gVmVyemVpY2huaXNzZW4gd2VyZGUgaWNoIG1pY2ggbWl0IGRlbiBNYWdpZXJuIGluIFZlcmJpbmR1bmcKK3NldHplbiBvZGVyIHNlbGJzdCBrb250cm9sbGllcmVuLCBvYiBBZW5kZXJ1bmdlbiBub3R3ZW5kaWcgc2luZC4KKworT2JqZWt0ZSBpbiBkZW4gUGxheWVycy1WZXJ6ZWljaG5pc3NlbiB3ZXJkZSBpY2ggbnVyIGluIEF1c25haG1lZmFlbGxlbgorYW5wYXNzZW4uIFp1ciBFcmlubmVydW5nOiBBbmdlc2NobG9zc2VuZXMgZ2Vob2VydCBuaWNodCBuYWNoIC9wbGF5ZXJzLy4KKworRGVyIENvZGUgaXN0IGF1ZiBLb21wYXRpYmlsaXRhZXQgbWl0IGRlbSBhbHRlbiBTeXN0ZW0gYXVzZ2VsZWd0LCBkZW5ub2NoCitnaWJ0IGVzIGVpbiBwYWFyIEFlbmRlcnVuZ2VuLiBadW0gQmVpc3BpZWwgaXN0IFBfQ09NTUFORFMga2VpbmUgZWNodGUKK1Byb3BlcnR5IG1laHIgc29uZGVybiBlaW5lIGxva2FsZSBWYXJpYWJsZS4gRGVtenVmb2xnZSB3aXJkIFBfQ09NTUFORFMKK2JlaSAieHByb3AiIG5pY2h0IG1laHIgYW5nZXplaWd0LiBEaWUgU2Nobml0dHN0ZWxsZSB3aXJkIGR1cmNoIF9zZXRfCit1bmQgX3F1ZXJ5X2Z1bmt0aW9uZW4gcmVhbGlzaWVydC4gRGllIE1hcHBpbmdzIHdlcmRlbiBfaW1tZXJfIGFscyBLb3BpZW4KK3JhdXNnZWdlYmVuLCBzbyBkYXNzIG1hbiBkYW1pdCBuaWNodCB2ZXJzZWhlbnRsaWNoIFVuc2lubiBtYWNoZW4ga2Fubi4KKworU2NobHVzc3dvcnQKKy0tLS0tLS0tLS0tCisKK0RpZXNlciBBcnRpa2VsIHN0ZWxsdCBudXIgZWluZSBFaW5sZWl0dW5nIGluIGRpZSBBZW5kZXJ1bmcgdW5kIGRlcmVuCitNb2VnbGljaGtlaXRlbiBkYXIgdW5kIGlzdCBrZWluZXNmYWxscyB2b2xsc3RhZW5kaWcuIFdlciBtZWhyIGRhcnVlYmVyIHdpc3Nlbgord2lsbCwgaXN0IGVpbmdlbGFkZW4sIHNpY2ggZGllIE1hbnBhZ2UgenUgIkFkZENtZCIgdW5kIHp1IGRlbiBCZWlzcGllbGVuCisiQWRkQ21kX2JzcCIgYW56dXNjaGF1ZW4uCisKK0RpZSBTZWl0ZW4gc2luZCBhdXMgZGVtIFJlZ2VuYm9nZW4gImdlbGllaGVuIiB1bmQgd2VyZGVuIGluIGRlbiBrb21tZW5kZW4KK1RhZ2VuIG5vY2ggYXVmIGRpZSBCZWR1ZXJmbmlzc2UgZGVzIE1vcmdlbmdyYXVlbiBhbmdlcGFzc3QuCisKK01laW4gRGFuayBnZWh0IGFuIEdsb2luc29uLCBkZXIgZGllIElkZWUgaGF0dGUsIGRpZSBBbnBhc3N1bmdlbiB2b3J6dW5laG1lbgordW5kIE1pZ3JhdGlvbiBkZXMgQ29kZXMgaW5zIE1vcmdlbkdyYXVlbiB1ZWJlcm5vbW1lbiBoYXQuCisKK0ZhbGxzIG51biBub2NoIEZyYWdlbiBzaW5kLCBudXIgenUhIDopCisKK1YqLApkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9BZGRDbWQvYnVzY2guYyBiL2RvYy9iZWlzcGllbGUvQWRkQ21kL2J1c2NoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYzViMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvQWRkQ21kL2J1c2NoLmMKQEAgLTAsMCArMSw1OCBAQAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKworICAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiR2VidWVzY2giKTsKKyAgIFNldFByb3AoUF9TSE9SVCwiRWluIEdlYnVlc2NoIik7CisgICBTZXRQcm9wKFBfTE9ORywiRHUgc3RlaHN0IHZvciBlaW5lbSBnYWFueiBub3JtYWxlbiBHZWJ1ZXNjaC4gRXMgdHJhZWd0ICIKKyAgICAgICAgICAgICAgICAgICJGcnVlY2h0ZS4gVW5kIGV2ZW50dWVsbFxua2FubiBtYW4gZGFyaW4gZXR3YXMgZmluZGVuLlxuIik7CisgICBTZXRQcm9wKFBfTk9HRVQsIkVzIGlzdCBmZXN0Z2V3YWNoc2VuLCBldmVudHVlbGwga2FubiBtYW4gZXMgYXVzZ3JhYmVuP1xuIik7CisKKyAgIFNldFByb3AoUF9XRUlHSFQsNTAwMCk7CisgICBTZXRQcm9wKFBfU0laRSwxMDApOworCisgICBBZGRJZCgoeyJidXNjaCIsImdlYnVlc2NoIn0pKTsKKworICAgQWRkRGV0YWlsKCh7ImZydWVjaHRlIiwiZnJ1Y2h0In0pLAorICAgICAiRXMgc2NoZWluZW4gQmVlcmVuIHp1IHNlaW4uIFZpZWxsZWljaHQga2FubnN0IER1IHNpZSBwZmx1ZWNrZW4/XG4iKTsKKyAgIEFkZERldGFpbCgiYmVlcmVuIiwKKyAgICAgIlBmbHVlY2sgc2llIGRvY2gsIHZpZWxsZWljaHQgYnJpbmd0IGRhcyBqYSB3YXMuXG4iKTsKKworICAgLy8gTnVyIHdlbm4gZGllIFN5bnRheCBlcmZ1ZWxsdCBpc3QsIHdpcmQgY21kX3BmbHVlY2tlbigpIGF1ZmdlcnVmZW4uCisgICAvLyAicGZsdWVja2UgYmVlcmVuIHZvbiBidXNjaCIgZXRjLgorICAgQWRkQ21kKCJwZmx1ZWNrZXxlcm50ZSZmcnVlY2h0ZXxiZWVyZW4mQElEIiwiY21kX3BmbHVlY2tlbiIsCisgICAgICAgICAgIldhcyB3aWxsc3QgRHUgZGVubiBAdmVyYmVuP3xXbyB3aWxsc3QgRHUgZGVubiBkaWUgQmVlcmVuIEB2ZXJiZW4/Iik7CisKKyAgIC8vIHN1Y2hlbiBnaWJ0IG51ciBlaW5lIE1lbGR1bmcgYXVzLiBEYWZ1ZXIgYnJhdWNodCBtYW4ga3VlbmZ0aWcga2VpbmUKKyAgIC8vIEZ1bmt0aW9uZW4gbWVoci4KKyAgIEFkZENtZCgic3VjaHxzdWNoZXxkdXJjaHN1Y2h8ZHVyY2hzdWNoZSZASUQmXG5pbXBvc3NpYmxlIiwwLCAKKyAgICAgICAgICAiV28gd2lsbHN0IER1IEBWRVJCZW4/fER1IGR1cmNoc3VjaHN0IGRhcyBHZWJ1ZXNjaCwgZmluZGVzdCBhYmVyIG5pY2h0cy5eIgorICAgICAgICAgICJAV0VSMSBkdXJjaHN1Y2h0IGVpbiBHZWJ1ZXNjaCwgZmluZGV0IGFiZXIgbmljaHRzLiIpOworCisgICAvLyBHcmFiZW4gZ2VodCBlaCBuaWNodC4gRGFoZXIgbnVyIEZlaGxlcm1lbGR1bmdlbi4KKyAgIC8vIERhcyBeIHNhZ3QsIGRhc3MgaGllciBlaW4gcmV0dXJuMSB6dXJ1ZWNrZ2VnZWJlbiB3aXJkLiBFcyBnaWJ0IGFiZXIga2VpbmUgCisgICAvLyBSYXVtbWVsZHVuZy4KKyAgIEFkZENtZCgiZ3JhYnxncmFiZSZASUQmYXVzQFxuaW1wb3NzaWJsZSIsMCwKKyAgICAgICAgICAiV2FzIHdpbGxzdCBEdSBncmFiZW4/fER1IHdpbGxzdCBkYXMgR2VidWVzY2ggYXVzZ3JhYmVuP3wiCisgICAgICAgICAgIkRpZSBXdXJ6ZWxuIHNjaGVpbmVuIHRpZWYgenUgcmVjaGVuLiBEYXMgd2lyZCBuaWNodHMuXiIpOworfQorCitpbnQgY21kX3BmbHVlY2tlbihzdHJpbmcgYXJnLCBtaXhlZCAqcGFyYW0pCit7CisgICAgb2JqZWN0IG9iajsKKyAgICBvYmo9Y2xvbmVfb2JqZWN0KF9fRElSX18ib2JzdCIpOworICAgIHdyaXRlKCJWZXJ3dW5kZXJ0IHBmbHVlY2tzdCBEdSAiKyhvYmotPm5hbWUoKSkrIiB2b20gQnVzY2guIEtvbWlzY2guXG4iKTsKKworICAgIC8vIERhcyBoaWVyIGlzdCBlaW4gQmVpc3BpZWwgZnVlciBBZGRDbWQsIGRhaGVyIG1hY2ggaWNoIG1pciBuaWNoIAorICAgIC8vIGRpZSBNdWVoZSBkYXMgcmljaHRpZyB6dSBtYWNoZW4uIElzIGVoIG51ciBmdWVyIE1hZ2llciEKKyAgICBvYmotPm1vdmUodGhpc19wbGF5ZXIoKSxNX0dFVHxNX05PQ0hFQ0spOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9BZGRDbWQvb2JzdC5jIGIvZG9jL2JlaXNwaWVsZS9BZGRDbWQvb2JzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmI0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL0FkZENtZC9vYnN0LmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qIEhpbndlaXMgenUgZGllc2VtIEJlaXNwaWVsb2JqZWt0OiBMZWJlbnNtaXR0ZWwgbGFzc2VuIHNpY2ggYmVzc2VyIHZvbgorICogL3N0ZC9mb29kIGFibGVpdGVuLCBkYXMgYnJpbmd0IHZpZWxlIEZ1bmt0aW9uYWxpdGFldGVuIG1pdCwgZGllIG1hbiBzb25zdAorICogbXVlaHNhbSBzZWxiZXIgYmFzdGVsbiBtdXNzLgorICovCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIFNBRVRUSUdVTkcgMgorI2RlZmluZSBIRUlMVU5HIDIwCisjZGVmaW5lIEVBVF9ERUxBWSAxMjAwIC8vIDIwIE1pbnV0ZW4KKworI2RlZmluZSBCUzc4KHgpIGJyZWFrX3N0cmluZyh4LDc4KQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCisgIC8vIEdlbWVpbnNhbWVyIFRlaWwgZGVzIGNyZWF0ZQorICBBZGRJZCgib2JzdCIpOworICBTZXRQcm9wKCBQX1ZBTFVFLCA2MCtyYW5kb20oMTApICk7CisKKyAgLy8gQWRkQ21kKCAoeyJpc3MiLCJlc3NlIn0pLCAiYWN0X2Vzc2VuIik7ICAKKyAgLy8gbmV3IHN0eWxlIEFkZENtZAorICBBZGRDbWQoICJpc3N8ZXNzZSZASUQiLCJhY3RfZXNzZW4iLCJXYXMgd2lsbHN0IER1IGRlbm4gZXNzZW4/Iik7CisKKyAgLy8gTmFjaCBjYS4gMTAgTWludXRlbiByZXNldGV0IGRhcyBPYnN0LCBpbSBSZXNldCB3aXJkIGVzIGRlc3RydWN0ZXQsIAorICAvLyBzbyBzcGFyZSBpY2ggY2FsbF9vdXRzCisgIHNldF9uZXh0X3Jlc2V0KDYwMCk7CisKKyAgLy8gTmFtZSwgSUQsIEdlbmRlciwgRGVzYyB1bmQgR2V3aWNodCBzaW5kIEFiaGFlbmdpZyB2b24gZGVyIE9ic3RhcnQKKyAgc3dpdGNoIChyYW5kb20oMTEpKXsKKyAgZGVmYXVsdDoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIkFwZmVsIiApOworICAgIEFkZElkKCAiYXBmZWwiICk7CisgICAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbiBBcGZlbCIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluIHNhZnRpZ2VyIEFwZmVsLiBEaXIgbGFldWZ0IGRhcyBXYXNzZXIgaW0gTXVuZGUgenVzYW1tZW4uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA4MCApOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIkJpcm5lIiApOworICAgIEFkZElkKCAiYmlybmUiICk7CisgICAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbmUgQmlybmUiICk7CisgICAgU2V0UHJvcCggUF9MT05HLCBCUzc4KAorICAgICAgIkVpbmUga29lc3RsaWNoZSwgcmVpZmUgQmlybmUuIERpZSBpc3Qgc2ljaGVyIGxlY2tlci4iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDkwICk7CisgICAgYnJlYWs7CisgIGNhc2UgMjoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiQmFuYW5lIiApOworICAgIEFkZElkKCAiYmFuYW5lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIEJhbmFuZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRGllIEJhbmFuZSBzaWVodCB3aXJrbGljaCBsZWNrZXIgYXVzLCBhbSBiZXN0ZW4gZ2xlaWNoIGVzc2VuLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgMTEwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSAzOgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJLaXdpIiApOworICAgIEFkZElkKCAia2l3aSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBLaXdpIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJLbGVpbiB1bmQgZ3J1ZW4sIGFiZXIgbWl0IGxlY2tlcmVuIElubmVubGViZW4uIFlhbSB5YW0uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA1MCApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNDoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiRXJkYmVlcmUiICk7CisgICAgQWRkSWQoICJlcmRiZWVyZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBFcmRiZWVyZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluZSB1ZWJlcmR1cmNoc2Nobml0dGxpY2ggZ3Jvc3NlIEVyZGJlZXJlLiBTaWUgIgorICAgICAgImlzdCBzaWNoZXIgc3Vlc3MgdW5kIHNhZnRpZy4iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDIwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSA1OgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJLaXJzY2hlIiApOworICAgIEFkZElkKCAia2lyc2NoZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBLaXJzY2hlIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJad2FyIG51ciBrbGVpbiBpc3QgZGllc2UgS2lyc2NoZSwgYWJlciBzbyBkdW5rZWwgd2llIHNpZSAiCisgICAgICAiYXVzc2llaHQsIGlzdCBzaWUgc2ljaGVyIHRvdGFsIHN1ZXNzIHVuZCBsZWNrZXIuIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCAxNSApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNjoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiT3JhbmdlIiApOworICAgIEFkZElkKCAib3JhbmdlIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIE9yYW5nZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiRWluZSBncm9zc2UsIGdlbGJlIE9yYW5nZS4gRWluZSB2b24gZGllc2VuIHN1ZXNzZW4sIGRpZSBzaWNoIHNvICIKKyAgICAgICJsZWljaHQgc2NoYWVsZW4gbGFzc2VuIHVuZCBrZWluZSBaaWNrZW4gbWFjaGVuLCBzbyB3aWUgU2FmdG9yYW5nZW4uIgorICAgICkpOworICAgIFNldFByb3AoIFBfV0VJR0hULCA5MCApOworICAgIGJyZWFrOyAgCisgIGNhc2UgNzoKKyAgICBTZXRQcm9wKCBQX0dFTkRFUiwgRkVNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiTWFuZGFyaW5lIiApOworICAgIEFkZElkKCAibWFuZGFyaW5lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIE1hbmRhcmluZSIgKTsKKyAgICBTZXRQcm9wKCBQX0xPTkcsIEJTNzgoCisgICAgICAiU3Vlc3MgdW5kIHNhZnRpZyB1bmQgZ2VzdW5kLiBTbyBtdXNzIGRhcyBFc3NlbiBpbSBQYXJhZGllcyAiCisgICAgICAiZ2V3ZXNlbiBzZWluLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgNjAgKTsKKyAgICBicmVhazsgIAorICBjYXNlIDg6CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICAgIFNldFByb3AoIFBfTkFNRSwgIlppdHJvbmUiICk7CisgICAgQWRkSWQoICJ6aXRyb25lIiApOworICAgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIFppdHJvbmUiICk7CisgICAgU2V0UHJvcCggUF9MT05HLCBCUzc4KAorICAgICAgIlNhdWVyLCBzYXVlciB1bmQgbm9jaG1hbHMgc2F1ZXIuIEFiZXIgdWx0cmFsZWNrZXIuIE5hLCBzYWJiZXJzdCBEdSAiCisgICAgICAic2Nob24gYXVmIGRpZSBUYXN0YXR1cj8iCisgICAgKSk7CisgICAgU2V0UHJvcCggUF9XRUlHSFQsIDYwICk7CisgICAgYnJlYWs7ICAKKyAgY2FzZSA5OgorICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICAgU2V0UHJvcCggUF9OQU1FLCAiR3JhbmF0YXBmZWwiICk7CisgICAgQWRkSWQoICJncmFuYXRhcGZlbCIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluIEdyYW5hdGFwZmVsIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJFciBpc3QgendhciBldHdhcyBzY2h3aWVyaWdlciwgZGVuIHp1IGVzc2VuLCBhYmVyIGRlciBBdWZ3YW5kICIKKyAgICAgICJsb2hudCBzaWNoLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgOTAgKTsKKyAgICBicmVhazsgIAorICBjYXNlIDEwOgorICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX05BTUUsICJQZmxhdW1lIiApOworICAgIEFkZElkKCAicGZsYXVtZSIgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBQZmxhdW1lIiApOworICAgIFNldFByb3AoIFBfTE9ORywgQlM3OCgKKyAgICAgICJFaW5lIGdyb3NzZSwgYmxhdWUgUGZsYXVtZS4gTGFzcyBzaWUgRGlyIGRvY2ggc2NobWVja2VuLiIKKyAgICApKTsKKyAgICBTZXRQcm9wKCBQX1dFSUdIVCwgMjAgKTsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworCisgIGlmIChlbnYpIHsKKyAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnYpKXsKKyAgICAgIC8vIE1laW4gRW52IGlzIGVpbiBVc2VyCisgICAgICB0ZWxsX29iamVjdChlbnYsIEJTNzgoCisgICAgICAgIGNhcGl0YWxpemUodGhpc19vYmplY3QoKS0+bmFtZShXRVIpKSsiIHZlcnNjaHdpbmRldCBtaXQgZWluZW0gIisKKyAgICAgICAgIlwiUExPUFBcIiBhdXMgZGVpbmVtIEludmVudGFyLiBEYSBzY2hlaW50IE1hZ2llIGltIFNwaWVsIHp1IHNlaW4uIgorICAgICAgKSk7CisgICAgfSBlbHNlIGlmIChzaXplb2YoYWxsX2ludmVudG9yeShlbnYpJnVzZXJzKCkpKXsKKyAgICAgIC8vIEluIG1laW5lbSBFbnZpcm9ubWVudCBzaW5kIFVzZXIgKEVzIGlzdCBlaW4gUmF1bSkKKyAgICAgIHRlbGxfcm9vbShlbnYsIEJTNzgoCisgICAgICAgIGNhcGl0YWxpemUodGhpc19vYmplY3QoKS0+bmFtZShXRVIpKSsiIHZlcnNjaHdpbmRldCBtaXQgZWluZW0gIisKKyAgICAgICAgIlwiUExPUFBcIi4gRGEgc2NoZWludCBNYWdpZSBpbSBTcGllbCB6dSBzZWluLiIKKyAgICAgICkpOworICAgIH0KKyAgfQorCisgIC8vIE9iamVrdCB6ZXJzdG9lcmVuCisgIHJlbW92ZSgxKTsKK30KKworc3RhdGljIGludCBhY3RfZXNzZW4oc3RyaW5nIGFyZ3MpCit7CisgICAgLy8gTnVyIGVpbiBEZW1vLU9iamVrdAorICAgIGlmICghSVNfTEVBUk5JTkcodGhpc19wbGF5ZXIoKSkpCisgICAgeworICAgICAgd3JpdGUoIlNjaHd1cHMsIG51biBpc3QgQEBuYW1lQEAgdmVyc2Nod3VuZGVuLiBXYXIgd29obCBlaW5lIElsbHVzaW9uLiIpOworICAgICAgcmVtb3ZlKDEpOworICAgIH0KKworICAgIC8vIERlciBTeW50YXh0ZXN0IGlzdCB1bm5vZXRpZywgZGVyIGlzdCBzY2hvbiBpbSBuZXcgc3R5bGUKKyAgICAvLyBBZGRDbWQoKSBlaW5nZWJhdXQuCisKKyAgICAvLyBXZW5uIGRhcyBPYmpla3QgZWluIEVudmlyb25tZW50IGhhdCAoaG9mZiBpY2ggZG9jaCkKKyAgICAvLyB1bmQgZGFzIEVudmlyb25tZW50IG5pY2h0IHRoaXNfcGxheWVyKCkgaXN0LCAKKyAgICAvLyBoYXQgZGVyIFNwaWVsZXIgZGFzIE9ic3QgbmljaCBpbSBJbnYgLSBkYXMgZ2VodCBkb2NoIG5pY2h0IC4uLgorICAgIGlmIChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSAmJiAoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkgIT0gdGhpc19wbGF5ZXIoKSkgKQorICAgIHsKKyAgICAgIHdyaXRlKEJTNzgoCisgICAgICAgICJEdSBzb2xsdGVzdCAiKyB0aGlzX29iamVjdCgpLT5uYW1lKFdFUiwxKSArICIgZXJzdG1hbCBuZWhtZW4uIgorICAgICAgKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBERUJVRyAoIlNhdHQ/Iik7CisgICAgaWYgKHRoaXNfcGxheWVyKCktPmVhdF9mb29kKFNBRVRUSUdVTkcpKQorICAgIHsKKyAgICAgIC8vIERFQlVHKCJOb2UhIik7CisgICAgICBpZiAodGhpc19wbGF5ZXIoKS0+Y2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoRUFUX0RFTEFZLCJ2YW5pb25femFjaF9vYnN0Iik9PS0xKQorICAgICAgeworICAgICAgICB3cml0ZShCUzc4KAorICAgICAgICAgICJEdSBpc3N0IGdlbnVlc3NsaWNoICIrdGhpc19vYmplY3QoKS0+bmFtZShXRU4sMCkrCisgICAgICAgICAgIi4gRHUgZnVlaGxzdCBEaWNoIGdlc3RhZXJrdC4iCisgICAgICAgICkpOworICAgICAgICBzYXkoQlM3OCgKKyAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBpc3N0IG1pdCB2b2xsZW0gR2VudXNzICIrdGhpc19vYmplY3QoKS0+bmFtZShXRU4sMCkrIi4gIgorICAgICAgICAgICJEaXIgbGFldWZ0IGRhcyBXYXNzZXIgaW0gTXVuZGUgenVzYW1tZW4uIgorICAgICAgICApKTsKKyAgICAgICAgLy8gSGVpbGVuIHVuZCBhdWZlc3NlbiA6KQorICAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoSEVJTFVORyk7CisgICAgICB9CisgICAgICBlbHNlIHsgLy8gaWYgKGNoZWNrX2FuZF91cGRhdGVfdGltZWRfa2V5KCkpCisgICAgICAgIC8vIFdlbm4gZXMgbm9jaCB6dSBmcnVlaCBpc3QsIHdpZWRlciB3ZWxjaGVzIHp1IGVzc2VuCisgICAgICAgIC8vIEtlaW5lIEhlaWx1bmcsIGFiZXIgU2FldHRpZ3VuZworICAgICAgICB3cml0ZShCUzc4KAorICAgICAgICAgICJEdSBzb2xsdGVzdCAiK3RoaXNfb2JqZWN0KCktPm5hbWUoV0VOLDEpKyIgbGllYmVyIGplbWFuZGVtIGdlYmVuLCAiCisgICAgICAgICAgImRlbiBEdSBtYWdzdCwgc3RhdHQgYWxsZXMgc2VsYnN0IHp1IGZ1dHRlcm4sIGZpbmRlc3QgRHUgbmljaHQ/ICIKKyAgICAgICAgICAiRGVpbmUgR2llciBoYXQgRGlyIGpldHp0IG51ciBlaW5lbiB2b2xsZW4gQmF1Y2ggdW5kIGVpbiBzY2hsZWNodGVzICIKKyAgICAgICAgICAiR2V3aXNzZW4gYmVzY2hlZXJ0LiIKKyAgICAgICAgKSk7CisgICAgICB9IC8vIGVuZCBpZiAoY2hlY2tfYW5kX3VwZGF0ZV90aW1lZF9rZXkoKSkKKyAgICAgIGlmICghcmVtb3ZlKCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgIH0gLy8gZW5kIG9mIGVhdF9mb29kCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL1JFQURNRSBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YThkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL1JFQURNRQpAQCAtMCwwICsxLDE2IEBACitJbiBkaWVzZW0gVmVyemVpY2huaXMgYmVmaW5kZXQgc2ljaCBlaW4ga2xlaW5lciAiUHJheGlzIExQQy1LdXJzIi4KK0ltIFByaW56aXAgc2luZCBlcyB2ZXJzY2hpZWRlbmUgZ3V0IGRva3VtZW50aWVydGUgTFBDLU9iamVrdGUgZGllCithdWZlaW5hbmRlciBhdWZiYXVlbiB1bmQgaW4gZGVuZW4gYWxsZXMgbm90d2VuZGlnZSBlcmtsYWVydCB3aXJkLgorV2VyIGFsc28gc2Nob24gbWFsIGlyZ2VuZHdvIHByb2dyYW1taWVydCBoYXQgdW5kIHNpY2ggbnVyIGFuIGRpZQorTFBDLVVtZ2VidW5nIGdld29laG5lbiBtdXNzLCBmdWVyIGRlbiBpc3QgZGllc2VyIE1pbmktS3VycyBzaWNoZXIKK2dlbmF1IGRhcyByaWNodGlnZS4gRnVlciBqZW1hbmQgZGVyIG5vY2ggbmllIHByb2dyYW1taWVydCBoYXQgaXN0CitkaWVzZXIgS3VycyBhbGxlaW5lIGFiZXIgc2ljaGVyIG5pY2h0IGdlZWlnbmV0IHVtIHByb2dyYW1taWVyZW4genUKK2xlcm5lbi4gRGllIEZpbGVzIHNvbGx0ZW4gaW4gZGVyIEFscGhhYmV0aXNjaGVyIFJlaWhlbmZvbGdlIHVuZCBkYQorZGllIEZpbGVzIGF1ZmVpbmFuZGVyIGF1ZmJhdWVuLCBhdWNoIHZvbGxzdGFlbmRpZyBkdXJjaGdlZ2FuZ2VuCit3ZXJkZW4uCitCZWkgZGVtIFZlcnplaWNobmlzIHphdWJlcndhbGQgaGFuZGVsdCBlcyBzaWNoIHVtIGVpbiBrbGVpbmVzIHVuZAorZGFkdXJjaCB1ZWJlcnNjaGF1YmFyZXMgR2ViaWV0IHZvbiBtaXIsIGRhcyBuaWNodCBlaW5lIEFuc2FtbWx1bmcKK3ZvbiBBZGREZXRhaWxzIGRhcnN0ZWxsdCwgc29uZGVybiBhdWNoIGtvbXBsZXhlcmUgRnVua3Rpb25lbiB3aWUKK1ZpcnR1YWwgQ29tcGlsZXIgb2RlciBIZWlsc3RlbGxlbiBlbnRoYWVsdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFkcmVpYwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9oZWxsb193b3JsZC5jIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9oZWxsb193b3JsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDllMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL2hlbGxvX3dvcmxkLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisvLyBBdWNoIHdlbm4gZGllc2VzIE9iamVrdCBub2NoIGtlaW5lcmxlaSB0aWVmZXJlbiBTaW5uIGhhdCwgc28gaXN0IGVzIGRvY2gKKy8vIGJlcmVpdHMgZWluIHZvbGxzdGFlbmRpZ2VzIE9iamVrdCAoYmVyZWl0cyBlaW5lIGVpbnppZ2UgRnVua3Rpb24gcmVpY2h0CisvLyAgZnVlciBlaW4gTFBDLU9iamVjdCBhdXMpLgorCisvLyBEaWUgMyBGdW5rdGlvbmVuIGluIGRpZXNlbSBPYmpla3QgaGFiZW4gZGFydWViZXIgaGluYXVzIG5vY2ggZWluZQorLy8gZ2FueiBiZXNvbmRlcmUgQmVkZXV0dW5nLiBKZWRlIGRpZXNlciAzIEZ1bmt0aW9uZW4gd2lyZCB2b20gR2FtZS1Ecml2ZXIKKy8vIGltIGxhdWZlbmRlbiBCZXRyaWViIGJlaSBiZXNvbmRlcmVuIEFubGFlc3NlbiBhdWZnZXJ1ZmVuLgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQorLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuIHNvYmFsZCBkaWVzZXMgT2JqZWt0IGdlY2xvbnQgd2lyZC4KK3sKKyAgIC8vIGdpYnQgYW4gZGVuIFNwaWVsZXIgZGVyIGRpZXNlcyBPYmpla3QgY2xvbnQgZWluZSBNZWxkdW5nIGF1cy4KKyAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJIZWxsbyBXb3JsZCFcbiIpOworfQorCit2b2lkIGluaXQoKQorLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCBzb2JhbGQgZWluIFNwaWVsZXIgb2RlciBlaW4gTlBDIGluCisvLyBSZWljaHdlaXRlIGRpZXNlcyBPYmpla3RlcyBrb21tdDogQWxzbyBlbnR3ZWRlciB3ZW5uIGVpbiBMZWJld2VzZW4gaW4KKy8vIGRhcyBPYmpla3QgYmV3ZWd0IHdpcmQgb2RlciB1bWdla2VocnQgb2RlciB3ZW5uIGVpbiBMZWJld2VzZW4gaW4gZGllCisvLyBVbWdlYnVuZyBlaW5lcyBPYmpla3RlcyBrb21tdCBvZGVyIHVtZ2VrZWhydC4KK3sKKyAgIC8vIGdpYnQgd2llZGVyIGVpbmUgTWVsZHVuZyBhbiBkZW4gU3BpZWxlciBhdXMuLi4KKyAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICgiSGVsbG8gYWdhaW4gOikuXG4iKTsKK30KKwordm9pZCByZXNldCgpCisvLyBEaWVzZSBGdW5rdGlvbiB3aXJkIGltIGJlcnVlbXRlbiBSZXNldCBhdWZnZXJ1ZmVuLCBkZW4gRHUgamEgc2ljaGVyIGF1Y2gKKy8vIHNjaG9uIGFscyBTcGllbGVyIGtlbm5lbmdlbGVybnQgaGFzdCAoQWxzbyBhbGxlIDMwLTYwIE1pbnV0ZW4pLgorLy8gQXVzbmFobWU6IFdlbm4gZGFzIE9iamVrdCBsYWVuZ2VyZSBaZWl0IG1pdCBrZWluZW0gYW5kZXJlbiBPYmpla3QKKy8vIGtvbW11bml6aWVydCBoYXQsIHdpcmQgZGllc2UgRnVua3Rpb24gdm9ybGFldWZpZyBuaWNodCBtZWhyIGF1ZmdlcnVmZW4hCit7CisgIC8vIEhpZXIga2FubiBtYW4gbnVuIGF1Y2ggaXJnZW5kZXR3YXMgbWFjaGVuLiBFaW4gd3JpdGUoIi4uIikgaGFldHRlCisgIC8vIGhpZXIgamVkb2NoIGtlaW5lbiBFZmZla3QsIGRhIGtlaW4gU3BpZWxlciBkaWVzZSBGdW5rdGlvbiBhdXNnZWxvZXN0CisgIC8vIGhhdCB1bmQgZGFoZXIgbmljaHQgYmVrYW5udCBpc3QsIGFuIHdlbiBkaWUgTWVsZHVuZyBkZW5uIGdlaGVuIHNvbGwuLi4KK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvanV3ZWxlbi5jIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9qdXdlbGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwNzBhNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvanV3ZWxlbi5jCkBAIC0wLDAgKzEsNjYgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworLy8gRGllc2VzIGlzdCBlaW4gZXJzdGVzIE9iamVrdCBkYXMgc28gb2RlciBhZWhubGljaCB0YXRzYWVjaGxpY2ggaW0KKy8vIE1vcmdlbkdyYXVlbiB2b3Jrb21tZW4ga29lbm50ZS4KKworLy8gSmVkZXMgT2JqZWt0IGltIE1vcmdlbkdyYXVlbiBicmF1Y2h0IGJlcmVpdHMgZWluZSBzb2xjaGUgVmllbHphaGwgdm9uCisvLyBTdGFuZGFyZGZ1bmt0aW9uZW4sIGRhc3MgZXMgemllbWxpY2ggdW5tb2VnbGljaCBpc3QsIGRpZXNlIGFsbGUgaW4gamVkZW0KKy8vIE9iamVrdCB6dSBkZWZpbmllcmVuLiBEYWhlciAiZXJidCIgbWFuIGRpZXNlIEZ1bmt0aW9uZW4gdm9uIGVpbmVtCisvLyBTdGFuZGFyZG9iamVrdC4KKy8vICJFcmJlbiIgYmVkZXV0ZXQgaGllcmJlaSwgZGFzIG1hbiBhdWYgYWxsZSBGdW5rdGlvbmVuLCBkaWUgYmVyZWl0cyBpbQorLy8gU3RhbmRhcmRvYmpla3QgZGVmaW5pZXJ0IHNpbmQsIHp1Z3JlaWZlbiBrYW5uLgorLy8KKy8vIERpZSBmb2xnZW5kZSBaZWlsZSBlcmtsYWVydCwgZGFzcyBtYW4gZGFzIE9iamVrdCBhbiBkZXIgUG9zaXRpb24KKy8vICAvc3RkL3RoaW5nLmMgImVyYmVuIiBtb2VjaHRlLgoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKworLy8gRGllIEZ1bmt0aW9uIGZvbGdlbmRlciBaZWlsZSBrYW5uIG1hbiBzaWNoIHJlY2h0IGVpbmZhY2ggd2llIGZvbGd0CisvLyB2b3JzdGVsbGVuOiBXZW5uIGRlciBHYW1lLURyaXZlciBkaWVzZXMgT2JqZWt0IGhpZXIgY29tcGlsaWVydCwgZGFubgorLy8gdHV0IGVyIHNvLCBhbHMgd3VlcmRlIGRpZSBEYXRlaSAvc3lzL3Byb3BlcnRpZXMuaCBnZW5hdSBhbiBkaWVzZXIgU3RlbGxlCisvLyBoaWVyIGltIENvZGUgc3RlaGVuLgorLy8KKy8vIERpZSBEYXRlaSBwcm9wZXJ0aWVzLmggYmVpbmhhbHRldCBlaW5mYWNoIG51ciBoYXVmZW53ZWlzZSBEZWZpbmVzIGZ1ZXIKKy8vIGRpZSBoYXVmZW53ZWlzZSBQcm9wZXJ0aWVzLgorLy8KKy8vIEFubWVya3VuZzogQWxsZSBEZWZpbmVzIGluIGRpZXNlciBEYXRlaSBzdGFydGVuIHVlYnJpZ2VucyBtaXQgZWluZW0gJ1BfJy4KKy8vIEFtIEJlc3RlbiBzb2xsdGVzdCBEdSBlaW5mYWNoIG1hbCBrdXJ6IGluIC9kb2MvcHJvcGVydGllcy5oIHJlaW5zZWhuCisvLyB1bmQgZWluIGJpc3NjaGVuIHJ1bWxlc2VuCisvLyAgKGtlaW5lIEFuZ3N0LCBkaWUgbXVzcyBtYW4gbmljaHQgYWxsZSBrZW5uZW4gOikuCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBEaWUgRnVua3Rpb24gY3JlYXRlKCkgd3VyZGUgbmFlbWxpY2ggYmVyZWl0cyBpbiAvc3RkL3RoaW5nLmMKKyAgLy8gYmVzY2hyaWViZW4sIGthbm4gYWJlciBuaWNodCBtZWhyIHVlYmVyIGNyZWF0ZSgpIGF1ZmdlcnVmZW4gd2VyZGVuLCBkYQorICAvLyBkYW5uIGphIHdpZWRlciBkaWVzZSBGdW5rdGlvbiBoaWVyIGF1ZmdlcnVmZW4gd3VlcmRlCisgIC8vICh3b2R1cmNoIHdpciBkYW5uIGVpbmUgRW5kbG9zLVJla3Vyc2lvbiBoYWV0dGVuKS4KKyAgLy8gS3VyenNjaHJlaWJ3ZWlzZSB3YWVyZSA6OmNyZWF0ZSgpOyB3ZW5uIG1hbiBudXIgdm9uIGVpbmVtIE9iamVrdCBlcmJ0LgorICB0aGluZzo6Y3JlYXRlKCk7IC8vIG9kZXIgYXVjaCBlaW5mYWNoIDo6Y3JlYXRlKCk7CisKKyAgLy8gQXVjaCBkaWVzZSBGdW5rdGlvbiB3dXJkZSBhdXMgL3N0ZC90aGluZyBnZWVyYnQuCisgIC8vIFNldFByb3AoKSBpc3QgZWluZSBkZXIgd2ljaHRpZ3N0ZW4gRnVua3Rpb25lbiB1ZWJlcmhhdXB0LCB3ZW5uIGVzIGRhcnVtCisgIC8vIGdlaHQsIGVpbiBPYmpla3QgenUgYmVzY2hyZWliZW4uIE1pdCBkaWVzZXIgRnVua3Rpb24ga2FubnN0IER1IG5hZW1saWNoCisgIC8vIHphaGxyZWljaGUgRWlnZW5zY2hhZnRlbiAoZW5nbC4gcHJvcGVydGllcykgZGVzIE9iamVrdGVzIGZlc3RsZWdlbi4KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluaWdlIHdlcnR2b2xsZSBKdXdlbGVuIik7ICAgICAgLy8gZGllIEt1cnpiZXNjaHJlaWJ1bmcKKyAgU2V0UHJvcChQX0xPTkcsICJEaWUgSnV3ZWxlbiBnbGl0emVybiB2ZXJsb2NrZW5kLlxuIik7IC8vIExhbmdiZXNjaHJlaWJ1bmcKKyAgU2V0UHJvcChQX05BTUUsICJKdXdlbGVuIik7IC8vIGRlciBlaWdlbnRsaWNoZSBOYW1lCisgIFNldFByb3AoUF9OQU1FX0FESiwgIndlcnR2b2xsIik7IC8vIGRhcyBBZGpla3RpdiB2b3IgZGVtIE5hbWVuCisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7IC8vIEdlc2NobGVjaHQgKGthbm4gYXVjaCBNQUxFIG9kZXIgTkVVVEVSIHNlaW4pCisgIFNldFByb3AoUF9XRUlHSFQsIDUwMDApOyAvLyBkaWVzZXMgT2JqZWt0IHdpZWd0IDVrZworICBTZXRQcm9wKFBfVkFMVUUsIDEwMDAwKTsgLy8gZGFzIE9iamVrdCBpc3QgaW5zZ2VzYW10IDEwMDAwIE11ZW56ZW4gV2VydAorICAKKyAgLy8gTWl0IGRpZXNlciBGdW5rdGlvbiBrYW5uIG1hbiBlaW5lIGlkIGFuZ2ViZW4sIHVlYmVyIGRpZSBkYXMgT2JqZWt0CisgIC8vIGFuc3ByZWNoYmFyIGlzdC4KKyAgLy8gQW5tZXJrdW5nOiBBdWNoIGRpZXNlIEZ1bmt0aW9uIGlzdCB3aWVkZXIgdm9uIHN0ZC90aGluZyBnZWVyYnQsIGltCisgIC8vICAgZm9sZ2VuZGVuIHdlcmRlIGljaCBkaWVzIGFiZXIgbmljaHQgbWVociBiZWkgamVkZXIgRnVua3Rpb24gZXh0cmEKKyAgLy8gICBhbmdlYmVuLiBXZW5uIG5pY2h0IGFuZGVycyBhbmdlZ2ViZW4sIGhhbmRlbHQgZXMgc2ljaCBhYiBqZXR6dAorICAvLyAgIG5hZW1saWNoIF9pbW1lcl8gdW0gZXJlcmJ0ZSBGdW5rdGlvbmVuLgorICBBZGRJZCgianV3ZWxlbiIpOworICAKKyAgLy8gSW4gZGllc2VtIEZhbGwgYmVub2V0aWd0IG1hbiBub2NoIGVpbiB3ZWl0ZXJlcyBBZGpla3RpdiwgZGEgbWFuIGRhcworICAvLyBPYmpla3QgamEgYXVjaCBtaXQgd2VydHZvbGxlIEp1d2VsZW4gYW5zcHJlY2hlbiBrb2VubmVuIG1vZWNodGUuCisgIC8vIHouQi46IHVudCB3ZXJ0dm9sbGUganV3ZWxlbgorICAvLyAgICAgICBnaWIgd2VydHZvbGxlIGp1d2VsZW4gYW4gcGFkcmVpYworICBBZGRBZGplY3RpdmUoIndlcnR2b2xsZSIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9sb3MuYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbG9zLmMKQEAgLTAsMCArMSwxMTggQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4gLy8gd2llZGVyIHVuc2VyZSBhbGxnZW1laW5lbiBQcm9wZXJ0eXMKKyNpbmNsdWRlIDxtb3ZpbmcuaD4gICAgIC8vIGVpbmlnZSBEZWZpbmVzIHp1bSBCZXdlZ2VuIHZvbiBPYmpla3RlbiAocy51LikKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgICAvLyBPYmpla3QgdWViZXIgc2VpbmUgUHJvcGVydGllcyBiZXNjaHJlaWJlbi4uLgorICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFJ1YmJlbGxvcyIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgIkR1IGthbm5zdCBkaWVzZXMgTG9zIGF1ZnJ1YmJlbG4gdW0genUgc2VoZW4sIG9iIER1IGVpbmVuIGdyb3NzZW4gIgorICAgICJTY2hhdHpcbmdld29ubmVuIGhhc3QuXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiUnViYmVsbG9zIik7CisgICBTZXRQcm9wKFBfQVJUSUNMRSwgMSk7IC8vIGlzdCBlaWdlbnRsaWNoIGJlcmVpdHMgRGVmYXVsdHdlcnQKKyAgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgICBTZXRQcm9wKFBfVkFMVUUsIDEwMDApOworICAgU2V0UHJvcChQX1dFSUdIVCwgNTAwKTsKKyAgIFNldFByb3AoUF9JTkZPLCAiRGVpbmUgR2V3aW5uY2hhbmNlbiBiZWkgZGllc2VuIExvc2VuIHNpbmQgbmljaHQgIgorICAgICAgICAgICAgICAgICAgICJzb25kZXJsaWNoIGd1dC5cbiIpOworICAgU2V0UHJvcChQX01BR0lDLCAwKTsgLy8gKGVpbmZhY2ggbnVyLCB1bSBtYWwgYWxsZSBQcm9wZXJ0aWVzIHp1IGJlbnV0emVuKQorICAgQWRkSWQoImxvcyIpOyAvLyBub2NoIGVpbmUgaWQgYW5nZWJlbi4uLgorCisgICAvLyBNaXQgSGlsZmUgZGllc2VyIG5ldWVuIHdpY2h0aWdlbiBGdW5rdGlvbiBpc3QgZXMgbW9lZ2xpY2gsIEJlZmVobGUgenUKKyAgIC8vIGRlZmluaWVyZW4sIHVlYmVyIGRpZSBtYW4gaXJnZW5kZXR3YXMgYXVzbG9lc2VuIGtvZW5uZW4gc29sbDoKKyAgIC8vIFVuZCB6d2FyIHdpcmQgc29iYWxkIGVpbiBTcGllbGVyIGRlbiBCZWZlaGwgcnViYmxlIG9kZXIgcnViYmVsCisgICAvLyBiZW51dHp0LCBkaWUgRnVua3Rpb24gX3J1YmJlbG4oKSBoaWVyIGltIE9iamVrdCBhdWZnZXJ1ZmVuLiBEYSBkaWVzZQorICAgLy8gRnVua3Rpb24gYmlzaGVyIGphIG5vY2ggbmljaHQgZGVmaW5pZXJ0IGlzdCwgbXVzcyBkaWVzZSBuYXR1ZXJsaWNoCisgICAvLyBhdWNoIG5vY2ggcHJvZ3JhbW1pZXJ0IHdlcmRlbi4KKyAgIEFkZENtZCgoeyJydWJibGUiLCAicnViYmVsIn0pLCAiX3J1YmJlbG4iKTsKK30KKworLy8gRGllc2UgRnVua3Rpb24gc2llaHQgZ2xlaWNoIHVtIGVpbmlnZXMga29tcGxleGVyIGF1cyBhbHMgZGllIEZ1bmt0aW9uZW4KKy8vIGNyZWF0ZSgpLCBpbml0KCkgdW5kIHJlc2V0KCksIGRpZSBiaXNoZXIgYmVudXR6dCB3dXJkZW4uCisvLyBEYXMgc3RhdGljIGFtIEFuZmFuZyBlcmtsYWVydCBudXIsIGRhc3MgZGllc2UgRnVua3Rpb24gbmljaHQgdm9uIGF1c3NlbiwKKy8vIHNvbmRlcm4gbnVyIHZvbiBpbm5lcmhhbGIgZGVzIE9iamVrdGVzIGF1ZmdlcnVmZW4gd2VyZGVuIGthbm4uCisvLyBEYXMgImludCIgYW5zdGVsbGUgZGVzICJ2b2lkIiBiZWRldXRldCwgZGFzcyBkaWUgRnVua3Rpb25lbiBlaW4gRXJnZWJuaXMKKy8vIHp1cnVlY2tsaWVmZXJ0LiBEYSBkaWVzZSBGdW5rdGlvbiBpbiBWZXJiaW5kdW5nIG1pdCBBZGRDbWQoKSBiZW51dHp0CisvLyB3aXJkLCBoYXQgZGllc2VyIFJ1ZWNrZ2FiZXdlcnQgYXVjaCBlaW5lIGJlc29uZGVyZSBCZWRldXR1bmc6CisvLyAgIEVpbmUgMSBiZWRldXRldCwgZGFzcyBkZXIgQmVmZWhsIGZlcnRpZyBhYmdlYXJiZWl0ZXQgd3VyZGUuCisvLyAgIEVpbmUgMCBiZWRldXRldCwgZGFzIE9iamVrdCBrb25udGUgbWl0IGRlbSBCZWZlaGwgbmljaHRzIGFuZmFuZ2VuLCBkZXIKKy8vICAgIEdhbWVkcml2ZXIgbXVzcyBhbHNvIG5vY2ggaW4gd2VpdGVyZW4gT2JqZWt0ZW4gYW5mcmFnZW4sIGRpZSBkZXIKKy8vICAgIFNwaWVsZXIgYmVpIHNpY2ggdHJhZWd0LgorLy8gRGVyIFN0cmluZyAnc3RyJywgZGVuIGRpZSBGdW5rdGlvbiBhbHMgUGFyYW1ldGVyIHVlYmVyZ2ViZW4gYmVrb21tdCwKKy8vIGVudGhhZWx0IGRhcywgd2FzIGRlciBTcGllbGVyIGF1c3NlciBkZW0gZWlnZW50bGljaGVuIFZlcmIgZWluZ2VnZWJlbgorLy8gaGF0IChXb2VydGVyIHdpZSAndW5kJywgJ2VpbicsICdkZXInLCAnZGllJywgJ2RhcycgLi4uIHdlcmRlbiBoaWVyYmVpCisvLyAgenV2b3IgaGVyYXVzZ2VmaWx0ZXJ0KQorLy8gQnNwLjogICBydWJiZWwgbG9zICAgICAgLT4gIF9ydWJiZWxuKCJsb3MiKQorLy8gICAgICAgICBydWJiZWwga2F0emUgICAgLT4gIF9ydWJiZWxuKCJrYXR6ZSIpCisvLyAgICAgICAgIHJ1YmJlbCBsb3MgYXVmICAtPiAgX3J1YmJlbG4oImxvcyBhdWYiKQorcHVibGljIGludCBfcnViYmVsbihzdHJpbmcgc3RyKQoreworICAgLy8gRGllIEZ1bmt0aW9uIG5vdGlmeV9mYWlsKCkgaXN0IHdpZWRlciBlaW5lIEZ1bmt0aW9uIGRlcyBHYW1lZHJpdmVyczoKKyAgIC8vIFVuZCB6d2FyIGlzdCBlcyBtb2VnbGljaCBoaWVyIGVpbmUgTWVsZHVuZyBhbnp1Z2ViZW4sIGRpZSBhbnN0ZWxsZQorICAgLy8gZWluZXMgIldpZSBiaXR0ZT8iIGtvbW10LCBmYWxscyBrZWluIE9iamVrdCBkZW4gQmVmZWhsIHJpY2h0aWcKKyAgIC8vIGFiZ2VhcmJlaXRldCBoYXQuCisgICBub3RpZnlfZmFpbCgiU3ludGF4OiBydWJiZWwgbG9zIGF1ZlxuIik7IC8vIGVpZ2VudGxpY2ggZWZ1bjo6bm90aWZ5X2ZhaWwoKQorCisgICAvLyBXZW5uIGRlciB1ZWJlcmdlYmVuZSBTdHJpbmcgdW5nbGVpY2ggImxvcyBhdWYiIGlzdCwgZGFubiBmdWVobHQgc2ljaAorICAgLy8gZGFzIE9iamVrdCBuaWNodCBhbmdlc3Byb2NoZW4sIGthbm4gZGFzIFZlcmIgYWxzbyBuaWNodCBrb21wbGV0dAorICAgLy8gYWJhcmJlaXRlbiB1bmQgZ2lidCBkZXNoYWxiIGVpbmUgMCB6dXJ1ZWNrLgorICAgaWYgKHN0ciE9ImxvcyBhdWYiKSByZXR1cm4gMDsKKworICAgLy8gQXVjaCBkaWUgRnVua3Rpb24gcmFuZG9tKCkgaXN0IHdpZWRlciBlaW5lIEZ1bmt0aW9uIGRlcyBHYW1lZHJpdmVyOgorICAgLy8gVW5kIHp3YXIgbGllZmVydCBzaWUgZWluZSBnYW56emFobGlnZSBadWZhbGxzemFobCB6d2lzY2hlbiAwIHVuZCBuLTEKKyAgIC8vICAod29iZWkgbiBkaWUgdWViZXJnZWJlbmUgWmFobCBpc3QpLiBJbiBkaWVzZW0gRmFsbCBhbHNvIHp3aXNjaGVuCisgICAvLyAwIHVuZCA5OS4KKyAgIGlmIChyYW5kb20oMTAwKTw5MikgeyAvLyBzb2xsdGUgZGllc2UgWmFobCA8IDkyIHNlaW4sIGRhbm4gdHVlIEZvbGdlbmRlczoKKyAgICAgd3JpdGUoIkR1IHJ1YmJlbHN0IGRhcyBMb3MgYXVmLiBMZWlkZXIgd2FyIGVzIGplZG9jaCBudXIgZWluZSBOaWV0ZS5cbiIKKyAgICAgICAgICArIlZlcmFlcmdlcnQgbGFlc3N0IER1IGRhcyBMb3MgZGVzaGFsYiBmYWxsZW4uXG4iKTsKKyAgIH0KKyAgIGVsc2UgeyAvLyBzb2xsdGUgZGllIFphaGwgbmljaHQgPCA5MiBnZXdlc2VuIHNlaW4sIGRhbm4gdHVlIEZvbGdlbmRlczoKKyAgICAgb2JqZWN0IG9iOyAvLyBiZXJlaXRzdGVsbGVuIGVpbmVyIEhpbGZzdmFyaWFibGVuCisKKyAgICAgd3JpdGUoIkR1IHJ1YmJlbHN0IGRhcyBMb3MgYXVmIHVuZCBzdHJhaGxzdCB2b3IgRnJldWRlLiBFcyB3YXIgZGVyICIKKyAgICAgICAgICArImFic29sdXRlIEhhdXB0Z2V3aW5uLlxuU29mb3J0IGtvbW10IGVpbiBCb3RlIGhlcmVpbiB1bmQgIgorICAgICAgICAgICsidWViZXJyZWljaHQgRGlyIERlaW5lbiBHZXdpbm4uXG4iKTsKKworICAgICAvLyBNaXQgY2xvbmVfb2JqZWN0KCkga2FubiBtYW4gZWluIGJlbGllYmlnZXMgT2JqZWt0IENsb25lbiwgaW5kZW0gbWFuCisgICAgIC8vIGVpbmZhY2ggZGVuIGVudHNwcmVjaGVuZGVuIEZpbGVuYW1lbiBhbHMgUGFyYW1ldGVyIHVlYmVyZ2lidC4KKyAgICAgb2I9Y2xvbmVfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9qdXdlbGVuIik7CisKKyAgICAgLy8gTnVuIGtvbW1lbiBnbGVpY2ggMyBuZXVlIERpbmdlIGF1ZiBlaW5tYWwuLi4KKyAgICAgLy8gTWl0IC0+IHdpcmQgZWluZSBGdW5rdGlvbiBpbiBlaW5lbSBhbmRlcmVuIE9iamVrdCBhdWZnZXJ1ZmVuCisgICAgIC8vICAoYWx0ZXJuYXRpdiBhdWNoOiBjYWxsX290aGVyKG9iLG1vdmUsdGhpc19wbGF5ZXIoKSwgTV9HRVQpOyApCisgICAgIC8vIERpZSBGdW5rdGlvbiwgZGllIGhpZXJiZWkgYXVmZ2VydWZlbiB3ZXJkZW4gc29sbCwgaGVpc3N0IG1vdmUoKS4KKyAgICAgLy8gRGllc2UgRnVua3Rpb24gaXN0IGluIGFsbGVuIE9iamVrdGVuIGRlZmluaWVydCwgZGllIC9zdGQvdGhpbmcgZXJiZW4uCisgICAgIC8vIFNvbWl0IGtvZW5uZW4gd2lyIGFsc28gZmVzdCBkYXZvbiBhdXNnZWhlbiwgZGFzcyBzaWUgYXVjaCBpbiB1bnNlcmVuCisgICAgIC8vIEp1d2VsZW4gdm9yaGFuZGVuIGlzdC4KKyAgICAgLy8gdGhpc19wbGF5ZXIoKSBpc3QgZWluZSBzZWhyIHdpY2h0aWdlIEdhbWVkcml2ZXItRnVua3Rpb24sIGRhIHNpZQorICAgICAvLyB1bnMgZGFzIExlYmV3ZXNlbiB6dXJ1ZWNrbGllZmVydCwgZGFzIGdlcmFkZSBha3RpdiBkdXJjaCBlaW5lbiBCZWZlaGwKKyAgICAgLy8gZGVuIGFrdHVlbGxlbiBGdW5rdGlvbnNhdWZydWYgZ2VzdGFydGV0IGhhdC4KKyAgICAgLy8gTV9HRVQgaXN0IGxlZGlnbGljaCBlaW4gRGVmaW5lLCBkYXMgaW4gbW92aW5nLmggZGVmaW5pZXJ0IGlzdC4KKyAgICAgLy8gTmFlaGVyZXMgaGllcnp1IGZpbmRldCBtYW4gYXVjaCBpbiA8bWFuIG1vdmU+LgorICAgICBvYi0+bW92ZSh0aGlzX3BsYXllcigpLCBNX0dFVCk7CisgICAgIC8vIEFDSFRVTkc6IHVtIGRpZXNlcyBCZWlzcGllbCBzaW1wZWwgenUgaGFsdGVuLCB3aXJkIGhpZXIgZGFyYXVmCisgICAgIC8vIHZlcnppY2h0ZXQsIHp1IHBydWVmZW4sIG9iIGRpZXNlIEJld2VndW5nIHVlYmVyaGF1cHQgZnVua3Rpb25pZXJ0CisgICAgIC8vIGhhdC4gTm9ybWFsZXJ3ZWlzZSBtdXNzIG1hbiBpbiBkaWVzZW0gRmFsbCAobWlzc2x1bmdlbmUgQmV3ZWd1bmcpCisgICAgIC8vIGVpbmUgRmVobGVyYmVoYW5kbHVuZyBkdXJjaGZ1ZWhyZW4gKHouQi4gb2Igd2llZGVyIGVudGZlcm5lbiwKKyAgICAgLy8gTWVsZHVuZyBhbiBkZW4gU3BpZWxlciBhdXNnZWJlbikuCisgICB9CisKKyAgIC8vIERpZSBGdW5rdGlvbiBzYXkoKSBnaWJ0IGFuIGFsbGUgU3BpZWxlciBpbSBSYXVtIGRlcyBha3RpdmVuIFNwaWVsZXJzCisgICAvLyBlaW5lIE5hY2hyaWNodCBhdXMsIGFiZXIgbmljaHQgYW4gZGVuIGJldHJvZmZlbmVuIFNwaWVsZXIgc2VsYnN0IQorICAgLy8gRGllIEZ1bmt0aW9uIE5hbWUoKSwgZGllIGhpZXIgaW0gU3BpZWxlciBhdWZnZXJ1ZmVuIHdpcmQsIHdlcnRldAorICAgLy8gZGVzc2VuIFByb3BlcnRpZSBQX05BTUUgYXVzIHVuZCBkZWtsaW5pZXJ0IGRlbiBOYW1lbiBpbSBhbmdlZ2ViZW5lbgorICAgLy8gRmFsbC4KKyAgIHNheSh0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBydWJiZWx0IGVpbiBMb3MgYXVmLlxuIik7CisKKyAgIC8vIFVuZCBudW4gc29sbCBzaWNoIGRhcyBPYmpla3Qgc2VsYnN0IGVudGZlcm5lbiAoemVyc3RvZXJlbikuCisgICByZW1vdmUoKTsKKworICAgLy8gRGEgZGVyIEJlZmVobCBqYSBrb21wbGV0dCBhYmdlYXJiZWl0ZXQgd3VyZGUsIGdlYmVuIHdpciBlaW5lIDEKKyAgIC8vIHp1cnVlY2suCisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbWlsY2guYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbWlsY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI2MTczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9taWxjaC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworLy8gQW5tZXJrdW5nOiBIZXV0enV0YWdlIGdpYnQgZXMgZnVlciBMZWJlbnNtaXR0ZWwgKGJ6dy4gYWxsZSBEaW5nZSwgZGllCisvLyBtYW4gZXNzZW4gb2RlciB0cmlua2VuIGthbm4pIGVpbiBTdGFuZGFyZG9iamVrdCBuYW1lbnMgL3N0ZC9mb29kLAorLy8gd2VsY2hlcyB2aWVsZSBGdW5rdGlvbmFsaXRhZXQgbWl0YnJpbmd0LCBkaWUgbWFuIGFuc29uc3RlbiBzZWxiZXIKKy8vIG11ZWhzYW0gYmFzdGVsbiBtdXNzLiBEaWUgVmVyd2VuZHVuZyBpc3QgZHJpbmdlbmQgZW1wZm9obGVuLgorCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPiAvLyB3aWVkZXIgdW5zZXJlIGFsbGdlbWVpbmVuIFByb3BlcnRpZXMKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKy8vIGdsb2JhbGUgVmFyaWFibGUsIGRpZSBhbmdpYnQsIHdpZSB2b2xsIGRpZSBGbGFzY2hlIGlzdC4gRXMgc2luZCA1CisvLyBQb3J0aW9uZW4gZW50aGFsdGVuLgoraW50IG1lbmdlID0gNTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICAvLyBPYmpla3QgdWViZXIgc2VpbmUgUHJvcGVydGllcyBiZXNjaHJlaWJlbi4uLgorICAgLy8gUF9TSE9SVCB1bmQgUF9MT05HIHdlcmRlbiBkaXJla3QgYWxzIEZ1bmt0aW9uIGltcGxlbWVudGllcnQgKHMudS4pCisgICBTZXRQcm9wKFBfTkFNRSwgIk1pbGNoZmxhc2NoZSIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9WQUxVRSwgODApOworICAgU2V0UHJvcChQX1dFSUdIVCwgMTAwMCk7CisgICBBZGRJZCgoeyJmbGFzY2hlIiwgIm1pbGNoZmxhc2NoZSJ9KSk7CisgICBBZGRDbWQoKHsidHJpbmsiLCAidHJpbmtlIn0pLCAiX3RyaW5rZW4iKTsKK30KKworLy8gQW5zdGVsbGUgdm9uIFBfU0hPUlQgS3VyemJlc2NocmVpYnVuZyB1ZWJlciBGdW5rdGlvbiBzaG9ydCgpLgorLy8gRGllcyBpc3QgbmljaHQgaW1tZXIgbW9lZ2xpY2gsIGRhIG5pY2h0IHp3YW5nc2xhZXVmaWcgenUgamVkZXIgUHJvcGVydGllCisvLyBlaW5lIGdsZWljaG5hbWlnZSBGdW5rdGlvbiBleGlzdGllcnQuCisvLyBFcyBpc3QgYWxsZXJkaW5ncyBub2NoIHNvZy4gUXVlcnltZXRob2RlbiAoc2llaGUgZGF6dSA8bWFuIFF1ZXJ5UHJvcD4gdW5kCisvLyA8bWFuIFF1ZXJ5PiBiZWkgQmVkYXJmKS4KK3B1YmxpYyBzdHJpbmcgc2hvcnQoKQoreworICAgc3RyaW5nIHN0cjsKKyAgIHN3aXRjaChtZW5nZSkgeworICAgICBjYXNlIDE6IHN0cj0iRWluZSBmYXN0IGxlZXJlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDI6IHN0cj0iRWluZSBiYWxkIGxlZXJlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDM6IHN0cj0iRWluZSBoYWxidm9sbGUgTWlsY2hmbGFzY2hlLlxuIjsgIGJyZWFrOworICAgICBjYXNlIDQ6IHN0cj0iRWluZSBmYXN0IHZvbGxlIE1pbGNoZmxhc2NoZS5cbiI7IGJyZWFrOworICAgICBjYXNlIDU6IHN0cj0iRWluZSB2b2xsZSBNaWxjaGZsYXNjaGUuXG4iOyAgICAgIGJyZWFrOworICAgICBkZWZhdWx0OiBzdHI9IkVpbmUgbGVlcmUgTWlsY2hmbGFzY2hlLlxuIjsKKyAgIH0KKyAgIHJldHVybiBzdHI7Cit9CisKK3B1YmxpYyBzdHJpbmcgbG9uZygpCit7CisgICBpZiAobWVuZ2U+MSkKKyAgICAgIHJldHVybiAiRWluZSBGbGFzY2hlIG1pdCBsZWNrZXJlciBWb2xsbWlsY2guXG4iOworICAgZWxzZQorICAgICAgcmV0dXJuICJEaWUgTWlsY2hmbGFzY2hlIGlzdCBiYWxkIGxlaWRlciBzY2hvbiBhbGxlLCBEdSBzb2xsdGVzdCAiCisgICAgICAgICAgICAgIkRpY2ggdmllbGxlaWNodCBtYWxcbm5hY2ggTmFjaHNjaHViIHVtc2Vobi5cbiI7Cit9CisKK3B1YmxpYyBpbnQgX3RyaW5rZW4oc3RyaW5nIHN0cikKK3sKKyAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHRyaW5rZSBhdXMgbWlsY2hmbGFzY2hlXG4iKTsKKworICAgLy8gRmFsbHMgZGllIGVyc3RlbiB2aWVyIFplaWNoZW4gaW4gZGVtIHVlYmVyZ2ViZW5lbiBTdHJpbmcgdW5nbGVpY2gKKyAgIC8vICJhdXMgIiBzaW5kLCBkYW5uIGZ1ZWhsdCBzaWNoIGRhcyBPYmpla3QgbmljaHQgYW5nZXNwcm9jaGVuLCBrYW5uIGRhcworICAgLy8gVmVyYiBhbHNvIG5pY2h0IGtvbXBsZXR0IGFiYXJiZWl0ZW4gdW5kIGdpYnQgZGVzaGFsYiBlaW5lIDAgenVydWVjay4KKyAgIGlmIChzdHJbMC4uM10hPSJhdXMgIikgcmV0dXJuIDA7CisKKyAgIC8vIEljaCBiZW51dHplIG51biBhbGxlcyBhYiBkZW0gdmllcnRlbiBaZWljaGVuIHVuZCBwcnVlZmUsIG9iIHNpY2ggZGFzCisgICAvLyBPYmpla3QgZGF2b24gYW5nZXNwcm9jaGVuIGZ1ZWhsdC4gSGllcnp1IGRpZW50IGRpZSBGdW5rdGlvbiBpZCgpLgorICAgLy8gR3Jvc3NlciBWb3J0ZWlsOiBVZWJlcnNpY2h0bGljaCB1bmQgc3BhZXRlcmVzIEVyZ2FlbnplbiB2b24gSWRzIGJ6dy4KKyAgIC8vIEFkamVrdGl2ZW4gZ2VodCBzZWhyIGVpbmZhY2ggdW5kIGVyc3BhcnQgbGFuZ2UgaWYoKS1BYmZyYWdlbi4KKyAgIGlmICggIWlkKHN0cls0Li5dKSApIHJldHVybiAwOworCisgICBpZiAobWVuZ2U8PTApIHsKKyAgICAgd3JpdGUoIkRpZSBNaWxjaGZsYXNjaGUgaXN0IGxlaWRlciBzY2hvbiBsZWVyIDooLlxuIik7CisgICB9CisgICBlbHNlIHsKKyAgICAgLy8gZHJpbmtfc29mdCgpIGlzdCBlaW5lIEZ1bmt0aW9uLCBkaWUgaW4gYWxsZW4gTGViZXdlc2VuIGltCisgICAgIC8vIE1vcmdlbmdyYXVlbiBkZWZpbmllcnQgaXN0IHVuZCB1ZWJlciBkaWUgbWFuIHNvd29obCBBYmZyYWdlbiBhbHMKKyAgICAgLy8gYXVjaCBob2Noc2V0emVuIHZvbiBQX0RSSU5LIHZvcm5laG1lbiBzb2xsdGUuCisgICAgIGlmICh0aGlzX3BsYXllcigpLT5kcmlua19zb2Z0KDEwKSkgeworCisgICAgICAgLy8gaGVhbF9zZWxmKCkgaXN0IGF1Y2ggaW4gYWxsZW4gTGViZXdlc2VuIGRlZmluaWVydCB1bmQgaGVpbHQgYmVpCisgICAgICAgLy8gZGVtIExlYmV3ZXNlbiBMZWJlbnMtIHVuZCBLb256ZW50cmF0aW9uc3B1bmt0ZS4KKyAgICAgICB0aGlzX3BsYXllcigpLT5oZWFsX3NlbGYoMTApOworICAgICAgIHdyaXRlKCJHZW51ZXNzbGljaCB0cmlua3N0IER1IGVpbmVuIFNjaGx1Y2sgTWlsY2guXG4iKTsKKyAgICAgICBzYXkodGhpc19wbGF5ZXIoKS0+TmFtZShXRVIpKyIgdHJpbmt0IGVpbmVuIFNjaGx1Y2sgVm9sbG1pbGNoLFxuIik7CisgICAgICAgbWVuZ2UtLTsKKyAgICAgfQorICAgICBlbHNlIHdyaXRlKCJTb3ZpZWwga2FubnN0IER1IGxlaWRlciBuaWNodCBtZWhyIHRyaW5rZW4uXG4iKTsKKyAgIH0KKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9QcmF4aXMtS3Vycy9ucGMuYyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhNTRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvUHJheGlzLUt1cnMvbnBjLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8Z3VhcmQuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKy8vIEVpbiBOUEMgd2lyZCBuaWNodCB2b24gL3N0ZC90aGluZyBkaXJla3QgZ2VlcmJ0LCBzb25kZXJuIHZvbiAvc3RkL25wYy4KKy8vIERhIC9zdGQvbnBjIGFiZXIgc2VpbmVyc2VpdHMgd2llZGVyIHZvbiAvc3RkL3RoaW5nIGVyYnQsIHNpbmQgaW0gTlBDIGF1Y2gKKy8vIHNhZW10bGljaGUgRnVua3Rpb25lbiBkZWZpbmllcnQsIGRpZSBiZXJlaXRzIGluIC9zdGQvdGhpbmcgZW50aGFsdGVuIHNpbmQuCitpbmhlcml0ICIvc3RkL25wYyI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICAvLyBjcmVhdGVfZGVmYXVsdF9ucGMoKSBzZXR6dCBzY2hvbiBtYWwgZWluaWdlIHdpY2h0aWdlIFByb3BlcnRpZXMgd2llCisgICAvLyBQX0FUVFJJQlVURVMgYXV0b21hdGlzY2guLi4KKyAgIGNyZWF0ZV9kZWZhdWx0X25wYygyMCwgMzAwKTsKKworICAgLy8gS2VpbmUgQW5nc3Q6IEVzIG11ZXNzZW4ga2VpbmVzd2VncyBpbW1lciBhbGxlIGRpZXNlIFByb3BlcnRpZXMgYmVudXR6dAorICAgLy8gd2VyZGVuLCBhdWNoIHdlbm4gaWNoIHNpZSBqZXR6dCBlaW5tYWwgYWxsZSBhbmdlYmUsIHVtIGVpbmUgVWViZXJzaWNodAorICAgLy8genUgZ2ViZW4sIHdhcyBtYW4gYWxsZXMgdWViZXIgUHJvcGVydGllcyBzdGV1ZXJuIGthbm4uLi4KKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBmaWVzZXIgT3JrIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkRlciBPcmsgc2NoYXV0IERpY2ggZ3JpbW1pZyBhbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJPcmsiKTsKKyAgIFNldFByb3AoUF9OQU1FX0FESiwgImZpZXMiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICAgU2V0UHJvcChQX01BR0lDLCAwKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTElWSU5HKTsKKworICAgLy8gbnVuIGtvbWVuIGVpbmlnZSB3aXJrbGljaCBuZXVlIFByb3BlcnRpZXMKKyAgIFNldFByb3AoUF9JTkZPLCAiRGVyIE9yayBpc3QgZWluIGdhbnogZ2VtZWluZXIuLi4gOilcbiIpOworICAgU2V0UHJvcChQX0FMSUdOLCAtNTAwKTsgLy8gQWxpZ25tZW50IGRlcyBHZWduZXJzCisgICBTZXRQcm9wKFBfUkFDRSwgIk9yayIpOyAvLyBSYXNzZSBkZXMgTlBDcworICAgU2V0UHJvcChQX0FHR1JFU1NJVkUsIDEpOyAvLyBncmVpZnQgYWdncmVzc2l2IGplZGVuIGFuCisgICBTZXRQcm9wKFBfQVRUUklCVVRFUywgKFtBX0lOVDo1LCBBX0RFWDoxMCwgQV9TVFI6MjUsIEFfQ09OOjEwXSkpOworICAgU2V0UHJvcChQX1NJWkUsIDEzNCk7IC8vIEdyb2Vzc2UgaW4gY20KKyAgIFNldFByb3AoUF9NQVhfSFAsIDMwMCk7IC8vIG1heC4gTGViZW5zcHVua3RlCisgICBTZXRQcm9wKFBfSFAsIDMwMCk7IC8vIExlYmVuc3B1bmt0ZQorICAgU2V0UHJvcChQX01BWF9TUCwgMjAwKTsgLy8gbWF4LiBNYWdpZXB1bmt0ZQorICAgU2V0UHJvcChQX1NQLCAyMDApOyAvLyBNYWdpZXB1bmt0ZQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsgLy8gR3J1bmRydWVzdHVuZ3NzY2h1dHogZGVzIEtvZXJwZXJzCisgICBTZXRQcm9wKFBfTUFYX0hBTkRTLCAyKTsgLy8ga2FlbXBmdCBtaXQgendlaSBIYWVuZGVuLi4uCisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgYmxvc3NlbiBIYWVuZGVuIiwgMTUwfSkpOworICAgU2V0UHJvcChQX05PTUFHSUMsIDIwKTsgLy8gMjAlIFJlc2lzdGVueiBnZWdlbiBTcGVsbHMKKyAgIFNldFByb3AoUF9HVUFSRCwgMjApOyAvLyBEZXIgTlBDIGxhZXNzdCBzaWNoIGdnZi4gd2VnbG9ja2VuCisgICBTZXRQcm9wKFBfTk9fR0xPQkFMX0FUVEFDSywgMCk7IC8vIHdpcmQgdm9uICd0b2V0ZSBhbGxlcycgZXJmYXNzdAorICAgU2V0UHJvcChQX05PX0FUVEFDSywgMCk7ICAvLyBrYW5uIG1hbiBkZW4gTlBDIHVlYmVyaGF1cHQgYW5ncmVpZmVuPworICAgU2V0UHJvcChQX0ZSSUVORCwgMCk7IC8vIHNvbGwgZGVyIE5QQyBpbiBTcGVsbHMgYWxzIEZyZXVuZCBlcmZhc3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VyZGVuPworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0UsIERUX0ZJUkUpOyAgLy8gUmVzaXN0ZW56ZW4KKyAgIFNldFByb3AoUF9WVUxORVJBQklMSVRZLCBEVF9IT0xZKTsgIC8vIEVtcGZpbmRsaWNoa2VpdGVuCisgICBTZXRQcm9wKFBfRk9PRCwgMCk7CisgICBTZXRQcm9wKFBfTUFYX0ZPT0QsIDEwMCk7CisgICBTZXRQcm9wKFBfRFJJTkssIDApOworICAgU2V0UHJvcChQX01BWF9EUklOSywgMTAwKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMTAwKTsKKyAgIFNldFByb3AoUF9YUCwgUXVlcnlQcm9wKFBfTUFYX0hQKSpRdWVyeVByb3AoUF9IQU5EUylbMF0qNSk7IC8vIEVyZmFocnVuZworICAgU2V0UHJvcChQX01VUkRFUl9NU0csICJJY2gga29tbWUgZG9jaCBlaCB3aWVkZXIhXG4iKTsgLy8gTW9lcmRlcm1lbGR1bmcKKyAgIFNldFByb3AoUF9LSUxMX05BTUUsICJFaW4gZmllc2VyIFRlc3RvcmsiKTsgLy8gbm9ldGlnIGZhbGxzICE9IFBfTkFNRQorICAgU2V0UHJvcChQX0tJTExfTVNHLCAiRGFzIGtvbW10IGRhdm9uIHdlbm4gbWFuIHNpY2ggbWl0IG1pciBhbmxlZ3QuXG4iKTsKKyAgIFNldFByb3AoUF9ESUVfTVNHLCAiRGVyIE9yayBzY2hyZWl0IGVpbiBsZXR6dGVzIG1hbCBsYXV0IGF1Zi5cbiIpOworICAgU2V0UHJvcChQX05PQ09SUFNFLCAwKTsgLy8gc29sbCBkZXIgTlBDIGVpbmUgTGVpY2hlIGhpbnRlcmxhc3Nlbj8KKyAgIFNldFByb3AoUF9IRUFMLCAtMTApOyAvLyB3aWV2aWVsIExQIGJla29tbXQgbWFuIGJlaW0gTGVpY2hlbiBlc3Nlbi4uLgorCisgICAvLyBkZXIgT3JrIGlzdCBNaXRnbGllZCBkZXIgQWJlbnRldXJlcmdpbGRlLi4uCisgICBTZXRQcm9wKFBfR1VJTEQsICJhYmVudGV1cmVyIik7IC8vIGluIGRpZSBBYmVudGV1ZXJnaWxkZSBtaXQgaWhtLi4uCisgICBTZXRQcm9wKFBfR1VJTERfTEVWRUwsIDIwKTsKKyAgIE1vZGlmeVNraWxsKCJmZXVlcmJhbGwiLChbU0lfU0tJTExBQklMSVRZOjEwMDAwXSksMSwiYWJlbnRldXJlciIpOworCisgICAvLyBudW4gbm9jaCBlaW5lIGFuZGVyZSBBcnQgenUgemF1YmVybi4uLgorICAgU2V0UHJvcChQX1NQRUxMUkFURSwgMTApOworICAgQWRkU3BlbGwoMTAwLCA0MDAsCisgICAgICJEZXIgT3JrIHRyaXR0IERpY2ggZWlubWFsIGZlc3RlIHp3aXNjaGVuIGRpZSBCZWluZS5cbiIsCisgICAgICJEZXIgT3JrIHRyaXR0IEBXRU4gZWlubWFsIGZlc3RlIHp3aXNjaGVuIGRpZSBCZWluZS5cbiIsIERUX0JMVURHRU9OKTsKKworICAgLy8gd2FzIHNvbGwgZGVyIE5QQyBtaXQgaWhtIGdlZ2ViZW5lbiBHZWdlbnN0YWVuZGVuIG1hY2hlbi4uLgorICAgU2V0UHJvcChQX1JFSkVDVCwgKHtSRUpFQ1RfRFJPUCwgIkRhbWl0IGthbm4gaWNoIG5pY2h0cyBhbmZhbmdlbi5cbiJ9KSk7CisKKyAgIC8vIHVuZCBuYXR1ZXJsaWNoIGF1Y2ggbm9jaCBlaW5lIGlkIGZ1ZXIgZGVuIG9yaworICAgQWRkSWQoIm9yayIpOworCisgICAvLyBEZXIgTlBDIGhhdCBpbW1lciBlaW5pZ2UgSnV3ZWxlbiBiZWkgc2ljaC4KKyAgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL1ByYXhpcy1LdXJzL2p1d2VsZW4iKTsKK30KKworLy8gRGllc2UgRnVua3Rpb24gd2lyZCBhdWZnZXJ1ZmVuLCB3ZW5uIG1hbiBlaW5lbiBHZWdlbnN0YW5kIGJla29tbXQuLi4KK3B1YmxpYyB2b2lkIGdpdmVfbm90aWZ5KG9iamVjdCBvYikKK3sKKyAgIGlmIChvYi0+aWQoIm1pbGNoZmxhc2NoZSIpKSAvLyBNaWxjaCBhbm5laG1lbiB1bmQgZWluZW4gU3BydWNoIGF1ZnNhZ2VuCisgICAgIHdyaXRlKCJEZXIgT3JrIHNhZ3Q6IE9oaC4uLi4gRGFua2UgZnVlciBkaWUgbGVja2VyZSBNaWxjaC5cbiIpOworICAgZWxzZSA6OmdpdmVfbm90aWZ5KG9iKTsgLy8gR2VnZW5zdGFuZCBmYWxsZW4gbGFzc2VuCit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIHdpcmQgYXVmZ2VydWZlbiwgd2VubiB1bnMgamVtYW5kIGltIEthbXBmIFNjaGFkZW4genVmdWVnZW4KKy8vIG1vZWNodGUuLi4KK3B1YmxpYyB2YXJhcmdzIGludCBEZWZlbmQoaW50IGRhbSwgbWl4ZWQgZGFtX3R5cGUsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICBpZiAoIXJhbmRvbSg0KSkKKyAgICAgd3JpdGUoIkRlciBPcmsgd2VpY2h0IERlaW5lbSBBbmdyaWZmIGdlc2NoaWNrdCBhdXMuXG4iKTsKKyAgIGVsc2UKKyAgICAgcmV0dXJuIDo6RGVmZW5kKGRhbSwgZGFtX3R5cGUsIHNwZWxsLCBlbmVteSk7Cit9CisKK3B1YmxpYyB2b2lkIEF0dGFjayhvYmplY3QgZW5lbXkpCit7CisgIC8vIGRhcyBLb21tYW5kbyAnRmV1ZXJiYWxsJyBlaW5nZWJlbi4gRGEgZGVyIE5QQyBNaXRnbGllZCBkZXIKKyAgLy8gQWJlbnRldXJlcmdpbGRlIGlzdCAocy5vLiksIHNwcmljaHQgZXIgYWxzbyBkZW4gU3BlbGwsIGZhbGxzIGVyIGdlbnVnCisgIC8vIE1hZ2llcHVua3QgZGFmdWVyIGhhdC4KKyAgaWYgKCFyYW5kb20oMykpIGNvbW1hbmRfbWUoImZldWVyYmFsbCIpOworICA6OkF0dGFjayhlbmVteSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4va3VyemJvZ2VuLmMgYi9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4va3VyemJvZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2MjNlNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9rdXJ6Ym9nZW4uYwpAQCAtMCwwICsxLDMyIEBACitpbmhlcml0ICIvc3RkL3JhbmdlZF93ZWFwb24iOworCisjaW5jbHVkZSAiLi9wYXRoLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS3VyemJvZ2VuIik7CisgIFNldFByb3AoUF9JTkZPLAorICAgICJEaWUgU3ludGF4IGxhdXRldDogc2NoaWVzc2UgPGdlc2Nob3NzPiBhdWYgPHppZWw+XG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJLdXJ6Ym9nZW4iKTsKKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiTWl0IGRpZXNlbSBLdXJ6Ym9nZW4ga2FubiBtYW4gc2ljaGVyIG5pY2h0IHdlaXQgc2NoaWVzc2VuLiIpKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19XT09EKTsKKworICBBZGRJZCgia3VyemJvZ2VuIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCA4MDApOworICBTZXRQcm9wKFBfVkFMVUUsIDMwMCk7CisKKyAgU2V0UHJvcChQX1dDLCAxMCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgRFRfQkxVREdFT04pOworCisgIFNldFByb3AoUF9TSE9PVElOR19XQywgNjApOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1JBTkdFRF9XRUFQT04pOworICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX0FSUk9XKTsKKyAgU2V0UHJvcChQX1NUUkVUQ0hfVElNRSwgMSk7CisgIFNldFByb3AoUF9SQU5HRSwgMTApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9sYW5nYm9nZW4uYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9sYW5nYm9nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU2ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL2xhbmdib2dlbi5jCkBAIC0wLDAgKzEsMzIgQEAKK2luaGVyaXQgIi9zdGQvcmFuZ2VkX3dlYXBvbiI7CisKKyNpbmNsdWRlICIuL3BhdGguaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBMYW5nYm9nZW4iKTsKKyAgU2V0UHJvcChQX0lORk8sCisgICAgIkRpZSBTeW50YXggbGF1dGV0OiBzY2hpZXNzZSA8Z2VzY2hvc3M+IGF1ZiA8emllbD5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIkxhbmdib2dlbiIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJNaXQgZGllc2VtIExhbmdib2dlbiBrYW5uIG1hbiBiZXN0aW1tdCBoZXJ2b3JyYWdlbmQgd2VpdCBzY2hpZXNzZW4uIikpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1dPT0QpOworCisgIEFkZElkKCJsYW5nYm9nZW4iKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDgwMCk7CisgIFNldFByb3AoUF9WQUxVRSwgMzAwKTsKKworICBTZXRQcm9wKFBfV0MsIDMwKTsKKyAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9CTFVER0VPTik7CisKKyAgU2V0UHJvcChQX1NIT09USU5HX1dDLCAxMjApOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1JBTkdFRF9XRUFQT04pOworICBTZXRQcm9wKFBfQU1NVU5JVElPTiwgTVVOX0FSUk9XKTsKKyAgU2V0UHJvcChQX1NUUkVUQ0hfVElNRSwgMik7CisgIFNldFByb3AoUF9SQU5HRSwgMzApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9ucGMuYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9ucGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ0ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL25wYy5jCkBAIC0wLDAgKzEsMjkgQEAKK2luaGVyaXQgIi9zdGQvbnBjIjsKKworI2luY2x1ZGUgIi4vcGF0aC5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIEFkZElkKCh7Im5wYyIsICJnZWduZXIiLCAiemllbCJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCAiWmllbCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gWmllbCIpOworCisgIFNldFByb3AoUF9IUCwgMTAwMCk7CisgIFNldFByb3AoUF9CT0RZLCAxMDApOworfQorCit2YXJhcmdzIGludCBEZWZlbmQoaW50IGRhbSwgc3RyaW5nKiBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkgeworICBpbnQgcHJlZGFtID0gZGFtOworICBpbnQgcmVzdWx0ID0gOjpEZWZlbmQoZGFtLCAmZGFtX3R5cGUsICZzcGVsbCwgZW5lbXkpOworICAKKyAgc3RyaW5nIHN0ciA9IGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICJEaWUgWmllbHNjaGVpYmUgc2FndDogJWQgU2NoYWRlbiByZWluIHVuZCBmdWVyICVkIGdldHJvZmZlbi4iLAorICAgIHByZWRhbSwgcmVzdWx0KSwgNzgpOworCisgIHRlbGxfcm9vbShsb2FkX29iamVjdChfX1BBVEhfXygwKSJ6aWVscmF1bSIpLCBzdHIpOworICB0ZWxsX3Jvb20obG9hZF9vYmplY3QoX19QQVRIX18oMCkic2NodXNzcmF1bSIpLCBzdHIpOworCisgIHJldHVybiByZXN1bHQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3BhdGguaCBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NDE0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wYXRoLmgKQEAgLTAsMCArMSwzIEBACisjcHJhZ21hIHJ0dF9jaGVja3MsIHNhdmVfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMsICByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2VtcHR5X2Nhc3RzLCB3YXJuX21pc3NpbmdfcmV0dXJuLCB3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wZmVpbGUuYyBiL2RvYy9iZWlzcGllbGUvZmVybndhZmZlbi9wZmVpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIxMWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3BmZWlsZS5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvdW5pdCI7CisKKyNpbmNsdWRlICIuL3BhdGguaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX05BTUUsICh7IlBmZWlsIiwgIlBmZWlsZSJ9KSApOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW4gcGFhciBlaW5mYWNoZSBIb2x6cGZlaWxlLiIsIDc4KSk7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfQU1PVU5ULCAxKTsKKyAgU2V0UHJvcChQX1NIT09USU5HX1dDLCA0MCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgKHtEVF9QSUVSQ0V9KSk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQU1NVSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfV09PRCk7CisKKyAgU2V0R3JhbXNQZXJVbml0cygxMjAsMSk7CisgIFNldENvaW5zUGVyVW5pdHMoMjUsMSk7CisKKyAgQWRkSWQoTVVOX0FSUk9XKTsKKyAgQWRkU2luZ3VsYXJJZCgicGZlaWwiKTsKKyAgQWRkUGx1cmFsSWQoInBmZWlsZSIpOworICBBZGRDbGFzcyhDTF9BTU1VTklUSU9OKTsKKworICBTZXRQcm9wKFBfSElUX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworfQorCitpbnQgSGl0RnVuYyhvYmplY3QgZW5lbXkpIHsKKyAgaWYoIXJhbmRvbSg1KSkgeworICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksIGJyZWFrX3N0cmluZygKKyAgICAgICJEZXIgUGZlaWwgc2NobnVycnQgdm9tIEJvZ2VuIHVuZCBkYWJlaSBzcGxpdHRlcnQgZGFzIEhvbHogIgorICAgICAgImV0d2FzLiBHcmF0aXN3aWRlcmhha2VuLCBkYXMgaXN0IGphIHRvbGwhIiwgNzgpKTsKKyAgICByZXR1cm4gMjA7CisgIH0KKworICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4vc2NodXNzcmF1bS5jIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3NjaHVzc3JhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE3OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3NjaHVzc3JhdW0uYwpAQCAtMCwwICsxLDM0IEBACitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSAiLi9wYXRoLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfTElHSFQsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQXVmIGVpbmVtIEJhdW0iKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLCBicmVha19zdHJpbmcoCisgICAgIkR1IGhvY2tzdCBhdWYgZWluZW0gQmF1bSB1bmQga2FubnN0IGF1ZiBkaWUgTGljaHR1bmcgdW50ZXIgRGlyIHNlaGVuLiAiCisgICAgIidzY2hhdSBydW50ZXInIGhpbGZ0IHNpY2hlcmxpY2gsIFppZWxlIGF1c3p1bWFjaGVuLiIpKTsKKworICBBZGREZXRhaWwoInJ1bnRlciIsIGZ1bmN0aW9uIHN0cmluZyB7IAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fUEFUSF9fKDApInppZWxyYXVtIi0+aW50X2xvbmcodGhpc19wbGF5ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgQWRkSXRlbShfX1BBVEhfXygwKSJsYW5nYm9nZW4iLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oX19QQVRIX18oMCkia3VyemJvZ2VuIiwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRJdGVtKF9fUEFUSF9fKDApInBmZWlsZSIsIFJFRlJFU0hfUkVNT1ZFLCAoW1BfQU1PVU5UOiAyMF0pKTsKKworICBBZGRFeGl0KCJ6aWVscmF1bSIsIF9fUEFUSF9fKDApInppZWxyYXVtIik7CisgIGxvYWRfb2JqZWN0KF9fUEFUSF9fKDApInppZWxyYXVtIik7CisKKyAgU2V0UHJvcChQX1RBUkdFVF9BUkVBLCBfX1BBVEhfXygwKSJ6aWVscmF1bSIpOyAvLyBhbmRlcmVyIFJhdW0gYmVzY2hpZXNzYmFyCisgIFNldFByb3AoUF9TSE9PVElOR19BUkVBLCAxNSk7ICAgICAgICAgICAgICAgICAgLy8gMTUgRW50ZmVybnVuZworfQorCisvLyBudXIgd2VnZW4gZGVzIFBfTkVWRVJfQ0xFQU4gaW0gWmllbHJhdW0gdW5kIG51ciBoaWVyIGluIGRvYyByZWxldmFudAorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIF9fUEFUSF9fKDApInppZWxyYXVtIi0+cmVtb3ZlKCk7CisgIHJldHVybiA6OnJlbW92ZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3ppZWxyYXVtLmMgYi9kb2MvYmVpc3BpZWxlL2Zlcm53YWZmZW4vemllbHJhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc3MDMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9mZXJud2FmZmVuL3ppZWxyYXVtLmMKQEAgLTAsMCArMSwxOSBAQAoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgIi4vcGF0aC5oIgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisKKyAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lciBMaWNodHVuZyIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiQXVmIGRpZXNlciBMaWNodHVuZyBzdGVodCBlaW4gQmF1bSwgZGVyIHZlcmRhZWNodGlnIHZpZWxlIEFlc3RlIGhhdCwgIgorICAgICJ2b24gZGVuZW4gbWFuIGF1ZiBkaWUgTGljaHR1bmcgZ3V0IHNlaGVuIGthbm4uIikpOworICBTZXRQcm9wKFBfTkVWRVJfQ0xFQU4sIDEpOyAvLyBkYW1pdCBkZXIgUmF1bSBhdWNoIGRhIGJsZWlidAorCisgIEFkZEl0ZW0oX19QQVRIX18oMCkibnBjIiwgUkVGUkVTSF9SRU1PVkUpOworCisgIEFkZEV4aXQoInNjaHVzc3JhdW0iLCBfX1BBVEhfXygwKSJzY2h1c3NyYXVtIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL2Zvb2QvYmFuYW5lLmMgYi9kb2MvYmVpc3BpZWxlL2Zvb2QvYmFuYW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4MmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZm9vZC9iYW5hbmUuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKK0JlaXNwaWVsIGZ1ZXIgZWluZSBCYW5hbmUsIGRpZSBpbiBlaW5lbSBIYXBzIHdlZyBpc3QsCithYmVyIGVpbmUgU2NoYWxlIGhhdCwgZGllIHVlYnJpZyBibGVpYnQgdW5kIGdlbmF1IHdpZSBkaWUKK2tvbXBsZXR0ZSBCYW5hbmUgdmVyZ2FtbWVsdCB1bmQgdmVyZ2VodC4KKyovCisKKyNpbmNsdWRlIDxmb29kLmg+CisKK2luaGVyaXQgIi9zdGQvZm9vZCI7CisKK3N0cmluZyBfcXVlcnlfbG9uZygpIHsKKyAgc3RyaW5nIG0gPSAiRHUgaGFlbHRzdCAiOworICBpZiAoaXNfbm90X2VtcHR5KCkpIHsKKyAgICBtICs9ICJlaW5lIEJhbmFuZSBpbiBkZXIgSGFuZC4iOworICAgIGlmICghaXNfYmFkKCkpCisgICAgICBtICs9ICIgU2llIGlzdCBzY2hvZW4gZ2VsYiB1bmQgb2huZSBicmF1bmUgRmxlY2tlbi4iOworICAgIGVsc2UKKyAgICAgIG0gKz0gIiBTaWUgaXN0IHRvdGFsIGJyYXVuIHVuZCBzY2hvbiBnYW56IG1hdHNjaGlnLiI7CisKKyAgfSBlbHNlIHsKKyAgICBtICs9ICJlaW5lIEJhbmFuZW5zY2hhbGUgaW4gZGVyIEhhbmQuIjsKKyAgICBpZiAoaXNfYmFkKCkpCisgICAgICBtICs9ICIgU2llIGlzdCBnYW56IHZlcnNjaGltbWVsdC4iOworICB9CisgIHJldHVybiBicmVha19zdHJpbmcobSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgeworICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgc2Nob2VuZSByZWlmZSBCYW5hbmUiKTsKKyAgU2V0UHJvcChQX05BTUUsICJCYW5hbmUiKTsKKyAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICBTZXRQcm9wKFBfVkFMVUUsMjApOyAvLyBvaG5lIFNjaGFsZQorICBTZXRQcm9wKFBfV0VJR0hULDUwKTsgLy8gb2huZSBTY2hhbGUKKyAgLy8gU2V0UHJvcChQX1BPVElPTiwxKTsgLy8gaXN0IGVoIFN0YW5kYXJkCisgIFNldFByb3AoUF9DT05TVU1FX01TRywKKyAgICAiQFdFUjIgc2NoYWVsdCBlaW5lIEJhbmFuZSB1bmQgaXNzdCBzaWUgZ2VudWVzc2xpY2guIik7CisgIFNldFByb3AoUF9FQVRFUl9NU0csCisgICAgIkR1IHNjaGFlbHN0IGVpbmUgQmFuYW5lIHVuZCBpc3N0IHNpZSBnZW51ZXNzbGljaC4iKTsKKyAgU2V0UHJvcChQX0JBRF9NU0csCisgICAgIkRpZSBCYW5hbmUgd2lyZCBnYW56IG1hdHNjaGlnIHVuZCBzY2hsZWNodC4iKTsKKyAgU2V0UHJvcChQX1JFTU9WRV9NU0csCisgICAgIkRpZSBCYW5hbmUgaXN0IHNvIHZlcnNjaGltbWVsdCwgZGFzcyBEdSBzaWUgZW50c29yZ3N0LiIpOworICBTZXRQcm9wKFBfRU1QVFlfTVNHLAorICAgICJBYmVyIGRhcyBpc3QgZG9jaCBudXIgZWluZSBCYW5hbmVuU0NIQUxFLCBkaWUgd2lsbHN0IER1IG5pY2h0IGVzc2VuISIpOworCisgIFNldFByb3AoUF9NQVRFUklBTCwoW01BVF9NSVNDX1BMQU5UOjEwMF0pKTsKKworICBTZXRQcm9wKFBfRU1QVFlfUFJPUFMsIChbCisgICAgUF9TSE9SVDoiRWluZSBCYW5hbmVuc2NoYWxlIiwKKyAgICBQX05BTUU6IkJhbmFuZW5zY2hhbGUiLAorICAgIFBfRU1QVFlfSURTOih7InNjaGFsZSIsImJhbmFuZW5zY2hhbGUiLCJiYW5hbmUifSksCisgICAgUF9WQUxVRTo1LCAvLyBXZXJ0IGRlciBCYW5hbmVuc2NoYWxlCisgICAgUF9XRUlHSFQ6NSAgLy8gR2V3aWNodCBkZXIgQmFuYW5lbnNjaGFsZQorICBdKSk7CisKKyAgLy9TZXRQcm9wKFBfUkVTRVRfTElGRVRJTUUsMSk7IC8vIGlzdCBlaCBTdGFuZGFyZAorICBTZXRQcm9wKFBfREVTVFJPWV9CQUQsMzAwKTsgLy8gdmVyZG9yYmVuZSBCYW5hbmVuIHZlcnNjaHdpbmRlbiBuYWNoIDUgTWluCisKKyAgU2V0UHJvcChQX0ZPT0QsNTApOyAvLyBGdWVsbGdyYWQgZGVyIEJhbmFuZQorICBTZXRQcm9wKFBfSFAsNSk7CisgIFNldFByb3AoUF9TUCw1KTsKKworICBBZGRJZCgoeyJiYW5hbmUifSkpOworCit9CisKKy8vIERlciBCZWhhZWx0ZXIgdmVyZ2FtbWVsdCBhdWNoCitwdWJsaWMgaW50IG1ha2VfZGVzdHJveSgpIHsKKyAgaWYgKCE6Om1ha2VfZGVzdHJveSgpKSB7CisgICAgcmV0dXJuIHJlbW92ZSgxKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBtYWtlX2VtcHR5KCkgeworICBTZXRQcm9wKFBfQkFEX01TRywKKyAgICAiRGllIEJhbmFuZW5zY2hhbGUgd2lyZCBnYW56IHNjaGltbWxpZy4iKTsKKyAgU2V0UHJvcChQX1JFTU9WRV9NU0csCisgICAgIkRpZSBCYW5hbmVuc2NoYWxlIHplcnNldHp0IHNpY2ggdm9sbHN0YWVuZGlnLiIpOworICByZXR1cm4gOjptYWtlX2VtcHR5KCk7Cit9CisKKy8vIHBhcmVudCBtZXRob2RlIGltbWVyIGF1ZnJ1ZmVuIHVuZCBwcnVlZmVuISEKK3ZvaWQgbWFrZV9iYWQoKSB7CisgIGlmICghOjptYWtlX2JhZCgpKSB7CisgICAgaWYgKGlzX25vdF9lbXB0eSgpKSB7CisgICAgICBTZXRQcm9wKFBfU0hPUlQsIkVpbmUgbWF0c2NoaWdlIEJhbmFuZSIpOworICAgICAgQWRkQWRqZWN0aXZlKCh7Im1hdHNjaGlnZSIsIm1hdHNjaGlnZW4ifSkpOworICAgICAgU2V0UHJvcChQX0VBVEVSX01TRywiRHUgbHV0c2Noc3QgZGllIG1hdHNjaGlnZSBCYW5hbmUgYXVzIGlocmVyIgorICAgICAgICAiU2NoYWxlLiBCYWVoLCBkaWUgc2NobWVja3QgdWViZXJoYXVwdCBuaWNodCBtZWhyLiIpOworICAgICAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLAorICAgICAgICAiQFdFUjIgbHV0c2NodCBlaW5lIG1hdHNjaGlnZSBCYW5hbmUgYXVzIGlocmVyIFNjaGFsZS4iKTsKKyAgICAgIC8vIERpZSBTY2hhbGUgaXN0IGRhbm4gbmF0dWVybGljaCBhdWNoIHZlcmdhbW1lbHQKKyAgICAgIFNldFByb3AoUF9FTVBUWV9QUk9QUywgKFsKKyAgICAgICAgUF9TSE9SVDoiRWluZSB2ZXJzY2hpbW1lbHRlIEJhbmFuZW5zY2hhbGUiLAorICAgICAgICBQX05BTUU6IkJhbmFuZW5zY2hhbGUiLAorICAgICAgICBQX0VNUFRZX0lEUzooeyJzY2hhbGUiLCJiYW5hbmVuc2NoYWxlIiwiYmFuYW5lIn0pLAorICAgICAgICBQX0VNUFRZX0FESjooeyJ2ZXJzY2hpbW1lbHRlIiwidmVyc2NoaW1tZWx0ZW4ifSksCisgICAgICAgIFBfVkFMVUU6NSwgLy8gV2VydCBkZXIgQmFuYW5lbnNjaGFsZQorICAgICAgICBQX1dFSUdIVDo1ICAvLyBHZXdpY2h0IGRlciBCYW5hbmVuc2NoYWxlCisgICAgICBdKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UoUF9CQURfTVNHKTsKKyAgICAgIFNldFByb3AoUF9TSE9SVCwiRWluZSB2ZXJzY2hpbW1lbHRlIEJhbmFuZW5zY2hhbGUiKTsKKyAgICAgIEFkZEFkamVjdGl2ZSgoeyJ2ZXJzY2hpbW1lbHRlIiwidmVyc2NoaW1tZWx0ZW4ifSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9mb29kL3dhc3NlcmZsYXNjaGUuYyBiL2RvYy9iZWlzcGllbGUvZm9vZC93YXNzZXJmbGFzY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2MmMxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvZm9vZC93YXNzZXJmbGFzY2hlLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKK0JlaXNwaWVsIGZ1ZXIgZWluIHRyYWdiYXJlcyBHZXRyYWVuayBpbiBlaW5lciBGbGFzY2hlLgorKi8KKworI2luY2x1ZGUgPGZvb2QuaD4KKworaW5oZXJpdCAiL3N0ZC9mb29kIjsKKworc3RyaW5nIF9xdWVyeV9sb25nKCkgeworICBzdHJpbmcgbSA9ICJEdSBzaWVoc3QgZWluZSBHbGFzZmxhc2NoZSwiOworICBpZiAoaXNfbm90X2VtcHR5KCkpIHsKKyAgICBtICs9ICIgaW4gZGVyIHNpY2ggV2Fzc2VyIGJlZmluZGV0LiI7CisgICAgaWYgKCFpc19iYWQoKSkKKyAgICAgIG0gKz0gIiBFcyBpc3QgZ2xhc2tsYXIgdW5kIHNpZWh0IGlyZ2VuZHdpZSB2ZXJsb2NrZW5kIGF1cy4iOworICAgIGVsc2UKKyAgICAgIG0gKz0gIiBFcyBpc3QgdHJ1ZWJlIHVuZCBzaWVodCBuaWNodCBnZXJhZGUgdmVybG9ja2VuZCBhdXMuIjsKKworICAgIG0gKz0gIiBEaWUgRmxhc2NoZSBpc3QgIjsKKyAgICBzd2l0Y2ggKHRvX2ludCgoUXVlcnlQcm9wKFBfUE9SVElPTlMpLTEpLzIuNSkpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgbSArPSAiZmFzdCBsZWVyLiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBtICs9ICJoYWxiIHZvbGwuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG0gKz0gImZhc3Qgdm9sbC4iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgbSArPSAidm9sbC4iOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG0gKz0gIm5pY2h0IGxlZXIuIjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbSArPSAiIGluIGRlciBmcnVlaGVyIG1hbCBXYXNzZXIgd2FyLiI7CisgIH0KKyAgcmV0dXJuIGJyZWFrX3N0cmluZyhtKTsKK30KKwordm9pZCBjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgc2V0X25leHRfcmVzZXQoLTEpOworICAgIHJldHVybjsKKyAgfQorICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9TSE9SVCwiRWluZSBGbGFzY2hlIG1pdCBXYXNzZXIiKTsKKyAgU2V0UHJvcChQX05BTUUsICJXYXNzZXJmbGFzY2hlIik7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX1ZBTFVFLDUpOyAvLyBwcm8gUG9ydGlvbiAob2huZSBGbGFzY2hlKQorICBTZXRQcm9wKFBfV0VJR0hULDUwKTsgLy8gcHJvIFBvcnRpb24gKG9obmUgRmxhc2NoZSkKKyAgU2V0UHJvcChQX1BPUlRJT05TLDEwKTsKKyAgU2V0UHJvcChQX0RFU1RST1lfQkFELDApOyAvLyB2ZXJkb3JiZW5lcyBXYXNzZXIgd2lyZCBuaWNodCB6ZXJzdG9lcnQKKyAgU2V0UHJvcChQX0NPTlNVTUVfTVNHLAorICAgICJAV0VSMiB0cmlua3QgYXVzIGVpbmVyIEZsYXNjaGUuIFdhc3NlciBsYWV1ZnQgdWViZXIgQFdFTlFQUE5TMiBLaW5uLiIpOworICBTZXRQcm9wKFBfRUFURVJfTVNHLAorICAgICJEdSB0cmlua3N0IFdhc3NlciBhdXMgZGVyIEZsYXNjaGUuIEV0d2FzIGxhZXVmdCBEaXIgdWViZXIgZGFzIEtpbm4uIik7CisgIFNldFByb3AoUF9CQURfTVNHLAorICAgICJEYXMgV2Fzc2VyIGluIGRlciBGbGFzY2hlIHdpcmQgdHJ1ZWJlLiIpOworCisgIFNldFByb3AoUF9NQVRFUklBTCwoW01BVF9HTEFTUzoxNSwgTUFUX1dBVEVSOjg1XSkpOworCisgIFNldFByb3AoUF9FTVBUWV9QUk9QUywgKFsKKyAgICBQX1NIT1JUOiJFaW5lIGxlZXJlIEZsYXNjaGUiLAorICAgIFBfTkFNRToiRmxhc2NoZSIsCisgICAgUF9FTVBUWV9JRFM6KHsiZmxhc2NoZSJ9KSwKKyAgICBQX0VNUFRZX0FESjooeyJsZWVyZSIsImxlZXJlbiJ9KSwKKyAgICBQX01BVEVSSUFMOihbTUFUX0dMQVNTOjEwMF0pLAorICAgIFBfVkFMVUU6NSwgLy8gV2VydCBkZXIgRmxhc2NoZSBvaG5lIFdhc3NlcgorICAgIFBfV0VJR0hUOjIwICAvLyBHZXdpY2h0IGRlciBGbGFzY2hlIG9obmUgV2Fzc2VyCisgIF0pKTsKKworICBTZXRQcm9wKFBfUkVTRVRfTElGRVRJTUUsMyk7IC8vIDMgUmVzZXRzLCBlaGUgZGFzIFdhc3NlciB0cnVlYmUgd2lyZAorICBTZXRQcm9wKFBfRFJJTkssNTApOyAvLyBGdWVsbGdyYWQgcHJvIFNjaGx1Y2sKKyAgU2V0UHJvcChQX0RJU1RSSUJVVElPTiwxMCk7IC8vIFB1bmt0ZSBIZWlsdW5nIHBybyBIZWFydGJlYXQKKyAgU2V0UHJvcChQX0hQLDMwKTsgLy8gcHJvIFNjaGx1Y2sKKyAgU2V0UHJvcChQX1NQLDMwKTsgLy8gcHJvIFNjaGx1Y2sKKworICBBZGRJZCgoeyJmbGFzY2hlIiwid2Fzc2VyZmxhc2NoZSIsIndhc3NlciJ9KSk7CisgIEFkZEFkamVjdGl2ZSgoeyJ2b2xsZSIsInZvbGxlbiJ9KSk7CisKK30KKworLy8gcGFyZW50IG1ldGhvZGUgaW1tZXIgYXVmcnVmZW4gdW5kIHBydWVmZW4hIQordm9pZCBtYWtlX2JhZCgpIHsKKyAgaWYgKCE6Om1ha2VfYmFkKCkgJiYgaXNfbm90X2VtcHR5KCkpIHsKKyAgICAvLyBkaWUgVHJpbmttZWxkdW5nIGFlbmRlcm4gd2lyIG1hbAorICAgIFNldFByb3AoUF9FQVRFUl9NU0csIkR1IHRyaW5rc3QgdHJ1ZWJlcyBXYXNzZXIgYXVzIGRlciBGbGFzY2hlLiAiCisgICAgICAiRGFzIHdhciB3b2hsIG5pY2h0IHNvIGd1dC4gRGlyIHdpcmQgZ2FueiB1ZWJlbCEiKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUva2Vrc2Uva2Vrcy5jIGIvZG9jL2JlaXNwaWVsZS9rZWtzZS9rZWtzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMmFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUva2Vrc2Uva2Vrcy5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIEVpbmZhY2hlcyBCZWlzcGllbCB6dXIgRGVtb25zdHJhdGlvbiB2b24gVmVyZXJidW5nLgorICAgQUNIVFVORzogRGllc2VzIEJlaXNwaWVsIHN0ZWxsdCBfa2Vpbl8gc2lubnZvbGxlcyBMZWJlbnNtaXR0ZWxvYmpla3QgZGFyLgorICAgICAgICAgICAgSGllcmZ1ZXIgc29sbHRlIC9zdGQvZm9vZCB2ZXJ3ZW5kZXQgd2VyZGVuLCBzaWVoZSBhdWNoCisgICAgICAgICAgICAvZG9jL2JlaXNwaWVsZS9mb29kLworKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCAiS2VrcyIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgQWRkSWQoKHsia2VrcyJ9KSk7CisgIEFkZENtZCgiaXNzJkBJRCIsICJhY3Rpb25fZXNzZW4iLCAiV2FzIHdpbGxzdCBkdSBlc3Nlbj8iKTsKK30KKworcHVibGljIGludCBhY3Rpb25fZXNzZW4oc3RyaW5nIGNtZCkgeworICBpZih0aGlzX3BsYXllcigpLT5lYXRfZm9vZCgxLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgYmVrb21tc3QgIitRdWVyeVByb25vdW4oV0VOKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5pY2h0IG1laHIgaGluZWluZ2VzdG9wZnQuXG4iKT4wKSB7CisgICAgd3JpdGUoIkR1IGlzc3QgIituYW1lKFdFTiwxKSsiLlxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsiIGlzc3QgIituYW1lKFdFTikrIi5cbiIpOworICAgIHJlbW92ZSgxKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUva2Vrc2Uva3J1ZW1lbGtla3MuYyBiL2RvYy9iZWlzcGllbGUva2Vrc2Uva3J1ZW1lbGtla3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmVlODVhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9rZWtzZS9rcnVlbWVsa2Vrcy5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIEVpbmZhY2hlcyBCZWlzcGllbCB6dXIgRGVtb25zdHJhdGlvbiB2b24gVmVyZXJidW5nLgorICAgQUNIVFVORzogRGllc2VzIEJlaXNwaWVsIHN0ZWxsdCBfa2Vpbl8gc2lubnZvbGxlcyBMZWJlbnNtaXR0ZWxvYmpla3QgZGFyLgorICAgICAgICAgICAgSGllcmZ1ZXIgc29sbHRlIC9zdGQvZm9vZCB2ZXJ3ZW5kZXQgd2VyZGVuLCBzaWVoZSBhdWNoCisgICAgICAgICAgICAvZG9jL2JlaXNwaWVsZS9mb29kLworKi8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KK2luaGVyaXQgX19ESVJfXyJrZWtzIjsKKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgaWYoIXNpbGVudCAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpCisgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgTmFtZShXRVIsMSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBrcnVlbWVsdCBlaW4gbGV0enRlcyBNYWwuXG4iKTsKKyAgcmV0dXJuIDo6cmVtb3ZlKHNpbGVudCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21hc3Rlci9hY2Nlc3NfcmlnaHRzLmMgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9hY2Nlc3NfcmlnaHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3ZTkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWFzdGVyL2FjY2Vzc19yaWdodHMuYwpAQCAtMCwwICsxLDEzIEBACisvLyBXZW5uIGVpbiBWZXJ6ZWljaG5pcyBmdWVyIGVpbiBPYmpla3QgbmljaHQgc2NocmVpYmJhciBpc3QsIGthbm4gZGVyCisvLyBCZXNpdHplciBkZXMgVmVyemVpY2huaXNzZXMgZWluZSBEYXRlaSBhY2Nlc3NfcmlnaHRzIGFubGVnZW4sIGRpZQorLy8gZGllc2VzIFJlY2h0IHZlcmdpYnQuCisvLyBEYSBET0MgaGllciBlaWdlbnRsaWNoIG5pY2h0IHNjaHJlaWJlbiBkYXJmLCB3YXIgZGFzIGhpZXIgbm9ldGlnLgorLy8gRWluIE1hZ2llciB3aXJkIGRhcyBmdWVyIGRpZSBlaWdlbmVuIFZlcnouIGlkUiBuaWNodCBicmF1Y2hlbi4KKworaW50IGFjY2Vzc19yaWdodHMoIHN0cmluZyB1c2VyLCBzdHJpbmcgcGZhZCApIHsKKyAgaWYoIHVzZXI9PSJET0MiICYmIHBmYWQ9PSJvcGZlcnN0b2NrbG9nIiApIHsKKyAgCS8vIERPQyBkYXJmIG9wZmVyc3RvY2tsb2cgc2NocmVpYmVuCisJcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrLmMgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4YTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWFzdGVyL29wZmVyc3RvY2suYwpAQCAtMCwwICsxLDE0MiBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisvLworLy8gQnkgUnVtYXRhQE1vcmdlbkdyYXVlbiAzLzk5CisvLworLy8gQmVpc3BpZWxkYXRlaSBmdWVyIGRpZSBCZW51dHp1bmcgdm9uIE1hc3Rlcm4gdW5kIEtsaWVudGVuLgorLy8KKy8vIEljaCBnZWhlIGhpZXIgbmljaHQgYXVmIGRpZSAibm9ybWFsZW4iIEZ1bmt0aW9uZW4gZWluLgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2RlZmluZSBPU19NQVNURVIgIi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrbWFzdGVyIgorCit2b2lkIGNyZWF0ZSgpCit7CisJaWYoSVNfQkxVRShNRSkpIHJldHVybjsKKwk6OmNyZWF0ZSgpOworCVNldFByb3AoIFBfTkFNRSwgIk9wZmVyc3RvY2siICk7CisJU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKwlTZXRQcm9wKCBQX1ZBTFVFLCAxMDAwICsgcmFuZG9tKDIwMDApICk7CisJQWRkSWQoICh7InN0b2NrIiwiaW5zY2hyaWZ0Iiwib3BmZXJzdG9jayJ9KSApOworCVNldFByb3AoIFBfU0hPUlQsICJJbiBlaW5lciBFY2tlIHN0ZWh0IGVpbiBPcGZlcnN0b2NrIiApOworCVNldFByb3AoIFBfTE9ORywKKwkJIkRlciBPcGZlcnN0b2NrIGJlc3RlaHQgYXVzIHNvbGlkZW0gSG9sei4gVm9ybmUgYXVmIGRlbSBLYXN0ZW4gaXN0IGVpbmVcbiIKKwkrCSJJbnNjaHJpZnQgenUgc2VoZW4sIGRpZSBEdSBsZXNlbiBrYW5uc3QuXG4iCisJKwkiQEBjb250ZW50c0BAIgorCSk7CisJU2V0UHJvcCggUF9SRUFEX01TRywKKwkJIj4+Pj4+Pj4+Pj4+PiBGdWVyIGRlbiBBdWZiYXUgZWluZXMgT3Jrd2Fpc2VuaGF1c2VzIDw8PDw8PDw8PDw8PFxuIgorCSsJIkluIGRlbiBsZXR6dGVuIEphaHJlbiB3dXJkZW4gaW1tZXIgd2llZGVyIHVuc2NodWxkaWdlIE9ya2tpbmRlclxuIgorCSsJImR1cmNoIGJydXRhbGUgQWJlbnRldXJlciBpaHJlciBFbHRlcm4gYmVyYXVidC4gQml0dGUgdW50ZXItXG4iCisJKwkic3R1ZXR6ZW4gU2llIG1pdCBlaW5lciBrbGVpbmVuIFNwZW5kZSBkZW4gQXVmYmF1IGVpbmVzIFdhaXNlbi1cbiIKKwkrCSJoYXVzZXMgZnVlciBkaWVzZSBiZW1pdGxlaWRlbnN3ZXJ0ZW4gS3JlYXR1cmVuLlxuIgorCSk7CisJQWRkRGV0YWlsKCAiaG9seiIsICJTb2xpZGUgdW5kIHNvIGd1dCB3aWUgdW56ZXJicmVjaGxpY2guXG4iICk7CisJU2V0UHJvcCggUF9OT0dFVCwKKwkJIkRlciBPcGZlcnN0b2NrIGlzdCBuaWNodCBvaG5lIEdydW5kIGFtIEJvZGVuIGZlc3RnZW5hZ2VsdC5cbiIgKTsKKwlBZGRDbWQoICJzcGVuZGUiLCJzcGVuZGUiICk7CisJQWRkQ21kKCAoeyJzdGVja2UiLCJzdGVjayJ9KSwgInN0ZWNrZW4iICk7CisJQWRkQ21kKCAib2VmZm5lIiwib2VmZm5lIiApOworCUFkZENtZCggKHsiYnJpY2giLCJicmVjaGUifSksImJyZWNoZSIgKTsKK30KKworY29udGVudHMoKQoreworCXN3aXRjaChRdWVyeVByb3AoUF9WQUxVRSkpCisJeworCWNhc2UgMDoKKwkJcmV0dXJuICJFciBpc3QgbGVlci5cbiI7CisJY2FzZSAxOgorCQlyZXR1cm4gIkVyIGVudGhhZWx0OlxuRWluZSBNdWVuemUuXG4iOworCWRlZmF1bHQ6CisJCXJldHVybiAiRXIgZW50aGFlbHQ6XG4iK1F1ZXJ5UHJvcChQX1ZBTFVFKSsiIE11ZW56ZW4uXG4iOworCX0KK30KKworc3RlY2tlbiggc3RyICkKK3sKKwlzdHJpbmcgd2FzLCB3b3JlaW47CisJaWYoICFzdHIgfHwgc3NjYW5mKHN0ciwiJXMgaW4gJXMiLHdhcyx3b3JlaW4pIT0yIHx8ICFpZCh3b3JlaW4pICkgcmV0dXJuIDA7CisJcmV0dXJuIHNwZW5kZSggc3RyICk7Cit9CisKK3NwZW5kZSggc3RyICkKK3sKKwlpbnQgYW56LCBuZXdBbDsKKwlzdHJpbmcgYXJnOworCQorCW5vdGlmeV9mYWlsKCAiV2lldmllbGUgTXVlbnplbiB3aWxsc3QgRHUgZGVubiBzcGVuZGVuP1xuIiApOworCWlmKCAhc3RyIHx8IHN0cj09IiIgKQorCQlyZXR1cm4gMDsKKwlpZiggc3NjYW5mKHN0ciwiJWQgJXMiLGFueixhcmcpPT0gMiApCisJCXN0ciA9IGFyZzsKKwllbHNlCisJeworCQlpZiggc3RyPT0iZWluZSBtdWVuemUiIHx8IHN0cj09ImVpbiBnb2xkc3R1ZWNrIiApCisJCXsKKwkJCWFueiA9IDE7CisJCQlzdHIgPSAibXVlbnplIjsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJaWYoIGFuejw9MCB8fCAKKwkJbWVtYmVyKCh7Im11ZW56ZSIsImdvbGRzdHVlY2siLCJtdWVuemVuIiwiZ29sZHN0dWVja2UifSksIHN0cik9PS0xCisJKQorCQlyZXR1cm4gMDsKKwlpZiggYW56PlBMLT5RdWVyeU1vbmV5KCkgKQorCXsKKwkJd3JpdGUoICJTbyB2aWVsIEdlbGQgaGFzdCBEdSBuaWNodC5cbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCVBMLT5BZGRNb25leSgtYW56KTsKKwlTZXRQcm9wKFBfVkFMVUUsUXVlcnlQcm9wKFBfVkFMVUUpK2Fueik7CisKKwkvLyBIaWVyIHdpcmQgZGVyIE1hc3RlciBhdWZnZXJ1ZmVuLCBkZXIgZGFzIEFsaWdubWVudCBkZXIgU3BpZWxlcgorCS8vIGRhbm4gYWVuZGVydC4KKwlpZiggT1NfTUFTVEVSLT5hZGRBbGlnbm1lbnQoIFBMLCBhbnovMyApID4gMCApIHsKKwkJLy8gRWlnZW50bGljaCBr9m5udGUgbWFuIGhpZXIgYXVjaCBkaWUgTWVsZHVuZyBhdXNnZWJlbiwgYWJlcgorCQkvLyBkZXIgU3BpZWxlciBzb2xsIGRlbiBVbnRlcnNjaGllZCB6d2lzY2hlbiBBbGlnbm1lbnQgZ2VhZW5kZXJ0CisJCS8vIHVudCBBbGlnbm1lbnQgbmljaHQgZ2VhZW5kZXJ0IHNlaGVuIGtvZW5uZW4uCisJfQorCXdyaXRlKCAiRHUgaGFzdCB3YWhyaGFmdCBkYXMgR2VmdWVobCwgZXR3YXMgR3V0ZXMgZ2V0YW4genUgaGFiZW4uXG4iICk7CisKKwlzYXkoIGNhcGl0YWxpemUoUEwtPm5hbWUoV0VSKSkrIiBzcGVuZGV0ICIrYW56CisJCSsgKChhbno9PTEpPyIgTXVlbnplLlxuIjoiIE11ZW56ZW4uXG4iKSApOworCXJldHVybiAxOworfQorCitvZWZmbmUoIHN0ciApCit7CisJaW50IG5ld0FsOworCQorCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBEdSBvZWZmbmVuP1xuIiApOworCWlmKCAhaWQoc3RyKSApCisJCXJldHVybiAwOworCU9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgLTMwICk7CisJd3JpdGUoICJBbGxlaW4gc2Nob24gZGVyIEdlZGFua2UuLi4uXG4iICk7CisJcmV0dXJuIDE7Cit9CisKK2JyZWNoZSggc3RyICkKK3sKKwlzdHJpbmcgYXJnOworCW5vdGlmeV9mYWlsKCAiV0FTIHdpbGxzdCBEdSBhdWZicmVjaGVuP1xuIiApOworCWlmKCAhc3RyICkKKwkJcmV0dXJuIDA7CisJaWYoIHNzY2FuZihzdHIsIiVzIGF1ZiIsYXJnKT09MSApCisJCXN0ciA9IGFyZzsKKwlpZiggIWlkKHN0cikgKQorCQlyZXR1cm4gMDsKKwl3cml0ZSggIkRlaW4gbGF1dGVzIEdldG9lc2UgcnVmdCBlaW5lbiBUZXVmZWwgaGVyYmVpLCBkZXIgRGljaCBnbGVpY2hcbiIKKwkrCSJtaXQgaW4gZGllIEhvZWxsZSBuaW1tdC5cbiIKKwkpOworCXNheSggY2FwaXRhbGl6ZShQTC0+bmFtZShXRVIpKSsiIHZlcnN1Y2h0LCBkZW4gT3BmZXJzdG9jayBhdWZ6dWJyZWNoZW4uXG4iCisJKyAiR2xlaWNoIGVyc2NoZWludCBlaW4gVGV1ZmVsLCB1bSAiK1BMLT5RdWVyeVByb25vdW4oV0VOKQorCSsJIiBpbiBkaWUgSG9lbGxlIHp1IHJlaXNzZW4uXG4iICk7CisJUEwtPm1vdmUoIi9kL3VudGVyd2VsdC9yYWV1bWUvcXVhbGVucmF1bSIsTV9HTywienVyIEhvZWxsZSIsImZhZWhydCIpOworCU9TX01BU1RFUi0+YWRkQWxpZ25tZW50KCBQTCwgLTIwMCApOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja21hc3Rlci5jIGIvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTA4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21hc3Rlci9vcGZlcnN0b2NrbWFzdGVyLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBCZWlzcGllbGRhdGVpIGZ1ZXIgZWluZW4gZWluZmFjaGVuIE1hc3RlciwgZGVyIFNwaWVsZXJkYXRlbiBhdWNoCisgKiB1ZWJlciByZWJvb3RzLCByZXNldHMgdW5kIHVwZGF0ZXMgaGlud2VnIHNwZWljaGVydCwgdW5kIGdsZWljaHplaXRnCisgKiBkYWZ1ZXIgc29yZ3QsIGRhc3MgZGllIERhdGVubWVuZ2VuIG5pY2h0IGltbWVyIGdyb2Vzc2VyIHdlcmRlbi4KKyAqCisgKiBCeTogUnVtYXRhQE1vcmdlbkdyYXVlbiAzLzk5CisgKgorICovCisKKy8vIFZvbiBkaWVzZW0gT2JqZWt0IGdpYnQgZXMga2VpbmUgQ2xvbmVzLCBzb25kZXJuIG51ciBkaWUgQmx1ZXByaW50LgorLy8gRGFzIEtvbnN0cnVrdCBpZiggY2xvbmVwKE1FKSApIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOyBpc3QgZGFkdXJjaAorLy8gb2Jzb2xldC4KKyNwcmFnbWEgbm9fY2xvbmUKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKy8vIE9ydCwgYW4gZGVtIGRpZSBEYXRlbiBnZXNwZWljaGVydCB3ZXJkZW4ga29lbm5lbi4gRGllIEVuZHVuZyAubworLy8gd2lyZCB2b20gU3lzdGVtIGFuZ2VoYWVuZ3QuCisjZGVmaW5lIFNBVkVGSUxFICIvZG9jL2JlaXNwaWVsZS9tYXN0ZXIvb3BmZXJzdG9ja2xvZyIKKworLy8gRGllc2VzIGlzdCBkZXIgS2xpZW50LCBkZXIgZGllc2VuIE1hc3RlciBiZW51dHp0LiBEaWVzZXIgV2VydCB3aXJkCisvLyBpbiBkaWVzZW0gUHJvZ3JhbW0gendhciBuaWNodCBiZW51dHp0LCBzdGVodCBoaWVyIGFiZXIsIGRhbWl0IG1hbgorLy8gd2Vpc3MsIHdvZnVlciBkaWVzZXIgTWFzdGVyIGd1dCBpc3QuCisjZGVmaW5lIENMSUVOVCAiL2RvYy9iZWlzcGllbGUvbWFzdGVyL29wZmVyc3RvY2siCisKKy8vIEVzIGJyYXVjaHQga2VpbiBPYmpla3QgaW5oZXJpdGV0IHdlcmRlbiwgZGEgd2lyIGtlaW5lcmxlaSBTcGllbC0KKy8vIEZ1bmt0aW9uaXRhZXQgYnJhdWNoZW4uIERlciBNYXN0ZXIga2FubiBuaWNodCBnZW5vbW1lbiwgYmV3ZWd0IG9kZXIKKy8vIHNvbnN0d2llIGlubmhlcmxhYiBkZXMgTXVkcyBiZW51dHp0IHdlcmRlbi4gSW5zYmVzb25kZXJlIHNvbGxlbgorLy8gaW0gc2F2ZWZpbGUgenVtIE1hc3RlciBrZWluZSBQcm9wZXJ0aWVzIG9kZXIgc28gYXVmdGF1Y2hlbi4KKy8vIGluaGVydCAiL3N0ZC90aGluZyI7CisKKy8vIFVtIGRpZXNlIERhdGVuIGdlaHQgZXMuCisvLyBEYXMgTWFwcGluZyBzcGVpY2hlcnQgenUgamVkZW0gU3BpZWxlciwgd2FubiBkYXMgbGV0enRlIE1hbCBkdXJjaCBlaW5lbgorLy8gZGVyIEtsaWVudGVuIGRhcyBBbGlnbm1lbnQgZ2VhZW5kZXJ0IHd1cmRlLiBBbHRlIERhdGVuIHdlcmRlbiBiZWkKKy8vIEdlbGVnZW5oZWl0IGdlbG9lc2NodC4KK21hcHBpbmcgZGF0YTsKKwordm9pZCBwdXJnZSgpOworCit2b2lkIGNyZWF0ZSgpIHsKKworICAvLyBEYW1pdCBTY2hyZWlienVncmlmZiBhdWYgU2F2ZWZpbGUgbW9lZ2xpY2guCisgIHNldGV1aWQoZ2V0dWlkKCkpOworCisgIGlmKCByZXN0b3JlX29iamVjdCggU0FWRUZJTEUgKSApIHsKKyAgICBwdXJnZSgpOworICB9IGVsc2UgeworICAgIGRhdGEgPSAoW10pOworICAgIHNhdmVfb2JqZWN0KCBTQVZFRklMRSApOyAvLyBEYW1pdCBTYXZlZmlsZSB1bmQgRGF0ZW4gaW1tZXIgc3luY2hyb24gc2luZC4KKyAgfQorfQorCisvLyBEaWVzZSBGdW5rdGlvbiB0ZXN0ZXQgZWluZW4gZWluemVsbmVuIEVpbnRyYWcsIG9iIGVyIHZlcmFsdGV0IGlzdC4KKy8vIChpc3QgbmljaHQgSmFociAyMDM4LWZlc3QgOi0pCitpbnQgbm90RXhwaXJlZCggc3RyaW5nIG5hbWUsIGludCBkYXRlICkgeworICByZXR1cm4gdGltZSgpIC0gZGF0ZSA8IDg2NDAwOworfQorCisvLyBEYXMgTWFwcGluZyB1bnRlcnN1Y2hlbiwgb2IgRWludHJhZWdlIHZvcmhhbmRlbiBzaW5kLCBkaWUgbmljaHQKKy8vIG1laHIgYmVub2V0aWd0IHdlcmRlbi4KKy8vIChJbiBkaWVzZW0gRmFsbCBzaW5kIGRhcyBFaW50cmFlZ2UsIGRpZSBhZWx0ZXIgYWxzIGVpbmVuIFRhZyBzaW5kLikKKy8vIEVzIHJlaWNodCB1bnMsIGRpZXNlIEZ1bmt0aW9uIGVpbm1hbCBwcm8gcmVib290IGF1c3p1ZnVlaHJlbi4gQmVpCisvLyBhbmRlcmVuIEFud2VuZHVuZ2VuIGtvZW5udGUgZGFzIG5hdHVlcmxpY2ggaGFldWZpZ2VyIG5vZXRpZyBzZWluLgordm9pZCBwdXJnZSgpIHsKKyAgZGF0YSA9IGZpbHRlcl9pbmRpY2VzKCBkYXRhLCAjJ25vdEV4cGlyZWQgKTsKKyAgc2F2ZV9vYmplY3QoIFNBVkVGSUxFICk7Cit9CisKKy8vIERpZXNlIEZ1bmt0aW9uIGlzdCBkaWUgZWluZ2V0bGljaGUgRnVua3Rpb24sIGRpZSAiZ2VtYXN0ZXJ0IiB3ZXJkZW4KKy8vIHNvbGwsIGFsc28gZvxyIG1laHJlcmUgT3BmZXJzdG9lY2tlIGdlbWVpbnNhbSBiZW51dHp0IHdpcmQuCisvLyBEZXIgT3BmZXJzdG9jayB1ZWJlcmdpYnQgZGFzIFNwaWVsZXJvYmpla3QgdW5kIGRpZSBnZXd1ZW5zY2h0ZQorLy8gQWxpZ25tZW50YWVuZGVydW5nLCBhbHMgRXJnZWJuaXMgd2lyZCAxIGdlbGllZmVydCwgd2VubiBlaW5lIEFlbmRlcnVuZworLy8gdm9yZ2Vub21tZW4gd3VyZGUgKDAgc29uc3QpIHVuZCBkYXMgQWxpZ25tZW50IGRlcyBTcGllbGVycyBlbnRzcHJlY2hlbmQKKy8vIGdlc2V0enQuCitpbnQgYWRkQWxpZ25tZW50KCBvYmplY3QgcGxheWVyLCBpbnQgYWxpZ24gKSB7CisgIGludCBuZXdBbGlnbjsKKyAgc3RyaW5nIG5hbWU7CisKKyAgLyoKKyAgLy8gRmFsbHMgbWFuIHZlcmhpbmRlcm4gd2lsbCwgZGFzcyBudXIgZGVyIEtsaWVudCBhdWYgZGllIERhdGVuIHp1Z3JlaWZ0LAorICAvLyBrYW5uIG1hbiBoaWVyIG5vY2ggQWJmcmFnZW4gZWluYmF1ZW4sIHR5cGlzY2hlcndlaXNlIHNpZWh0IGRhcyBkYW5uIHNvCisgIC8vIGF1czoKKyAgaWYoIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi54eHhdICE9IENMSUVOVCApIHJldHVybiAtMTsKKyAgLy8gb2RlcgorICBpZiggZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gZ2V0ZXVpZCgpICkgcmV0dXJuIC0xOworICAvLyBldGMuIGV0Yy4KKyAgKi8KKworICBuYW1lID0gZ2V0ZXVpZChwbGF5ZXIpOworCisgIC8vIE51ciBlaW5lIEFlbmRlcnVuZyBwcm8gVGFnLgorICAvLyBXaXIgYmVudXR6ZW4gaGllciwgZGFzcyBkYXRhW25hbWVdID09IDAgaXN0LCBmYWxscyBkYXRhIGRlbiBOYW1lbiBuaWNodAorICAvLyBlbnRoYWVsdCEKKyAgaWYoIG5vdEV4cGlyZWQoIG5hbWUsIGRhdGFbbmFtZV0gKSApIHJldHVybiAwOworCisgIC8vIERhdGVuIHNldHplbiB1bmQgc3BlaWNoZXJuLgorICBkYXRhW25hbWVdID0gdGltZSgpOworICBzYXZlX29iamVjdCggU0FWRUZJTEUgKTsKKworICAvLyBNYXhpbWFsZSBBZW5kZXJ1bmc6IDIwMAorICBpZiggYWxpZ24gPCAtMjAwICkgYWxpZ24gPSAtMjAwOworICBpZiggYWxpZ24gPiAyMDAgKSBhbGlnbiA9IDIwMDsKKworICBuZXdBbGlnbiA9IHBsYXllci0+UXVlcnlQcm9wKCBQX0FMSUdOICkgKyBhbGlnbjsKKworICAvLyBLYXBwdW5nIGJlaSArLTEwMDAKKyAgaWYoIG5ld0FsaWduIDwgLTEwMDAgKSBuZXdBbGlnbiA9IC0xMDAwOworICBpZiggbmV3QWxpZ24gPiAxMDAwICkgbmV3QWxpZ24gPSAxMDAwOworIAorICBwbGF5ZXItPlNldFByb3AoIFBfQUxJR04sIG5ld0FsaWduICk7CisgIHJldHVybiAxOworfQorCisvLyBTY2hsdXNzYmVtZXJrdW5nOgorLy8KKy8vIEdld2l0enRlIFByb2dyYW1taWVyZXIga29lbm50ZW4gZGVuIEtsaWVudCB1bmQgZGVuIE1hc3RlciBpbiBlaW5lcgorLy8gRGF0ZWkgenVzYW1tZW4gYWJsZWdlbi4gRGllIEJsdWVwcmludCB3aXJkIGFscyBNYXN0ZXIsIGRpZSBDbG9uZXMgd2VyZGVuCisvLyBhbHMgS2xpZW50ZW4gYmVudXR6dC4gSWNoIGhhYmUgZGFzIGhpZXIgYmV3dXNzdCBhbmRlcnMgZ2VtYWNodCB1bmQgZW1wZmVobGUKKy8vIGRhcyBhdWNoIGFscyBWb3JiaWxkLCB3ZWlsIHNvIGRlciBDb2RlIHdlc2VudGxpY2ggYmVzc2VyIHp1IHZlcnN0ZWhlbiBpc3QuCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvYnNwbW9uMS5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4NWZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjEuYwpAQCAtMCwwICsxLDc4IEBACisvKgorKiogRWluIGdhbnogbm9ybWFsZXMgU3RhbmRhcmQtbW9uc3RlciBvaG5lIEJlc29uZGVyaGVpdGVuCisqKiAodm9uIEJvaW5nKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKKy8vIGRlbiBTdGFuZGFyZC1OUEMgZGVyIE11ZGxpYiBlcmJlbi4KK2luaGVyaXQgIi9zdGQvbnBjIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOyAgICAvKiBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzICovCisKKy8qIERpZSBLdXJ6YmVzY2hyZWlidW5nIHdpcmQgenVtIEJlaXNwaWVsIGFuZ2V6ZWlndCB3ZW5uIG1hbiBpbiBlaW5lbiBSYXVtCisgICBtaXQgZGVtIE1vbnN0ZXIgcmVpbmxhZXVmdCAqLworICBTZXRQcm9wKFBfU0hPUlQsICJCZWlzcGllbG1vbnN0ZXIiKTsKKworLyogQmVpbSBBbnNjaGF1ZW4gZGVzIE1vbnN0ZXJzIHdpcmQgZGllIGxvbmctZGVzY3JpcHRpb24gYW5nZXplaWd0ICovCisgIFNldFByb3AoUF9MT05HLCAiRWluIEJlaXNwaWVsbW9uc3RlciBvaG5lIEJlc29uZGVyaGVpdGVuLlxuIik7CisKKy8qIEVpbiBOYW1lIG11c3Mgc2VpbiwgZGEgc29uc3Qgei5CLiBpbSBUb2Rlc2ZhbGwgJ0xlaWNoZSB2b24gMCcgZGFsaWVndCAqLworICBTZXRQcm9wKFBfTkFNRSwgIk1vbnN0ZXIiKTsKKworLyogRGFzIEdlc2NobGVjaHQgZGVzIE1vbnN0ZXJzLiBBbHMgR2VzY2hsZWNodGVyIHNpbmQgKi8KKy8qIGRpZSBpbiA8bGFuZ3VhZ2UuaD4gZGVmaW5pZXJ0ZW4gU3ltYm9sZSBORVVURVIsIE1BTEUgICAqLworLyogdW5kIEZFTUFMRSB6dWxhZXNzaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisKKy8qIEVpbiBNb25zdGVyIGJyYXVjaHQgbWluZGVzdGVucyBlaW5lIElELCB1bnRlciBkZXIgbWFuIGVzIGFuc3ByZWNoZW4ga2FubiAqLworLyogRXMga2FubiBhYmVyIGF1Y2ggbWVocmVyZSB2ZXJzY2hpZWRlbmUgSUQncyBoYWJlbi4gICAgICAgICAgICAgICAgICAgICAgICovCisgIEFkZElkKCJtb25zdGVyIik7CisgIEFkZElkKCJiZWlzcGllbG1vbnN0ZXIiKTsKKworLyogWnVlcnN0IHNvbGx0ZSBtYW4gZGVtIE1vbnN0ZXIgZWluZW4gR3J1bmRsZXZlbCBnZWJlbi4gKi8KKy8qIERpZSBTcGVsbHB1bmt0ZSB1bmQgZGllIExlYmVucHVua3RlIHNvd2llIGRpZSBBdHRyaWJ1dGUgd2VyZGVuIGRhbm4gKi8KKy8qIGF1dG9tYXRpc2NoIGFuZ2VwYXNzdC4gKi8KKyAgY3JlYXRlX2RlZmF1bHRfbnBjKCAxMCApOworCisvKiBOdW4gbWFjaGVuIHdpciBlcyBldHdhcyB3aWRlcnN0YW5kc2ZhZWhpZ2VyLCBpbmRlbSB3aXIgUF9CT0RZIHNldHplbi4gICovCisvKiBOaWUgUF9UT1RBTF9BQyBvZGVyIFBfQUMgc2V0emVuLCBQX1RPVEFMX0FDIHdpcmQgYXV0b21hdGlzY2ggYmVyZWNobmV0ICovCisvKiB1bmQgUF9BQyBpc3QgbnVyIGZ1ZXIgUnVlc3R1bmdlbiBkYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9CT0RZLCA1NSk7CisKKy8qIERhcyBNb25zdGVyIHNjaGxhZWd0IG1pdCBibG9zc2VuIEhhZW5kZW4genUsIGFsc28gd2lyZCBQX0hBTkRTIGdlc2V0enQuICAgKi8KKy8qIEF1Y2ggaGllciB3ZWRlciBQX1RPVEFMX1dDIG5vY2ggUF9XQyBzZXR6ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNlaW5lbiBIYWVuZGVuIiwgNTV9KSk7CisvKiAgICAgICAgICAgICAgICAgIF4gZGllc2VzIExlZXJ6ZWljaGVuIGlzdCB3aWNodGlnICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWltIEthbXBmIGVyc2NoZWludCBudW46ICdEYXMgTW9uc3RlciBncmVpZnQgRGljaCBtaXQgc2VpbmVuIEhhZW5kZW4gYW4nICovCisvKiA1NSBlbnRzcHJpY2h0IGRlciBXYWZmZW5rbGFzc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEdlc2lubnVuZyBkZXMgTW9uc3RlcnMsIDAgaXN0IG5ldXRyYWwsIG5lZ2F0aXYgYm9lc2UgdW5kIHBvc2l0aXYgZ3V0ICovCisgIFNldFByb3AoUF9BTElHTiwgMTAwKTsgIC8qIEVpbmlnZXJtYXNzZW4gbmV0dCwgYWJlciBuaWNodHMgYmVzb25kZXJlcyAqLworCisvKiBEaWUgUmFzc2UgZGVzIE1vbnN0ZXJzICovCisgIFNldFByb3AoUF9SQUNFLCAiSXJnZW5kbmVyYXNzZSIpOworCisvKiBFcmZhaHJ1bmdzcHVua3RlIGRlcyBNb25zdGVycywgYmVpbSBUb2QgZXJoYWVsdCBkZXIgJ0tpbGxlcicgZWluICAgKi8KKy8qIGh1bmRlcnRzdGVsIGRpZXNlcyBXZXJ0ZXMuIFNjaG9uIGltIEthbXBmIGVyaGFlbHQgbWFuIGJlaSBqZWRlbSAgICAqLworLyogU2NobGFnIHdlYXBvbl9jbGFzcypzY2hhZGVuLzEwIHB1bmt0ZSAod2VhcG9uX2NsYXNzIGhpZXIgNTUpLCBhbHNvICovCisvKiBpbnNnZXNhbXQgd2VhcG9uX2NsYXNzKmhpdF9wb2ludHMvMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX1hQLCAxMDAwMCk7CisKKy8qIERpZSBHcm9lc3NlIGRlcyBNb25zdGVycyBpbiBjbS4gRGllcyB3aXJkIGJlaSBlaW5pZ2VuIEthbXBmYmVmZWhsZW4gKi8KKy8qIGF1c2dld2VydGV0LCBzb3dpZSBiZWkgZWluaWdlbiBJZGVudGlmaWthdGlvbnNzcHJ1ZWNoZW4gdm9uIEdpbGRlbiAgKi8KKyAgU2V0UHJvcChQX1NJWkUsMTgwKTsKKworLyogV2VpdGVyZSBXZXJ0ZTogUF8oTUFYKV9GT09ELCBQXyhNQVgpX0RSSU5LLCBQXyhNQVgpX0FMQ09IT0wsICAgICAgICovCisvKiBQX01TR0lOLCBQX01TR09VVCwgUF9NTVNHSU4sIFBfTU1TR09VVCwgUF9NQVhfSEFORFMsIFBfVVNFRF9IQU5EUyAgKi8KKworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL2JzcG1vbjIuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3Btb24yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmMzkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3Btb24yLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisqKiBFaW4gQmVpc3BpZWxtb25zdGVyIG1pdCBkaXYgRXh0cmFzICh2b24gQm9pbmcsIGFrdHVhbGlzaWVydCB2b24gV2ltK1plc3N0cmEpCisqLworCisvLyBEaWVzZSBQcmFnbWFzIHNvcmdlbiBkYWZ1ZXIsIGRhc3MgZGVyIERyaXZlciBkYXJhdWYgYWNodGV0LCBkYXNzIGJlaQorLy8gRnVua3Rpb25zYXJndW1lbnRlbiwgLVJ1ZWNrZ2FiZXdlcnRlbiB1bmQgdGVpbHdlaXNlIGJlaSBadXdlaXN1bmcgdm9uCisvLyBXZXJ0ZW4gYW4gVmFyaWFibGVuIGRlciByaWNodGlnZSBEYXRlbnR5cCB2ZXJ3ZW5kZXQgd2lyZCAoei5iLiBrZWluIHN0cmluZworLy8gYW5zdGVsbGUgZWluZXMgaW50IHZlcndlbmRldCB3aXJkKS4gU29sbHRlIGluIGtlaW5lbSBPYmpla3QgZmVobGVuLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+ICAgIC8vIGZ1ZXIgZGllIGRhbWFnZSB0eXBlcworI2luY2x1ZGUgPG1vdmluZy5oPiAgICAvLyBmdWVyIFJFSkVDVF9LRUVQICAgCisjaW5jbHVkZSA8Y2xhc3MuaD4gICAgIC8vIGZ1ZXIgQWRkQ2xhc3MgCisjaW5jbHVkZSA8bmV3X3NraWxscy5oPiAvLyBmdWVyIFNQXyogYmVpIEFkZFNwZWxsCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7ICAgICAgIC8qIFdJQ0hUSUchISEgKi8KKworLyogU3RhbmRhcmQtS25vZmlndXJhdGlvbiAoRXJsYWV1dGVydW5nZW4gc2llaGUgYnNwbW9uMS5jKTogKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFphdWJlcmVyIik7CisgIFNldFByb3AoUF9MT05HLCAiRGllc2VyIFphdWJlcmVyIHphdWJlcnQgd2llIHdpbGQgdW5kIHNjaHdpbmd0IGRhYmVpICIKKyAgICAic2VpbmVuIGxhbmdlbiBCYXJ0LlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiWmF1YmVyZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIEFkZElkKCJ6YXViZXJlciIpOworICBjcmVhdGVfZGVmYXVsdF9ucGMoMTgpOworICBTZXRQcm9wKFBfQUxJR04sIC03MDApOyAgIC8qIEJycnIsIGlzdCBkZXIgYm9lc2UgLi4uLiAqLworICBTZXRQcm9wKFBfQk9EWSwgMTI1KTsKKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNlaW5lbSBsYW5nZW4gQmFydCIsIDE4NX0pICk7CisgIFNldFByb3AoUF9TSVpFLDE4MCk7CisgIFNldFByb3AoUF9NQVhfSEFORFMsIDIpOyAgLyogQW56YWhsIGRlciBIYWVuZGUgKGRlZmF1bHQgaXN0IDIpICovCisgIC8vIHNldF9saXZpbmdfbmFtZSgpIHNldHp0IGVpbmVuIE5hbWVuLCBtaXQgZGVyIGRlciBaYXViZXJlciB6LkIuIG1pdCBlaW5lbQorICAvLyAnZmluZGUnIGdlZnVuZGVuIHdlcmRlbiBrYW5uLiBGdWVyIGRpZSBtZWlzdGVuIE5QQyBpc3QgZGllcyBuaWNodCBub2V0aWcuCisgIC8vIFNwZXppZWxsIHNvbGx0ZSBtYW4ga2VpbmUgZ2VuZXJpc2NoZW4gQmV6ZWljaG51bmdlbiBoaWVyIGFubWVsZGVuLCB3ZW5uCisgIC8vIHNjaG9uLCBkYW5uIGluZGl2aWR1ZWxsZSBOYW1lbi4KKyAgLyogc2V0X2xpdmluZ19uYW1lKCJ6YXViZXJlciIpOyAqLworCisvKiBNaXQgQWRkQ2xhc3MoKSB1bmQgUF9SQUNFIHdpcmQgZmVzdGdlbGVndCwgaW4gd2VsY2hlIEdydXBwZSB2b24gTGViZS0gICovCisvKiB3ZXNlbiBkZXIgTlBDIGdlaG9lcnQsIHdlbGNoZSBtaXQgaXNfY2xhc3NfbWVtYmVyKG1peGVkIHN0cikgYWJnZWZyYWd0ICovCisvKiB3ZXJkZW4ga2Fubi4gSW0gTWluaW1hbGZhbGwgaXN0IGRlciBOUEMgdm9uIGRlciBLbGFzc2UsIGRpZSBiZWkgUF9SQUNFICovCisvKiBlaW5nZXRyYWdlbiBpc3QuIE1pdCBBZGRDbGFzcygpIGtvZW5uZW4gYWJlciBub2NoIHdlaXRlcmUgRWlnZW4tICAgICAgICovCisvKiBzY2hhZnRlbiBoaW56dWdlZnVlZ3Qgd2VyZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgU2V0UHJvcChQX1JBQ0UsIlN1cGVyZHVwZXJ6YXViZXJlciIpOworICBBZGRDbGFzcyggKHsgQ0xfSFVNQU4sIENMX01BTU1BTCB9KSApOworCisvKiBNaXQgUF9SRVNJU1RBTkNFIHVuZCBQX1ZVTE5FUkFCSUxJVFkgd2VyZGVuIGZpeGUgV2VydGUgKDUwJSkgZnVlciAgICAgICovCisvKiBSZXNpc3RlbnplbiByZXNwZWt0aXZlIEFuZmFlbGxpZ2tlaXRlbiBnZXNldHp0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBEaWUgTGlzdGUgZGVyIG1vZWdsaWNoZW4gU2NoYWRlbnNhcnRlbiBpc3QgaW4gL3N5cy9jb21iYXQuaCBkZWZpbmllcnQuICovICAKKy8qIHouQi4gIFNldFByb3AoUF9SRVNJU1RBTkNFLCAoeyBEVF9NQUdJQyB9KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFNldFByb3AoUF9WVUxORVJBQklMSVRZLCAoeyBEVF9DT0xEIH0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1pdCBQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTIGtvZW5uZW4gUmVzaXN0ZW56ZW4gdW5kIEFuZmFlbGxpZ2tlaXQgICAgICAgKi8KKy8qIGtvbmZpZ3VyaWVydCB3ZXJkZW4uIERpZXNlIFByb3BlcnR5IGVudGhhZWx0IGVpbiBNYXBwaW5nIHZvbiAgICAgICAgICAgKi8KKy8qIHZvbiBTY2hhZGVuc2FydGVuIGVudGhhZWx0LiBOZWdhdGl2ZSBGYWt0b3JlbiBiaXMgbWF4aW1hbCAtMS4wICAgICAgICAgKi8gCisvKiAoPUltbXVuaXRhZXQpIGdlYmVuIFJlc2lzdGVuemVuLCBwb3NpdGl2ZSBXZXJ0ZSBBbmZhZWxsaWdrZWl0ZW4gYW4uICAgICovCisKKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCAoWyBEVF9NQUdJQzogLTAuNSwgRFRfQ09MRDogMi4wXSkgKTsJCQkJCSAgICAgIAorCisvKiBEdXJjaCBkaWVzZW4gQmVmZWhsIHdpcmQgZWluZSBXYWZmZSBnZWNsb250LCBzb2Zlcm4gc2llIG5pY2h0IGltIFJhdW0gICovCisvKiBoZXJ1bWxpZWd0IChpbiBkZW0gRmFsbCB3aXJkIHNpZSB2b20gTlBDIGF1ZmdlaG9iZW4pLCB1bmQgZ2V6dWVja3QgICAgICovIAorLyogKGRlZmluaWVydCBpbiAvc3RkL25wYy9pdGVtcy5jIHJlc3AuIC9zeXMvbnBjLmgpICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwd2FmZmUxIiwgQ0xPTkVfV0lFTEQpOworLyogVW5kIG5vY2ggZWluZSBSdWVzdHVuZyBjbG9uZW4gdW5kIGFuemllaGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCisgIEFkZEl0ZW0oIi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxIiwgQ0xPTkVfV0VBUik7CisKKy8qIEpldHp0IHdpcmQgZ2V6YXViZXJ0IC4uLi4gICAgICovCisKKy8qIFNldFByb3AoUF9TUEVMTFJBVEUsKSBsZWd0IGRpZSBXYWhyc2NoZWlubGljaGtlaXQgZmVzdCwgbWl0IGRlciBlaW4gICAqLworLyogWmF1YmVyc3BydWNoIGR1cmNoZ2VmdWVocnQgd2lyZCwgaGllciA0MCUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX1NQRUxMUkFURSw0MCk7CisKKy8qIE1pdCBBZGRTcGVsbCgpIHdpcmQgZWluIFphdWJlcnNwcnVjaCBoaW56dWdlZnVlZ3QuIERhcyBlcnN0ZSBBcmd1bWVudCAgKi8KKy8qIGlzdCBzbyBldHdhcyB3aWUgZGllIHJlbGF0aXZlIFdhaHJzY2hlaW5saWNoa2VpdCBkZXMgU3BydWNocyBpbSAgICAgICAgKi8KKy8qIFZlcmdsZWljaCB6dSBkZW4gYW5kZXJlbiwgaGllciBiZWltIGVyc3RlbiBzcHJ1Y2ggMSBiZWltIHp3ZWl0ZW4gMiwgICAgKi8KKy8qIGRhcyBoZWlzc3QgaW4gMjAlIGRlciBGYWVsbGUgd2lyZCBkZXIgZXJzdGUgWmF1YmVyc3BydWNoIGdlbm9tbWVuIHVuZCAgKi8KKy8qIGluIDQwJSBkZXIgendlaXRlIHVuZCBpbiA2MCUgZGVyIGRyaXR0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhcyB6d2VpdGUgQXJndW1lbnQgaXN0IGRlciBtYXhpbWFsZSBTY2hhZGVuLCBlbnRzcHJlY2hlbmQgZGVyIFdDICAgICAgKi8KKy8qIGVpbmVyIFdhZmZlIG9kZXIgUF9IQU5EUyBiZWltIHdhZmZlbmxvc2VuIEthbXBmLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpZSB6d2VpIHdlaXRlcmVuIEFyZ3VtZW50ZSBzaW5kIGRpZSBNZWxkdW5nZW4gZGllIGRlciBhbmdlZ3JpZmZlbmUgICAgKi8KKy8qIFNwaWVsZXIgc2VsYnN0IHVuZCBldmVudHVlbGxlIFp1c2NoYXVlciBlcmhhbHRlbi4gSGllcmJlaSBzdGVoZW4gQFdFUiwgKi8KKy8qIEBXRU4sIEBXRU0gdW5kIEBXRVNTRU4gZnVlciBkZW4gTmFtZW4gZGVzIE9wZmVycyBpbSBlbnRzcHJlY2hlbmRlbiAgICAgKi8KKy8qIEZhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhcyA1LiBBcmd1bWVudCBpc3Qgb3B0aW9uYWwgdW5kIGdpYnQgZGVuIFNjaGFkZW5zdHlwIGFuLCBmZWhsdCBlciAgICAgKi8KKy8qIHdpcmQgRFRfTUFHSUMgYW5nZW5vbW1lbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorLyogSW0gNi4gQXJ1Z3VtZW50IGthbm4gZWluZSBGdW5rdGlvbiBzdGVoZW4sIGRpZSBiZWkgZGVtIFNwcnVjaCBhdXNnZS0gICAqLworLyogZnVlaHJ0IHdlcmRlbiBzb2xsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGFzIHNpZWJ0ZSB1ZWJlcmdpYnQgZGllIFNwZWxsIFBhcmFtZXRlciwgaGllciBpc3Qgd2ljaHRpZywgZGFzcyBiZWkgICAqLworLyogcGh5c2lrYWxpc2NoZW4gU2NoYWVkZW4gYXVjaCBTUF9QSFlTSUNBTF9BVFRBQ0sgZ2VzZXR6dCB3aXJkLCBkYSBzb25zdCAqLworLyogZWluaWdlIEdpbGRlbiBkZW4gIlphdWJlcnNwcnVjaCIgYWJ3ZWhyZW4ga29lbm5lbiAoc2llaGUgU3BlbGxEZWZlbmQpICAqLworCisgIEFkZFNwZWxsKDIwLDYwLCAKKwkgICAiICBEZXIgWmF1YmVyZXIgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggRGlyLlxuIiwKKwkgICAiICBEZXIgWmF1YmVyZXIgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggQFdFTS5cbiIsCisJICAgKHsgRFRfRklSRSB9KSApOworICBBZGRTcGVsbCg0MCw5NSwKKwkgICAiICBEZXIgWmF1YmVyZXIgYmVzY2h3b2VydCBlaW5lbiBTdHVybSB1ZWJlciBkZWluZW0gS29wZiBoZXJ2b3IuXG4iLAorCSAgICIgIERlciBaYXViZXJlciBiZXNjaHdvZXJ0IGVpbmVuIFN0dXJtIHVlYmVyIEBXRVNTRU4gS29wZiBoZXJ2b3IuXG4iLAorCSAgICh7IERUX0FJUiwgRFRfTElHSFROSU5HIH0pICk7ICAKKyAgQWRkU3BlbGwoNjAsNTAsCisgICAgICAgICAgICIgIERlciBaYXViZXJlciB0cml0dCBEaWNoIGhpbnRlcmxpc3RpZy5cbiIsCisJICAgIiAgRGVyIFphdWJlcmVyIHRyaXR0IG5hY2ggQFdFTS5cbiIsCisJICAgKHsgRFRfQkxVREdFT04gfSksIDAsCisJICAgKFtTUF9TSE9XX0RBTUFHRToxLCBTUF9QSFlTSUNBTF9BVFRBQ0s6MV0pICk7ICAJICAgCisKKworLyogUmVkZW4ga2FubiBkZXIgWmF1YmVyZXIgYXVjaCB2b24gYWxsZWluZSwgaGllciBrb21tZW4gZGllIGNoYXRzOiAgICAgKi8KKworLyogRGFzIGVyc3RlIEFyZ3VtZW50IGlzdCBkaWUgV2FocnNjaGVpbmxpY2hrZWl0LCBtaXQgZGVyIGRhcyBNb25zdGVyCisgKiBlaW5lbiBTcHJ1Y2ggYnJpbmd0ICh3ZW5pZ2VyIGlzdCBtZWhyISkuIERhcyB6d2VpdGUgQXJndW1lbnQgaXN0IGRpZSBMaXN0ZQorICogZGVyIFNwcnVlY2hlIChvZGVyIEFrdGlvbmVuKS4KKyAqLworCisgIFNldENoYXRzKDIsICh7CisgICJEZXIgWmF1YmVyZXIgbGFldWZ0IGltIEtyZWlzIGhlcnVtLlxuIiwKKyAgIkRlciBaYXViZXJlciBzdG9scGVydCB1ZWJlciBzZWluZW4gQmFydC5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogSGVoIER1ISBXYXMgbWFjaHN0IER1IGRhP1xuIiwKKyAgIkRlciBaYXViZXJlciBtdXJtZWx0IGVpbiBwYWFyIHNlbHRzYW1lIFdvcnRlIGluIHNlaW5lbiBCYXJ0LlxuIiwKKyAgIkRlciBaYXViZXJlciBicmljaHQgaW4gdW5rb250cm9sbGllcnRlcyBHZWxhZWNodGVyIGF1cy5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogSGFzdCBtaXIgbWFsIG5lIE1hcmssIGV5P1xuIiwKKyAgIkRlciBaYXViZXJlciBzYWd0OiBXZW5uIGljaCBkaWVzZW4gT2xwcCBlcndpc2NoZSAuLi5cbiIsCisgICJEZXIgWmF1YmVyZXIgemF1YmVydCBlaW4gS2FuaW5jaGVuIGF1cyBzZWluZW0gSHV0LlxuIgorICB9KSApOworCisvKiBEYXMgc2VsYmUgZnVlciBTcHJ1ZWNoZSBkaWUgd2FlaHJlbmQgZWluZXMgS2FtcGZlcyBrb21tZW4gc29sbGVuICAgICovCisKKyAgU2V0QXR0YWNrQ2hhdHMoMjAsICh7CisgICJEZXIgWmF1YmVyZXIgbWFjaHQ6IEJ1aCFcbiIsCisgICJEZXIgWmF1YmVyZXIgd2lyZnQgbWl0IHdlaXNzZW4gTWFldXNlbiBuYWNoIERpci5cbiIsCisgICJEZXIgWmF1YmVyZXIgc2FndDogRGFzIHdhciBlaW4gZ3Jvc3NlciBGZWhsZXIhXG4iLAorICAiRGVyIFphdWJlcmVyIGJlaXNzdCBEaWNoIGluIGRlbiBBcm0uXG4iLAorICAiRGVyIFphdWJlcmVyIHphdWJlcnQgZ3J1ZW5lIFB1bmt0ZSBhdWYgZGVpbmUgV2FuZ2UuXG4iLAorICAiRGVyIFphdWJlcmVyIHZlcndhbmRlbHQgc2ljaCBpbiBlaW5lIEtyb2V0ZS5cbiIsCisgICJEZXIgWmF1YmVyZXIgdmVyc2Nod2luZGV0IHVuZCB0YXVjaHQgaGludGVyIERpciB3aWVkZXIgYXVmLlxuIgorICB9KSApOworCisvKiBXZW5uIGVyIHN0aXJidCBzb2xsIGVpbmUgYmVzb25kZXJlIE1lbGR1bmcgZXJzY2hlaW5lbi4gKi8KKyAgU2V0UHJvcCggUF9ESUVfTVNHLCAiIGxvZXN0IHNpY2ggaW4gTHVmdCBhdWYuXG4iICk7CisvKiBEYW5uIHNvbGwgbmF0dWVybGljaCBhdWNoIGtlaW4gTGVpY2huYW0gcnVtbGllZ2VuICovCisgIFNldFByb3AoIFBfTk9DT1JQU0UsIDEgKTsKKyAKKy8qIE51biB3b2xsZW4gd2lyIGRlbiBaYXViZXJlciBub2NoIGF1ZiBlaW4gcGFhciBGcmFnZW4gYW50d29ydGVuIGxhc3NlbiAgICAqLworLyogQWRkSW5mbyhERUZBVUxUX0lORk8sKSBzZXR6dCBkaWUgQW50d29ydCBhdWYgYWxsZSBGcmFnZW4sIHdvIGRlciAgICAgICAgICovCisvKiBTY2hsdWVzc2VsIG5pY2h0IGJla2FubnQgaXN0LiBEZXIgTmFtZSBkZXMgWmF1YmVyZXJzIHdpcmQgaW1tZXIgdm9yIGRlbiAgKi8KKy8qIFN0cmluZyBnZXNldHp0LiAoU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgaXN0IG9ic29sZXQgdW5kIHNvbGx0ZSBuaWNodCAgICAqLworLyogbWVociBhbmdld2VuZGV0IHdlcmRlbi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorCisgIEFkZEluZm8oREVGQVVMVF9JTkZPLCJzYWd0OiBLZWluZSBBaG51bmcsIHZvbiB3YXMgRHUgcmVkZXN0LlxuIiwwLAorICAgICAgICAgICAgICAgICAgICAgICAic2FndCB6dSBAV0VNOiBLZWluZSBBaG51bmcsIHZvbiB3YXMgRHUgcmVkZXN0LlxuIik7CisKKy8qIERpZSBiZWthbm50ZW4gU2NobHVlc3NlbCB3ZXJkZW4gbWl0IEFkZEluZm8gZGF6dWdlZnVlZ3QsIGRhcyBlcnN0ZSAgICAgICAqLworLyogQXJndW1lbnQgaXN0IGRhcyBXb3J0IChvZGVyIGRpZSBMaXN0ZSB2b24gV29lcnRlcm4pLCB6dSBkZXIgZGVyIFphdWJlcmVyICovCisvKiBiZWZyYWd0IHdlcmRlbiBrYW5uLCBkYXMgendlaXRlIEFyZ3VtZW50IGlzdCBkaWUgZW50c3ByZWNoZW5kZSBBbnR3b3J0LiAgKi8KKy8qIGlzdCBkYXMgZHJpdHRlIEFyZ3VtZW50IGdlc2V0enQsIHNvIHdpcmQgZGllIEFudHdvcnQgYXV0b21hdGlzY2ggdW1nZS0gICAqLworLyogYnJvY2hlbiB1bmQgYmVrb21tdCBkZW4gVGV4dCBkZXMgQXJndW1lbnRzIHZvciBqZWRlIFplaWxlIGdlc3RlbGx0LiAgICAgICovCisvKiBEYXMgdmllcnRlLCBlYmVuZmFsbHMgb3B0aW9uYWxlLCBBcmd1bWVudCB3aXJkIHNvZmVybiBnZXNldHp0IGFuIGRpZSAgICAgKi8KKy8qIHVtc3RlaGVuZGVuIFBlcnNvbmVuIGF1c2dlZ2ViZW4sIGRhZHVyY2ggbGFlc3N0IHNpY2ggZWluIEZsdWVzdGVybiBvZGVyICAqLworLyogZWluZSBzcGllbGVyYWJoYWVuZ2lnZSBBbnR3b3J0IHJlYWxpc2llcmVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgQWRkSW5mbygia2FuaW5jaGVuIiwKKyAgInNhZ3Q6IERpZSBob2wgaWNoIGltbWVyIGF1cyBtZWluZW0gSHV0LlxuIik7CisgIEFkZEluZm8oInphdWJlcmVpIiwKKyAgInNhZ3Q6IEljaCBiaW4gZWluIE1laXN0ZXIgZGVyIFphdWJlcmVpLlxuIik7CisgIEFkZEluZm8oKHsibWF1cyIsICJtYWV1c2UifSksCisgICJzYWd0OiBNYWV1c2Ugc2luZCBtZWluZSBMaWVibGluZ3N0aWVyZS5cbiIpOyAKKyAgCisgIEFkZEluZm8oICh7InRpZXIiLCJ0aWVyZSJ9KSwgCisgICAgICAgICAgIk9oLCBoYXVwdHNhZWNobGljaCBiZXNjaGFlZnRpZ2UgaWNoIG1pY2ggbWl0IEthbmluY2hlbiB1bmQgTWFldXNlbi4iLAorICAgICAgICAgICJmbHVlc3RlcnQgRGlyIHp1OiAiLAorICAgICAgICAgICJmbHVlc3RlcnQgbWl0IEBXRU0uXG4iKTsKKworLyogTm9ybWFsZXJ3ZWlsZSBuZWhtZW4gTW9uc3RlciBhbGxlcyB3YXMgbWFuIGlobmVuIGdpYnQsIG9obmUgZWluZW4gVG9uICovCisvKiB6dSBzYWdlbi4gV2lsbCBtYW4gZG9ydCBlaW4gYW5kZXJlcyBWZXJoYWx0ZW4sIHNvIHR1dCBtYW4gZGFzIHNvOiAgICAgKi8KKy8qIE1vZWdsaWNoIHNpbmQgYXVjaCBSRUpFQ1RfR0lWRSAoPSB6dXJ1ZWNrZ2ViZW4pIFJFSkVDVF9EUk9QICg9ZmFsbGVuICAqLworLyogbGFzc2VuLiAqLworICBTZXRQcm9wKCBQX1JFSkVDVCwgKHsgUkVKRUNUX0tFRVAsICJEZXIgWmF1YmVyZXIgc2FndDogRGFua2VzY2hvZW4uXG4iIH0pICk7CisKKy8qIERlciBaYXViZXJlciBrYW5uIGF1Y2ggenVzYWV0emxpY2hlIFZlcmJlbiBoYWJlbiwgZGllIG51ciBlciBzZWxiZXIKKyAqIGJlbnV0emVuIGthbm4sIGtlaW4gYW5kZXJlcyBMaXZpbmcuIERpZXNlIGtvZW5uZW4gbWl0IGFkZF9hY3Rpb24oKSBpbQorICogY3JlYXRlIGVpbmVzIE5QQyBhbmdlbWVsZGV0IHdlcmRlbiAodW5kIGlkUiBOVVIgaW4gZGllc2VyIEZ1bmt0aW9uIHVuZCBOVVIKKyAqIGluIExlYmV3ZXNlbiwgbmljaHQgaW4gc29uc3RpZ2VuIE9iamVrdGVuISAqLworICBhZGRfYWN0aW9uKCJuYXNlYm9ocmVuIiwgImJvaHJlaW5uYXNlIik7CisKKy8qIFZlcmJlbiwgZGllIFNwaWVsZXIgaW4gR2VnZW53YXJ0IGRlcyBaYXViZXJlcnMga29lbm5lbiBzb2xsZW4sIHdlcmRlbiAgICAgKi8KKy8qIG1pdCBBZGRDbWQgYW5nZW1lbGRldC4gKi8KK30KKworaW50IG5hc2Vib2hyZW4oIHN0cmluZyBzdHIgKSAvLyBzdHIgaXN0IGRhcywgd2FzIGhpbnRlciBkZW0gdmVyYiBlaW5nZWdlYmVuIHd1cmRlLgoreworICAgc2F5KCAiRGVyIFphdWJlcmVyIGJvaHJ0IG1pdCBkZW0gU3RhYiBpbiBzZWluZXIgTmFzZS5cbiIgKTsKKyAgIHJldHVybiAxOyAvLyBWZXJiIHdhciBlcmZvbGdyZWljaC4KK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHJhdW0xLmMgYi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcmF1bTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgzMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHJhdW0xLmMKQEAgLTAsMCArMSw3OCBAQAorLyogL2RvYy9iZWlzcGllbGUvbWlzYy9ic3ByYXVtMS5jIHZvbiBSdW1hdGEgKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJFaW4ga2xlaW5lcyBTY2hyZWliemltbWVyIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsCisgICAgICAgICJEdSBzdGVoc3QgaW4gZWluZW0ga2xlaW5lbiBTY2hyZWliemltbWVyLlxuIgorICAgICAgICAgIkVzIGdlaG9lcnRlIHdvaGwgaXJnZW5kd2FubiBlaW5tYWwgZWluZW0gTWFnaWVyLCBhYmVyIG51blxuIgorICAgICAgICAgImlzdCBkaWVzZXIgUmF1bSB2ZXJ3YWlzdCB1bmQgcm90dGV0IHZvciBzaWNoIGhpbi5cbiIKKyAgICAgICAgICJFaW4gZ3Jvc3NlciBTY2hyZWlidGlzY2ggaW4gZGVyIE1pdHRlIGRlcyBSYXVtZXMgc2NoZWludFxuIgorICAgICAgICAgIm5vY2ggZWluaWdlcm1hc3NlbiBndXQgZXJoYWx0ZW4genUgc2Vpbi4gRHVyY2ggZGllIFR1ZXJcbiIKKyAgICAgICAgICJpbSBOb3JkZW4gZmFlbGx0IGV0d2FzIExpY2h0IGhpbmVpbi5cbiIKKyAgICApOworICAgIFNldFByb3AoIFBfTElHSFQsIDEgKTsKKyAgICBTZXRQcm9wKCBQX0lORE9PUlMsIDEgKTsKKworICAgIEFkZERldGFpbCggKHsgInNjaHJlaWJ0aXNjaCIsICJ0aXNjaCIgfSksCisgICAgICAgICJBdWYgZGVtIFRpc2NoIGxpZWd0IGVpbmUgZGlja2UgU3RhdWJzY2hpY2h0LlxuIgorICAgICAgICAiRWluZSBTY2h1YmxhZGUgZmluZGVzdCBEdSBlYmVuZmFsbHMuXG4iCisgICAgKTsKKyAgICBBZGREZXRhaWwoICh7ICJzdGF1YiIsICJzdGF1YnNjaGljaHQiLCAic2NoaWNodCIgfSksCisgICAgICAgICJEdSBtYWxzdCBnZWxhbmd3ZWlsdCBlaW5pZ2UgS3JlaXNlIGluIGRlbiBTdGF1Yi5cbiIKKyAgICApOworICAgIEFkZERldGFpbCggInNjaHVibGFkZSIsCisgICAgICAgICJTbyBzZWhyIER1IERpY2ggYW5zdHJlbmdzdDsgRHUga2FubnN0IHNpZSBuaWNodCBiZXdlZ2VuLlxuIgorICAgICk7CisgICAgQWRkRGV0YWlsKCAidHVlciIgLAorICAgICAgICAiU2llIHN0ZWh0IHNlaXQgSmFocmVuIG9mZmVuIHVuZCBpc3QgaW4gZGllc2VyIExhZ2VcbiIKKyAgICAgICAgImhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iCisgICAgKTsKKworICAgIEFkZENtZCggKHsgInNjaGxpZXNzZSIsICJvZWZmbmUiLCAiYmV3ZWdlIiwgInNjaGxpZXNzIiwgImJld2VnIiB9KSwgCisgICAgICAgICAgICAiYmV3ZWdfZXR3YXMiICk7CisgICAgQWRkRXhpdCggIm5vcmRlbiIsICJwbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSIgKTsKK30KKworcHVibGljIGludCBiZXdlZ19ldHdhcyggc3RyaW5nIHN0ciApCit7CisgICAgbm90aWZ5X2ZhaWwoICJXYXMgd2lsbHN0IER1IGRlbm4gYmV3ZWdlbiA/IiApOworICAgIGlmKCBzdHIgPT0gInR1ZXIiICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiRGllIFR1ZXIgaXN0IGhvZmZudW5nc2xvcyBmZXN0Z2Vyb3N0ZXQuXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIHN0ciA9PSAibGFkZSIgfHwgc3RyID09ICJzY2h1YmxhZGUiICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiRGllIFNjaHVibGFkZSBrbGVtbXQgZWluZmFjaCBudXIuXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIHF1ZXJ5X3ZlcmIoKSA9PSAiYmV3ZWdlIiAmJgorICAgICAgICAoIHN0ciA9PSAidGlzY2giIHx8IHN0ciA9PSAic2NocmVpYnRpc2NoIiApICkKKyAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksCisgICAgICAgICAgICAiRGVyIFRpc2NoIHNjaGVpbnQgYW0gQm9kZW4gZmVzdGdlc2NocmF1YnQgenUgc2Vpbi5cbiIKKyAgICAgICAgKTsKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKFdFUiwyKSsiIHplcnJ0IGFtIFNjaHJlaWJ0aXNjaC5cbiIKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorIC8vIG9mZmVuYmFyIHBhc3N0ZSBuaXgsIEtvbW1hbmRvIG5pY2h0IGVyZm9sZ3JlaWNoIGFiZ2VhcmJlaXRldC4gR2dmLiB3ZWl0ZXJlCisgLy8gdmVyc3VjaGVuIHVuZC9vZGVyIGRpZSBub3RpZnlfZmFpbC1NZWxkdW5nIGF1c2dlYmVuLgorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxLmMgYi9kb2MvYmVpc3BpZWxlL21pc2MvYnNwcnVlc3QxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlM2IwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3BydWVzdDEuYwpAQCAtMCwwICsxLDM4IEBACisvKgorKiogRWluZSBCZWlzcGllbHJ1ZXN0dW5nCisqKiAodm9uIEJvaW5nKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvYXJtb3VyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOyAgIC8qIFdJQ0hUSUchISEgKi8KKworLyogU3RhbmRhcmRrb25maWd1cmF0aW9uLCBnZW5hdWVyZXMgc2llaGUgL2RvYy9iZWlzcGllbGUvYnNwd2FmZmUxLmMgICAgKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIGdyYXVlciBVbWhhbmciKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFcyBpc3QgZWluIGxhbmdlciBncmF1ZXIgVW1oYW5nIGF1cyBlaW5lbSBmZWluZW4gTWF0ZXJpYWwuXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJVbWhhbmciKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIEFkZElkKCJ1bWhhbmciKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMjUwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAyMDApOworCisvKiBadXIgV2FmZmUgZmVobHQgbmljaHQgbWVociB2aWVsLCBudXIgbm9jaCBkaWUgUnVlc3R1bmdza2xhc3NlIChBQykgICAgKi8KKy8qIHNldHplbiB1bmQgZWluZW4gUnVlc3R1bmdzdHlwIHNldHplbi4gRGllIFR5cGVuIHNpbmQgaW4gc3lzL2NvbWJhdC5oICAqLworLyogZGVmaW5pZXJ0LiBSaWNodGxpbmllbiB6dSBSdWVzdHVuZ3NrbGFzc2VuIGRlciB2ZXJzY2hpZWRlbmVuIFR5cGVuICAgICovCisvKiBzdGVoZW4gbW9tZW50YW4gaW4gL3BsYXllcnMvYm9pbmcvd2FmZmVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX0NMT0FLKTsKKyAgU2V0UHJvcChQX0FDLCA4KTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B0cmFuc3BvcnRlcjEuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B0cmFuc3BvcnRlcjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHRyYW5zcG9ydGVyMS5jCkBAIC0wLDAgKzEsMTMyIEBACitpbmhlcml0ICJzdGQvdHJhbnNwb3J0IjsKKworLyogd29sa2UuYyBFaW4gQmVpc3BpZWwgenVyIFByb2dyYW1taWVydW5nIGVpbmVzIFRyYW5zcG9ydGVycyAqLworLyogdm9uIFJ1bWF0YSAobWl0IGtsZWluZW4gQnVnZml4ZXMgdm9uIFdhcmdvbiA7KSAqLworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoIFBfTkFNRSwgIldvZWxrY2hlbiIgKTsKKyAgQWRkSWQoICh7ICJ3b2xrZSIsICJ3b2Vsa2NoZW4iIH0pICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBORVVURVIgKTsKKyAgU2V0UHJvcCggUF9JTlRfU0hPUlQsICJBdWYgZWluZXIga2xlaW5lbiBXb2xrZSIgKTsKKyAgU2V0UHJvcCggUF9JTlRfTE9ORywKKwkgICJEdSBzaXR6dCBhdWYgZWluZXIga2xlaW5lbiBXb2xrZSwgZGllIHp3aXNjaGVuIEpvZnMgdW5kIFJ1bWF0YXNcbiIKKwkgICsJIkFyYmVpdHN6aW1tZXIgaGluLSB1bmQgaGVycGVuZGVsdC4gV2VubiBzaWUgbmllZHJpZyBmbGllZ3QsIGthbm5zdFxuIgorCSAgKwkiRHUgYmVzdGltbXQgdm9uIGlociBoZXJ1bnRlcnN0ZWlnZW4uXG4iCisJICApOworICBTZXRQcm9wKCBQX1NIT1JULCAiRWluZSBrbGVpbmUgV29sa2UiICk7CisgIFNldFByb3AoIFBfTE9ORywKKwkgICJEaWVzZSBzdWVzc2Uga2xlaW5lIEN1bXVsdXN3b2xrZSBzY2h3ZWJ0IHp3aXNjaGVuIEpvZnMgdW5kIFJ1bWF0YXNcbiIKKwkgICsJIkFyYmVpdHN6aW1tZXIgaGluIHVuZCBoZXIuIFZpZWxsZWljaHQga2FubnN0IER1IGF1ZiBzaWUgZHJhdWZzdGVpZ2VuLlxuIgorCSAgKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9UUkFOU1BBUkVOVCwxKTsKKyAgLy8gTWFuIHNvbGwgYXVmKGluKSBkaWUgV29sa2UgdW5kIHZvbiBpaHIgaGVydW50ZXIgc2NoYXVlbiBrb2VubmVuLgorICAgIAorICAvKioqIE1lbGR1bmdlbiwgZGllIFRyYW5zcG9ydGVyIGdlYmVuIGtvZW5uZW4gKioqLworICAKKyAgU2V0UHJvcCggUF9ERVBBUlRNU0csICh7CisgICAgIkRpZSBXb2xrZSBzdGVpZ3QgaW4gZGllIEx1ZnQuXG4iLCAKKyAgICAiRGllIFdvbGtlIGZsaWVndCBkYXZvbi5cbiIKKyAgfSkgKTsKKyAgLy8gRGllIGVyc3RlIE1lbGR1bmcgaXN0IGZ1ZXIgTGV1dGUgYXVmIGRlciBXb2xrZS4KKyAgLy8gRGllIHp3ZWl0ZSBmdWVyIExldXRlIGluIGRlbSBSYXVtLCBpbiBkZW0gZGllIFdvbGtlIGFua29tbXQuCisgICAgICAKKyAgU2V0UHJvcCggUF9BUlJJVkVNU0csICh7CisgICAgIkRpZSBXb2xrZSBuYWVoZXJ0IHNpY2ggZGVtIEJvZGVuIHZvbiBAQFF1ZXJ5QXJyaXZlZEBALlxuIiwKKyAgICAiRWluZSBrbGVpbmUgV29sa2Ugc2Nod2VidCBoZXJhYi5cbiIKKyAgfSkgKTsKKyAgLy8gRGllIGVyc3RlIE1lbGR1bmcgaXN0IGZ1ZXIgTGV1dGUgYXVmIGRlciBXb2xrZS4KKyAgLy8gRGllIHp3ZWl0ZSBmdWVyIExldXRlIGluIGRlbSBSYXVtLCBhdXMgZGVtIGRpZSBXb2xrZSBhYnJlaXN0LgorICAgIAorICBTZXRQcm9wKCBQX0VOVEVSTVNHLCAoeworICAgICJzdGVpZ3QgYXVmIGRpZSBXb2xrZSIsCisgICAgImtvbW10IGF1ZiBkaWUgV29sa2UiCisgIH0pICk7CisgIC8vIERpZSBlcnN0ZSBNZWxkdW5nIGlzdCBmdWVyIGRlbiBSYXVtLCBhdXMgZGVtIGRlciBTcGllbGVyIGtvbW10LgorICAvLyAoPVJhdW0pLiBEaWUgendlaXRlIE1lbGR1bmcgaXN0IGZ1ZXIgU3BpZWxlciBpbiBkZW0gUmF1bSwgaW4KKyAgLy8gZGVuIGRlciBTcGllbGVyIGdlaHQgKD1UcmFuc3BvcnRlcikuCisJCisgIFNldFByb3AoIFBfTEVBVkVNU0csICh7CisgICAgInN0ZWlndCB2b24gZGVyIFdvbGtlIiwKKyAgICAic3RlaWd0IHZvbiBkZXIgV29sa2UiCisgIH0pICk7CisgIC8vIERpZSBlcnN0ZSBNZWxkdW5nIGlzdCBmdWVyIGRlbiBSYXVtLCBhdXMgZGVtIGRlciBTcGllbGVyIGtvbW10LgorICAvLyAoPVRyYW5zcG9ydGVyKS4gRGllIHp3ZWl0ZSBNZWxkdW5nIGlzdCBmdWVyIFNwaWVsZXIgaW4gZGVtIFJhdW0sCisgIC8vIGluIGRlbiBkZXIgU3BpZWxlciBnZWh0ICg9UmF1bSkuCisgICAgICAKKyAgU2V0UHJvcCggUF9MRUFWRUZBSUwsICJEaWUgV29sa2Ugc2Nod2VidCB2aWVsIHp1IGhvY2giICk7CisgIC8vIE1lbGR1bmcsIGRpZSBrb21tdCwgd2VubiBlaW4gU3BpZWxlciBkZW4gVHJhbnNwb3J0ZXIgdmVybGFzc2VuCisgIC8vIHdpbGwsIGFiZXIgZGllc2VyIGFuIGtlaW5lbSBSYXVtIGFuZ2VsZWd0IGhhdC4KKyAgLy8gSXN0IGRlciBQYXJhbWV0ZXIgZWluIFN0cmluZyAoc28gd2llIGhpZXIpLCBzbyBiZWtvbW10IG51cgorICAvLyBkZXIgYmV0cmVmZmVuZGUgU3BpZWxlciBkaWUgTWVsZHVuZywgd2VubiBzaWUgZWluIEFycmF5IGF1cworICAvLyAyIEVsZW1lbnRlbiBpc3QsIGJla29tbXQgZGVyIFNwaWVsZXIgZGllIGVyc3RlIHVuZCBhbGxlCisgIC8vIGFuZGVyZW4gU3BpZWxlciBpbSBUcmFuc3BvcnRlciBkaWUgendlaXRlIChtaXQgZGVtIE5hbWVuCisgIC8vIGRlcyBTcGllbGVycyBkYXZvcikuCisgIC8vIE1vZWdsaWNoIHdhZXJlIGFsc28gYXVjaDoKKyAgLyoKKyAgICAgU2V0UHJvcCggUF9MRUFWRUZBSUwsICh7CisgICAgICJEaWUgV29sa2Ugc2Nod2VidCB2aWVsIHp1IGhvY2ggenVtIEhlcnVudGVyc3ByaW5nZW4iLAorICAgICAiZmFlbGx0IGZhc3Qgdm9uIGRlciBXb2xrZSIKKyAgICAgfSkgKTsKKyAgKi8KKworICBTZXRQcm9wKCBQX0VOVEVSRkFJTCwgIkVzIHBhc3NlbiBudXIgNSBQYXNzYWdpZXJlIGF1ZiBkaWUgV29sa2UuXG4iICk7CisgIC8vIERpZXNlIE1lbGR1bmcgYmVrb21tdCBkZXIgU3BpZWxlciwgd2VubiBlciB2ZXJzdWNodCwgZWluZW4KKyAgLy8gdm9sbGVuIFRyYW5zcG9ydGVyIHp1IGJldHJldGVuLiBIaWVyIGlzdCBudXIgZWluZSBNZWxkdW5nCisgIC8vIChhbiBkZW4gU3BpZWxlcikgdm9yZ2VzZWhlbi4KKworICBTZXRQcm9wKCBQX01BWF9QQVNTRU5HRVJTLCA1ICk7CisgIC8vIE1heGltYWxlIEFuemFobCBkZXIgU3BpZWxlciwgZGllIHNpY2ggaW0gVHJhbnNwb3J0ZXIgYmVmaW5kZW4KKyAgLy8ga29lbm5lbi4gRnVlciBHZWdlbnN0YWVuZGUgZ2lidCBlcyBrZWluZSBCZXNjaHJhZW5rdW5nLgorCisgIC8qIFZlcmJlbiAqLworICBBZGRDbWQoICh7ICJzdGVpZyIsICJzdGVpZ2UiLCAic3ByaW5nIiwgInNwcmluZ2UiIH0pLCAic3RlaWdlIiApOworCisgIC8qIEt1cnMgKi8KKyAgQWRkUm91dGUoICJwbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSIsIDMwLCAyMCwgIlJ1bWF0YXMgQXJiZWl0c3ppbW1lciIgKTsKKyAgLy8gSGllciB3aXJkIGRlciBSYXVtIC9wbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSBhbHMgQW5sZWdlcGxhdHoKKyAgLy8gaW4gZGVuIEt1cnMgZWluZ2VmdWVndC4gRGVyIFRyYW5zcG9ydGVyIHZlcndlaWx0IDMwc2VrIGluIGRpZXNlbQorICAvLyBSYXVtIHVuZCBmYWVodCBkYW5uIDIwc2VrIGxhbmcsIGJpcyBlciBkZW4gbmFlY2h0ZW4gUHVua3QKKyAgLy8gZXJyZWljaHQuIERhbmFjaCBrYW5uIG1hbiBub2NoIGRlbiBDb2RlIGFuZ2ViZW4sIGRlciBiZWkKKyAgLy8gUXVlcnlBcnJpdmVkIHp1cnVlY2tnZWdlYmVuIHdpcmQsIHNldHplbi4gV2lyZCBrZWluIENvZGUKKyAgLy8gZ2VzZXR6dCwgd28gd2lyZCBkb3J0IGVpbiBMZWVyc3RyaW5nIHp1cnVlY2tnZWdlYmVuLiAwIHdpcmQKKyAgLy8gZGFubiB6dXJ1ZWNrZ2VnZWJlbiwgd2VubiBkZXIgVHJhbnNwb3J0ZXIgYW4ga2VpbmVtIFJhdW0gYW5nZWxlZ3QKKyAgLy8gaGF0LgorCisgIEFkZE1zZyggIkRpZSBXb2xrZSB0cmVpYnQgbnVuIGltIFdpbmQgUmljaHR1bmcgSm9mcyBBcmJlaXRzemltbWVyLlxuIiwgMzAgKTsKKyAgLy8gSGllciB3aXJkIGVpbmUgTWVsZHVuZyBhdXNnZWdlYmVuLCB1bmQgZGVyIFRyYW5zcG9ydGVyIHJlaXN0IDMwc2VrIGxhbmcKKyAgLy8gd2VpdGVyLgorCisgIEFkZE1zZyggIkRpZSBXb2xrZSBiZWdpbm50IHp1IHNpbmtlbi5cbiIsIDEwICk7CisgIEFkZFJvdXRlKCAicGxheWVycy9qb2Yvd29ya3Jvb20iLCAzMCwgMjAsICJKb2ZzIEFyYmVpdHN6aW1tZXIiICk7CisgIEFkZE1zZyggIkRpZSBXb2xrZSB0cmVpYnQgbnVuIGltIFdpbmQgUmljaHR1bmcgUnVtYXRhcyBBcmJpZXRzemltbWVyLlxuIiwgMzAgKTsKKyAgQWRkTXNnKCAiRGllIFdvbGtlIGJlZ2lubnQgenUgc2lua2VuLlxuIiwgMTAgKTsKKyAgLy8gTmFjaCBkZW0gTGV0enRlbiBIYWx0ZXB1bmt0IHdpcmQgZGVyIEt1cnMgd2llZGVyIHZvbiB2b3JuCisgIC8vIGJlZmFocmVuLgorIAkKKyAgU3RhcnQoKTsKKyAgLy8gTGFzc2UgZGVuIFRyYW5zcG9ydGVyIGFtIGVyc3RlbiBkaWVzZXIgSGFsdGVwdW5rdGUgc3RhcnRlbi4KK30KKworc3RlaWdlKHN0cikKK3sKKyAgc3RyaW5nIGFyZywgYXJnMjsKKyAgCisgIGlmIChzc2NhbmYoIHN0ciwgImF1ZiAlcyIsIGFyZyApID4gMCAmJiBpZChvbGRfZXhwbG9kZShhcmcsIiAiKVswXSkpCisgICAgcmV0dXJuIEVudGVyKCk7CisgIC8vIFdlbm4gc2ljaGVyIGlzdCwgZGFzcyBkZXIgU3BpZWxlciBkaWUgV29sa2UgQkVzdGVpZ2VuIHdpbGwsCisgIC8vIGthbm4gbWFuIG1pdCByZXR1cm4gRW50ZXIoKSBhbGxlIHdlaXRlcmVuIFRlc3RzIGR1cmNoZnVlaHJlbi4KKworICBpZiAoc3NjYW5mKCBzdHIsICJ2b24gJXMiLCBhcmcgKSA+IDAgJiYgaWQob2xkX2V4cGxvZGUoYXJnLCAiICIpWzBdKSkKKyAgICByZXR1cm4gTGVhdmUoKTsKKyAgLy8gRGFzIHNlbGJlIGdpbHQgZnVlciBkYXMgQUJzdGVpZ2VuIHVuZCBMZWF2ZSgpLgorICAvLyBWZXJiZW4gc29sbHRlbiBuYWNoIEVudGVyKCkgb2RlciBMZWF2ZSgpIGtlaW5lIHdlaXRlcmVuIEJlZmVobGUKKyAgLy8gZW50aGFsdGVuLgorfQorCisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B3YWZmZTEuYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9ic3B3YWZmZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTlhZTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2JzcHdhZmZlMS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqKiBFaW5lIEJlaXNwaWVsd2FmZmUKKyoqICh2b24gQm9pbmcpCisqLworCisvLyBEaWVzZSBQcmFnbWFzIHNvcmdlbiBkYWZ1ZXIsIGRhc3MgZGVyIERyaXZlciBkYXJhdWYgYWNodGV0LCBkYXNzIGJlaQorLy8gRnVua3Rpb25zYXJndW1lbnRlbiwgLVJ1ZWNrZ2FiZXdlcnRlbiB1bmQgdGVpbHdlaXNlIGJlaSBadXdlaXN1bmcgdm9uCisvLyBXZXJ0ZW4gYW4gVmFyaWFibGVuIGRlciByaWNodGlnZSBEYXRlbnR5cCB2ZXJ3ZW5kZXQgd2lyZCAoei5iLiBrZWluIHN0cmluZworLy8gYW5zdGVsbGUgZWluZXMgaW50IHZlcndlbmRldCB3aXJkKS4gU29sbHRlIGluIGtlaW5lbSBPYmpla3QgZmVobGVuLgorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKworaW5oZXJpdCAiL3N0ZC93ZWFwb24iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPiAgICAgLyogRGVmaW5pdGlvbiBkZXIgUHJvcGVydGllcyAqLworI2luY2x1ZGUgPGNvbWJhdC5oPiAgICAgICAgIC8qIERlZmluaXRpb24gZGVyIGthbXBmc3BlemlmaXNjaGVuIEtvbnN0YW50ZW4gKi8KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPiAgICAgICAvKiBEZWZpbml0aW9uIHZvbiBNQUxFLCBGRU1BTEUsIFdFUiwgLi4uICovCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7ICAgLyogV0lDSFRJRyEhISAqLworCisvKiBLdXJ6YmVzY2hyZWlidW5nIGZ1ZXIgRGFyc3RlbGx1bmcgaW4gaW52ZW50b3JpZXMgKi8KKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIEtudWVwcGVsIik7CisKKy8qIEJlc2NocmVpYnVuZyBkZXMgS251ZXBwZWxzICovCisgIFNldFByb3AoUF9MT05HLCAKKyAgIkRpZXNlciBLbnVlcHBlbCBpc3QgemllbWxpY2ggbm9ybWFsLCBlciBpc3QgYXVzIGZlc3RlbSBIb2x6IGdlZmVydGlndCB1bmRcbiIrCisJICAibWFuIGthbm4gaWhuIGFscyBXYWZmZSBiZW51dHplbi5cbiIpOworCisvKiBOYW1lIHVuZCBHZXNjaGxlY2h0IHNpbmQgd2ljaHRpZywgamVkZXMgT2JqZWt0IGJyYXVjaHQgZGFzICovCisgIFNldFByb3AoUF9OQU1FLCAiS251ZXBwZWwiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisKKy8qIEplZGVzIE9iamVrdCBicmF1Y2h0IGVpbmUgb2RlciBtZWhyZXJlIElkJ3MgKi8KKyAgQWRkSWQoImtudWVwcGVsIik7CisKKy8qIFdlcnQgdW5kIEdld2ljaHQgKi8KKyAgU2V0UHJvcChQX1ZBTFVFLCAzMDApOworICBTZXRQcm9wKFBfV0VJR0hULCAxMjUwKTsgICAvKiBpbiBHcmFtbSAqLworCisvKiBOdW4gZGllIHdpcmtsaWNoIFdhZmZlbnNwZXppZmlzY2hlbiBEaW5nZTogICAgICAgICAgICAgICAgICAgKi8KKy8qIFdhZmZlbi0gdW5kIFNjaGFkZW5zYXJ0ZW4gc2luZCBpbiAvc3lzL2NvbWJhdC5oIGRlZmluaWVydCAgICAqLworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0NMVUIpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX0JMVURHRU9OKTsKKworLyogRGllIFdhZmZlbmtsYXNzZSBtdXNzIGltIEJlcmVpY2ggendpc2NoZW4gMSB1bmQgMjAwIGxpZWdlbiAgICovCisgIFNldFByb3AoUF9XQywgMTI1KTsKKyAgCisvKiBBbnphaGwgZGVyIGJlbm9ldGlndGVuIEhhZW5kZSwgdW0gZGllIFdhZmZlIHp1IHp1ZWNrZW4uICAgICAgKi8KKy8qIFdhZmZlbiBtaXQgZWluZXIgV0MgZ3JvZXNzZXIgMTUwLCBzb2xsdGVuIGF1ZiBqZWRlbiBGYWxsICAgICAqLworLyogWndlaWhhZW5kZXIgc2VpbiwgYmVpIFNvbmRlcmZhZWxsZW4gYml0dGUgYW4gZGVuIEVyem1hZ2llciAgICovCisvKiBmdWVyIFdhZmZlbiB3ZW5kZW4uIFdlbm4gbmljaHRzIGdlc2V0enQgd2lyZCwgaXN0IGRpZSBXYWZmZSAgKi8KKy8qIGVpbiBad2VpaGFlbmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2Mva3JhbmtoZWl0LmMgYi9kb2MvYmVpc3BpZWxlL21pc2Mva3JhbmtoZWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4MTZhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvbWlzYy9rcmFua2hlaXQuYwpAQCAtMCwwICsxLDY2IEBACisvKiAgUGFyYWNlbHN1czogRWluZSBLcmFua2hlaXQKKyoqCisqKiAgICAgIEJlaXNwaWVsIGZ1ZXIgZGllIFZlcndlbmR1bmcgdm9uIFBfWF9BVFRSX01PRCB1bmQgUF9YX0hFQUxUSF9NT0QKKyoqCisqKiAgICAgIERpZXNlIEtyYW5raGVpdCBzZXR6dCBhbGxlIEF0dHJpYnV0ZSBoZXJhYiB1bmQgZXJuaWVkcmlndAorKiogICAgICB6dXNhZXR6bGljaCBQX01BWF9IUCB1bmQgUF9NQVhfU1AgdW0gamV3LiAyMCAoenVzYWV0emxpY2ggenUgZGVuCisqKiAgICAgIEF1c3dpcmt1bmdlbiBkZXIgQXR0cmlidXRzZW5rdW5nZW4pLgorKiogICAgICBHZXN0YXJ0ZXQgd2lyZCBkaWUgS3JhbmtoZWl0LCBpbmRlbSBzaWUgZWluZmFjaCBpbiBkYXMgT3BmZXIKKyoqICAgICAgYmV3ZWd0IHdpcmQuCisqKiAgICAgIE1hbiBiZWFjaHRlLCBkYXNzIGltIHJlbW92ZSgpIGRpZSBQX1hfKi1Qcm9wZXJ0aWVzIGVpbiBsZWVyZXMKKyoqICAgICAgTWFwcGluZyB6dWdld2llc2VuIGJla29tbWVuIHVuZCBrZWluZSAwLiBOdXIgc28gd2VyZGVuIGRpZQorKiogICAgICBLcmFua2hlaXRzZm9sZ2VuIHJ1ZWNrZ2FlbmdpZyBnZW1hY2h0LgorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y2xhc3MuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgLy8gYXVzbmFobXN3ZWlzZSBkYXJmIGRpZXNlcyBPYmpla3QgbWFsIGtlaW4gUF9TSE9SVCtQX0xPTkcgaGFiZW4uLi4KKyAgICBTZXRQcm9wKFBfU0hPUlQsMCk7CisgICAgU2V0UHJvcChQX0xPTkcsIDApOworICAgIFNldFByb3AoUF9JTlZJUywgMSk7IC8vIHVuc2ljaHRiYXIgbWFjaGVuLgorICAgIFNldFByb3AoUF9OQU1FLCJLcmFua2hlaXQiKTsKKyAgICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgICAgLy8gd2ljaHRpZywgc29uc3Qgd2llZ3QgZGllIEtyYW5raGVpdCAxa2cgKFN0YW5kYXJkZ2V3aWNodCBmdWVyIHRoaW5nKSAKKyAgICBTZXRQcm9wKFBfV0VJR0hULDApOworICAgIFNldFByb3AoUF9WQUxVRSwwKTsKKyAgICBTZXRQcm9wKFBfTUFURVJJQUwsTUFUX01JU0NfTUFHSUMpOworICAgIFNldFByb3AoUF9OT0RST1AsMSk7IC8vIE5pY2h0IHdlZ3dlcmZiYXIuCisKKy8vIC0tLS0+IERpZXNlciBBYnNjaG5pdHQgc29yZ3QgZnVlciBmaWVzZSBTdGF0YWJ6dWVnZQorCisgICAgU2V0UHJvcChQX1hfSEVBTFRIX01PRCwKKyAgICAoWworICAgICAgICBQX0hQIDogLTIwLCAgIC8vIE1heC4gTGViZW5zcHVua3RlIHVtIDIwIHJ1bnRlcgorICAgICAgICBQX1NQIDogLTIwICAgIC8vIE1heC4gS29uemVudHJhdGlvbnNwdW5rdGUgdW0gMjAgcnVudGVyCisgICAgXSkgKTsKKyAgICBTZXRQcm9wKFBfWF9BVFRSX01PRCwKKyAgICAoWworICAgICAgICBBX0NPTiA6IC0xLCAgIC8vIEF1c2RhdWVyIHVtIDEgcnVudGVyLCByZWR1emllcnQgYXVjaCBtYXguIExQIQorICAgICAgICBBX0RFWCA6IC0xLCAgIC8vIEdlc2NoaWNrbGljaGtlaXQgdW0gMSBydW50ZXIKKyAgICAgICAgQV9JTlQgOiAtMiwgICAvLyBJbnRlbGxpZ2VueiB1bSAyIHJ1bnRlciwgcmVkdXppZXJ0IGF1Y2ggbWF4LiBLUCEKKyAgICAgICAgQV9TVFIgOiAtNCwgICAvLyBTdGFlcmtlIHVtIDQgcnVudGVyCisgICAgXSkgKTsKKworLy8gPC0tLS0KKworICAgIEFkZElkKCAoeyJQQVJBXG5TSUNLXG5FWEFNUExFIn0pICk7CisKKyAgICBBZGRDbGFzcyhDTF9ESVNFQVNFKTsgLy8gRGFtaXQgS2xlcmlrZXIgaGVsZmVuIGtvZW5uZW4uCisgICAgU2V0UHJvcChQX0xFVkVMLDE1KTsgIC8vIEFiZXIgbmljaHQgZ2FueiBzbyBlaW5mYWNoIHp1IGVudGZlcm5lbgorfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2MvbGViZW5zcmluZy5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL2xlYmVuc3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJlYTVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9taXNjL2xlYmVuc3JpbmcuYwpAQCAtMCwwICsxLDU2IEBACisvKiBQYXJhY2Vsc3VzOiBMZWJlbnNyaW5nCisqKgorKiogICAgRWluIEJlaXNwaWVsIGZ1ZXIgZGllIEFud2VuZHVuZyB2b24gUF9NX0hFQUxUSF9NT0QKKyoqCisqKiAgICBaaWVodCBlaW4gU3BpZWxlciBkaWVzZW4gUmluZyBhbiwgc28gZXJob2VoZW4gc2ljaCBzZWluZSBtYXhpbWFsZW4KKyoqICAgIExlYmVuc3B1bmt0ZSBkYWJlaSB1bSAxMCwgd2FlaHJlbmQgc2VpbmUgbWF4LiBLb256ZW50cmF0aW9uc3B1bmt0ZQorKiogICAgdW0gNSBlcm5pZWRyaWd0IHdlcmRlbi4KKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworCitpbmhlcml0ICIvc3RkL2FybW91ciI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YXJtb3VyLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1NIT1JULCJFaW4gTGViZW5zcmluZyIpOworICAgIFNldFByb3AoUF9MT05HLAorICAgICAgICAiRWluIGtsZWluZXIgUmluZyBhdXMgZWluZW0gc2VsdHNhbWVuLCBncnVlbmVuIE1hdGVyaWFsLlxuIik7CisgICAgU2V0UHJvcChQX0lORk8sCisgICAgICAgICJEaWVzZXIgUmluZyB1bnRlcnN0dWV0enQgZGllIEdlc3VuZGhlaXQuXG4iKworICAgICAgICAiRGFiZWkgc2Nod2FlY2h0IGVyIGxlaWRlciBkZW4gR2Vpc3QuXG4iKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiTGViZW5zcmluZyIpOworICAgIFNldFByb3AoUF9HRU5ERVIsTUFMRSk7CisgICAgU2V0UHJvcChQX1dFSUdIVCw4MCk7CisgICAgU2V0UHJvcChQX1ZBTFVFLDIwMDArcmFuZG9tKDUwMSkpOworICAgIFNldFByb3AoUF9BUk1PVVJfVFlQRSxBVF9SSU5HKTsKKyAgICBTZXRQcm9wKFBfQUMsMCk7IC8vIGtlaW5lIFNjaHV0endpcmt1bmcgaW0gS2FtcGYKKyAgICBTZXRQcm9wKFBfTUFURVJJQUwsTUFUX01JU0NfTUFHSUMpOworCisvLyAtLS0tPgorCisgICAgU2V0UHJvcChQX01fSEVBTFRIX01PRCwKKyAgICAoWworICAgICAgICBQX0hQIDogMTAsICAgICAgLy8gTWF4LiBMUCB1bSAxMCBlcmhvZWhlbgorICAgICAgICBQX1NQIDogLTUgICAgICAgLy8gTWF4LiBLUCB1bSA1IHZlcnJpbmdlcm4KKyAgICBdKSApOworCisvLyA8LS0tLQorCisgICAgQWRkSWQoICh7InJpbmciLCJsZWJlbnNyaW5nIn0pICk7CisKKyAgICBBZGREZXRhaWwoICJtYXRlcmlhbCIsCisgICAgICAgICJFcyBpc3QgZ3J1ZW4uXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jIGIvZG9jL2JlaXNwaWVsZS9taXNjL3NlaGVyaGF1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTI3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21pc2Mvc2VoZXJoYXVzLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCitLdXJ6ZSBVZWJlcnNpY2h0IGRlciBUZXJtaW5pOgorCitQX0hBVVNfRVJMQVVCVCAgICAgUHJvcGVydGllLCBkaWUgZGFzIEJhdWVuIGVpbmVzIEhhdXNlcyBpbSBSYXVtIGVyLQorICAgICAgICAgICAgICAgICAgIGxhdWJ0IG9kZXIgdmVyYmlldGV0LiBEZWZhdWx0IGF1ZiAwCisgICAgICAgICAgICAgICAgICAgU3ludGF4OiB4Y2FsbCAkaC0+U2V0UHJvcChQX0hBVVNfRVJMQVVCVCx4KQorICAgICAgICAgICAgICAgICAgIAorU2F2ZSgpICAgICAgICAgICAgIE11c3MgbmFjaCBBZW5kZXJ1bmdlbiBhbSBIYXVzIGF1ZmdlcnVmZW4gd2VyZGVuLgorICAgICAgICAgICAgICAgICAgIFN5bnRheDogeGNhbGwgL2Qvc2VoZXIvaGFldXNlci90aWxseWhhdXMtPlNhdmUoKQorCitPa2F5LCBhbHNvIGVpbiBTZWhlciBtb2VjaHRlLCBkYXNzIHNlaW4gSGF1cyAxKSB1bnNpY2h0YmFyIGlzdCwgMikgbWl0CitlaW5lbSBhbmRlcmVuIEtvbW1hbmRvIGJldHJldGVuIHdlcmRlbiBzb2xsIHVuZCAzKSBuaWNodCBhdWYgZGllIGlkIAorPGhhdXM+IGhvZXJ0IHNvbmRlcm4gYXVmIGVpbmUgYW5kZXJlOgorCitadSAxKTogR2FueiBlaW5mYWNoLCBtYW4gdGlwcGUgCisKKyAgICAgICAneGNhbGwgL2Qvc2VoZXIvaGFldXNlci90aWxseWhhdXMtPlNldFByb3AoUF9TSE9SVCwwKScgdW5kCisgICAgICAgJ3hjYWxsIC9kL3NlaGVyL2hhZXVzZXIvdGlsbHloYXVzLT5TYXZlKCknCisKK1p1IDIpIHVuZCAzKTogRGFzIGlzdCBuaWNodCBzbyBlaW5mYWNoLCBzb25kZXJuIG11c3MgdWViZXIgZGVuIFJhdW0sIGluIAorICAgICAgICAgICAgICBkZW0gZGFzIEhhdXMgc3RlaHQsIGdlbWFjaHQgd2VyZGVuLiBEZXN3ZWdlbiBmb2xnZW5kIG51biAKKyAgICAgICAgICAgICAgZWluIEJlaXNwaWVsIHp1IEZ1bmt0aW9uZW4gaW4gc28gZWluZW0gUmF1bS4KKworCitGb2xnZW5kZSBEaW5nZSBzdGVoZW4gbmF0dWVybGljaCBzY2hvbiBpbSBSYXVtLCBzb25zdCBsaWVzc2UgZXIgc2ljaAorbmljaHQgbGFkZW4gOi0pICAgICAgICAgICAgICAKKyovCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworLyoKKyAgIEZ1ZXIgcHJvcGVydGllcyB1bmQgc29uc3RpZ2UgRGVmaW5pdGlvbmVuIHp1bSBTZWhlcmhhdXMuCisqLworI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvaGF1cy5oIgorCisvKgorICAgQXVzIEdydWVuZGVuIGRlciBVZWJlcnNpY2h0bGljaGtlaXQgemllaGVuIHZpZWxlIE1hZ2llciB2b3IsIGRlbiBIYXVza3JhbXMKKyAgIGluIGVpbmUgc2VwYXJhdGUgRnVua3Rpb24genVzYW1tZW56dWZhc3Nlbi4KKyovCitwcml2YXRlIHZvaWQgaGF1c19jcmVhdGUoKTsKKworLyoKK0VzIGZvbGd0IG51biBkYXMgbm9ybWFsZSBjcmVhdGUoKSBlaW5lcyBSYXVtZXMKKyovCit2b2lkIGNyZWF0ZSgpeworICA6OmNyZWF0ZSgpOworICAvKiAuLi4gZGl2LiBLb25maWd1cmF0aW9uIGRlcyBSYXVtIC4uLiAqLworCisgIC8qCisgIERhcyBleHRyYS1jcmVhdGUoKSBtdXNzIG5hdHVlcmxpY2ggYXVmZ2VydWZlbiB3ZXJkZW4KKyAgKi8gIAorICBoYXVzX2NyZWF0ZSgpOworfSAgICAgIAorCisvKgorSGllciBrb21tZW4gd2lyIG51biB6dSBkZXIgRmt0LCBkaWUgYWxsZXMgYW0gU2VoZXJoYXVzIHZlcndhbHRldAorKi8KK3ByaXZhdGUgdm9pZCBoYXVzX2NyZWF0ZSgpCit7CisgIG9iamVjdCBvYiA9IGZpbmRfb2JqZWN0KEhBVVNOQU1FKCJ0aWxseSIpKTsgLy8gZmluZGV0IEhhdXMgdm9uIFRpbGx5CisKKyAgLyoKKyAgV2VubiBkYXMgSGF1cyBpbSBSYXVtIHN0ZWh0LiBIYXQgZGVuIFZvcnRlaWwsIGRhc3MgYmVpIGVpbmVtIFZlcmxlZ2VuCisgIGRlcyBIYXVzZXMsIENtZCdzIHVzdyBuaWNodCBtZWhyIHZlcmZ1ZWdiYXIgc2luZCAtPiBLZWluZSBldnRsIEJ1Z3MgOikKKyAgKi8KKyAgaWYob2JqZWN0cChvYikpCisgIHsKKyAgICAvKgorICAgIERlciBTcGllbGVyIHdvbGx0ZSBlcyBqYSBuaWNodCBhbmRlcnMKKyAgICAqLworICAgIG9iLT5SZW1vdmVDbWQoKHsiYmV0cmV0IiwiYmV0cml0dCIsImJldHJldGUifSkpOworICAgIG9iLT5SZW1vdmVJZCgiaGF1cyIpOworICAgIG9iLT5SZW1vdmVJZCgiaGF1cyB2b24gdGlsbHkiKTsKKyAgICBvYi0+QWRkSWQoInN0ZWluaGF1ZmVuIik7CisgICAgCisgICAgQWRkRGV0YWlsKCh7ImhhdWZlbiIsInN0ZWluaGF1ZmVuIn0pLCJEYSBpc3QgZG9jaCBlaW4ga2xlaW5lciBTcGFsdD8gIgorICAgICArIlZpZWxsZWljaHQga2FubnN0IER1IGF1ZiBkZW4gU3RlaW5oYXVmZW4ga2xldHRlcm4/XG4iKTsKKworICAgIEFkZENtZCgoeyJrbGV0dGVyIiwia2xldHRlcmUifSksImtsZXR0ZXJfY21kIik7CisgIH0KK30KKworcHVibGljIGludCBrbGV0dGVyX2NtZChzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2IgPSBmaW5kX29iamVjdChIQVVTTkFNRSgidGlsbHkiKSk7CisKKyAgX25vdGlmeV9mYWlsKCJXbyBtb2VjaHRlc3QgRHUgaGlua2xldHRlcm4/XG4iKTsKKworICBpZighc3RyKSByZXR1cm4gMDsKKworICBpZihzdHI9PSJhdWYgaGF1ZmVuIiB8fCBzdHI9PSJhdWYgc3RlaW5oYXVmZW4iKQorICB7CisgICAgaWYob2JqZWN0cChvYikpCisgICAgeworICAgICAgLyoKKyAgICAgIERhcyBpc3QgZGllIE1lbGR1bmcsIGRpZSBlaW4gU3BpZWxlciBiZWtvbW10LCB3ZW5uIGRhcyBTZWhlcmhhdXMKKyAgICAgIGFiZ2VzY2hsb3NzZW4gaXN0IHVuZCBlciB2ZXJzdWNodCwgZXMgenUgJ2JldHJldGVuJy4KKyAgICAgICovCisgICAgICBub3RpZnlfZmFpbCgiRHUga2xldHRlcnN0IGF1ZiBkZW4gSGF1ZmVuLCBkb2NoIGRlciBTcGFsdCBpc3QgenUgIgorICAgICAgICJzY2htYWwgZnVlciBEaWNoLlxuIik7CisgICAgICAgCisgICAgICBpZighKG9iLT5RdWVyeVByb3AoSF9ET09SU1RBVCkgJiBEX0NMT1NFRCkpCisgICAgICB7CisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksCisgICAgICAgICAgICAiRHUga2xldHRlcnN0IGF1ZiBkZW4gU3RlaW5oYXVmZW4sIHJ1dHNjaHN0IGRlbiBTcGFsdCBydW50ZXIgIgorICAgICAgICAgICAgICJ1bmQgZmluZGVzdCBEaWNoIHVycGxvZXR6bGljaCBpbiBlaW5lciBzY2h1bW1yaWdlbiBIb2VobGUuXG4iKTsKKyAgICAgICAgdGVsbF9yb29tKHRoaXNfb2JqZWN0KCksdGhpc19wbGF5ZXIoKS0+bmFtZSgpKyIga2xldHRlcnQgYXVmIGVpbmVuICIKKyAgICAgICAgICAiU3RlaW5oYXVmZW4gdW5kIGlzdCBwbG9ldHpsaWNoIHZlcnNjaHd1bmRlbi4iLCh7dGhpc19wbGF5ZXIoKX0pKTsKKyAgICAgICAgdGVsbF9yb29tKFJBVU1OQU1FKCJ0aWxseSIsMCksdGhpc19wbGF5ZXIoKS0+bmFtZSgpKworICAgICAgICAgICIgZmFlbGx0IGZsdWNoZW5kIGhlcmVpbi5cbiIpOworICAgICAgICB0aGlzX3BsYXllcigpLT5tb3ZlKFJBVU1OQU1FKCJ0aWxseSIsMCksTV9HT3xNX1NJTEVOVCwwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorICAKKy8qCitOYXR1ZXJsaWNoIGdpYnQgZXMgbm9jaCB2aWVsIG1laHIgTW9lZ2xpY2hrZWl0ZW4gcnVuZCB1bSBTZWhlcmhhZXVzZXIsIAorZG9jaCBzb2xsdGUgZGllcyBlcnN0bWFsIHJlaWNoZW4uIFp1IGJlYWNodGVuIGlzdCBiZWkgc29sY2hlciBWb3JnZWhlbnMtCit3ZWlzZSwgZGFzcyBlaW4gJ3NjaGxpZXNzZXxvZWZmbmUgaGF1cycgZXZ0bCB6dSBGZWhsZXJtZWxkdW5nZW4gZnVlaHJ0LgorRGVtIFNwaWVsZXIgc2VpIG5haGVnZWxlZ3QsIGVzIGRvY2ggbWl0ICdvZWZmbmUgaGF1c3R1ZXInIHp1IHZlcnN1Y2hlbi4KKworSEFVU05BTUUgdW5kIFJBVU1OQU1FICh1LmEuKSBzaW5kIERlZmluZXMgYXVzIGRlbSBoYXVzLmguIE1hbiBzb2xsdGUgc2ljaAorZGllc2VzIEZpbGUgYW5zY2hhdWVuIHVuZCBkaWUgZG9ydGlnZW4gRGVmaW5lcyB1ZWJlcm5laG1lbi4gRGFubiBidWd0IGF1Y2ggCituaWNodHMsIGZhbGxzIG1hbCBldHdhcyBhbiBkZW4gSGFldXNlcm4gdW1nZXN0ZWxsdCB3aXJkLgorCitUaWxseSwgMjAuIE1haSAyMDAxLCAwMDoxMDoyNGgKKyovCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL21pc2Mvc3RhdGtyYWxsZW4uYyBiL2RvYy9iZWlzcGllbGUvbWlzYy9zdGF0a3JhbGxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWU0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL21pc2Mvc3RhdGtyYWxsZW4uYwpAQCAtMCwwICsxLDYxIEBACisvKiBQYXJhY2Vsc3VzOiBTdGF0a3JhbGxlbgorKioKKyoqICAgICBCZWlzcGllbCBmdWVyIGRpZSBWZXJ3ZW5kdW5nIHZvbiBQX01fQVRUUl9NT0QKKyoqCisqKiAgICAgWmllaHQgZWluIFNwaWVsZXIgZGllc2UgS3JhbGxlbiBhbiwgc28gZXJob2VodCBzaWNoIHNlaW5lIFN0YWVya2UKKyoqICAgICB1bSAyLiBHbGVpY2h6ZWl0aWcgd2lyZCBkYXMgRXJob2VoZW4gc2VpbmVyIEdlc2NoaWNrbGljaGtlaXQgZHVyY2gKKyoqICAgICBhbmRlcmUgUnVlc3R1bmdlbi9XYWZmZW4gYmxvY2tpZXJ0LiAKKyoqICAgICBEaWUgS3JhbGxlbiBrb2VubmVuIG51ciBhbmdlem9nZW4gd2VyZGVuLCB3ZW5uIHdlZGVyIEFfU1RSIG5vY2gKKyoqICAgICBBX0RFWCBkdXJjaCBlaW5lIGFuZGVyZSBSdWVzdHVuZy9XYWZmZSBibG9ja2llcnQgd2lyZC4KKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKK2luaGVyaXQgIi9zdGQvYXJtb3VyIjsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX1NIT1JULCJTdGF0a3JhbGxlbiIpOworICAgIFNldFByb3AoUF9MT05HLAorICAgICAgICAiRGllc2Uga3JhbGxlbmJld2VocnRlbiBIYW5kc2NodWhlIHNjaGltbWVybiBibGFldWxpY2guXG4iKTsKKyAgICBTZXRQcm9wKFBfTkFNRSwiU3RhdGtyYWxsZW4iKTsKKyAgICBTZXRQcm9wKFBfSU5GTywiRGllIEtyYWxsZW4gbWFjaGVuIHN0YWVya2VyLlxuIik7CisgICAgU2V0UHJvcChQX0dFTkRFUixGRU1BTEUpOworICAgIFNldFByb3AoUF9OT0JVWSwxKTsgLy8gd2lyZCBiZWkgVmVya2F1ZiBpbSBsYWRlbiB6ZXJzdG9lcnQuCisgICAgU2V0UHJvcChQX1dFSUdIVCw4MDApOworICAgIFNldFByb3AoUF9WQUxVRSw1MDAwK3JhbmRvbSgyMDAwKSk7CisgICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLEFUX0dMT1ZFKTsKKyAgICBTZXRQcm9wKFBfQUMsMik7CisgICAgU2V0UHJvcChQX0VGRkVDVElWRV9XQywxNSk7CisgICAgU2V0UHJvcChQX01BVEVSSUFMLAorICAgIChbCisgICAgICAgIE1BVF9MRUFUSEVSICAgIDogNjAsCisgICAgICAgIE1BVF9NSVNDX01FVEFMIDogNDAKKyAgICBdKSApOworCisvLyAtLS0tPgorCisgICAgU2V0UHJvcChQX01fQVRUUl9NT0QsCisgICAgKFsKKyAgICAgICAgQV9TVFIgOiAyLCAgLy8gU3RhZXJrZSB1bSAyIGVyaG9laGVuCisgICAgICAgIEFfREVYIDogMCAgIC8vIEdlc2NoaWNrbGljaGtlaXQgYmxvY2tpZXJlbgorICAgIF0pICk7CisKKy8vIDwtLS0tCisKKyAgICBBZGRJZCggKHsiaGFuZHNjaHVoZSIsImtyYWxsZW4ifSkgKTsKKworICAgIEFkZERldGFpbCggInNjaGltbWVyIiwKKyAgICAgICAgIkVpbiBibGFldWxpY2hlciBTY2hpbW1lciBsaWVndCBhdWYgZGVuIEtyYWxsZW4uXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9wcmVjb21waWxlci9rb25zdGFudGVuLmMgYi9kb2MvYmVpc3BpZWxlL3ByZWNvbXBpbGVyL2tvbnN0YW50ZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdkMWEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9wcmVjb21waWxlci9rb25zdGFudGVuLmMKQEAgLTAsMCArMSw1MCBAQAorLy8gTWl0IGRlbSBQcmFlY29tcGlsZXIgbGFzc2VuIHNpY2ggc3ltYm9saXNjaGUgS29uc3RhbnRlbiBkZWZpbmllcmVuLiBEaWVzCisvLyB6LkIuIHNpbm52b2xsLCB3ZW5uIGVpbmUgWmFobCBlaW5lIGJlc3RpbW10ZSBCZWRldXR1bmcgaGF0LiBaLmIuIGhhdCBkaWUKKy8vIFphaGwgNDIgYW4gc2ljaCBrZWluZSBmaXhlIEJlZGV1dHVuZywgaGllciBpc3QgZGllIGplZG9jaCBkaWUgQW50d29ydCEKKyNkZWZpbmUgQU5UV09SVCA0MgorLy8gU2NocmVpYnQgbWFuIG51biBpcmdlbmR3byBpbSBDb2RlIEFOVFdPUlQsIGVyc2V0enQgZGVyIFByYWVjb21waWxlciBqZWRlcworLy8gVm9ya29tbWVuIHZvbiBBTlRXT1JUIGR1cmNoIDQyLgorCisvLyBhdWNoIGtvbXBsZXhlcmUgS29uc3RhbnRlbiBzaW5kIG1vZWdsaWNoLCB6LkIuIGVpbiBBcmd1bWVudCBlaW5lcyBEZWZpbmVzOgorI2RlZmluZSBST09NKHgpICgiL2QvZWJlbmUvemVzc3RyYS9hZHZlbnQvcm9vbS8iK3gpCisvLyBEaWVzIGRpZW50IG1laXN0LCB1bSBzaWNoIFNjaHJlaWJhcmJlaXQgenUgc3BhcmVuLiBGb3JtdWxpZXJ0IG1hbiBuYWNoCisvLyBkaWVzZW0gI2RlZmluZSBlaW4gUk9PTSgid2VnMSIpLCBlcnpldWd0IGRlciBQcmFlY29tcGlsZXIgaGllcmF1czoKKy8vICgiL2QvZWJlbmUvemVzc3RyYS9hZHZlbnQvcm9vbS93ZWcxIikKKworLy8gV2VpdGVyZXMgQmVpc3BpZWw6CisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZyh4LCA3OCkKKy8vIGVyemV1Z3QgYWxzbyBhdXMgQlMoImxhbmdlciB0ZXh0IikgZWluIGJyZWFrX3N0cmluZygibGFuZ2VyIHRleHQiLDc4KQorCisvLyBFcyBnZWhlbiBhdWNoIG1laHJlcmUgQXJndW1lbnRlOgorI2RlZmluZSBCUyh4LHkpIGJyZWFrX3N0cmluZyh4LCA3OCwgeSkKKy8vIEJTKCJsYW5nZXIgdGV4dCIsIDc4LCAiWmVzc3RyYSBzYWd0OiAiKQorLy8gICAtPiBicmVha19zdHJpbmcoImxhbmdlciB0ZXh0IiwgNzgsICJaZXNzdHJhIHNhZ3Q6ICIpCisKKy8vIFNvbGNoZSBEZWZpbmVzIGxhc3NlbiBzaWNoIHNjaGFjaHRlbG46CisjZGVmaW5lIEhPTUUoeCkgKCIvZC9lYmVuZS96ZXNzdHJhL2FkdmVudC8iK3gpCisjZGVmaW5lIFJPT00oeCkgKEhPTUUoInJvb20vIit4KSkKKy8vIEVpbiBST09NKCJ3ZWcxIikgd2lyZCBudW4gZHVyY2ggKEhPTUUoInJvb20vIisid2VnMSIpKSBlcnNldHp0CisvLyB1bmQgZGllc2VzIHdpZWRlcnVtIGR1cmNoIGVpbiAKKy8vICgoIi9kL2ViZW5lL3plc3N0cmEvYWR2ZW50LyIrInJvb20vIisid2VnMSIpKSwgd2FzIGxldHp0ZW5kbGljaCBlaW4KKy8vICgoIi9kL2ViZW5lL3plc3N0cmEvYWR2ZW50L3Jvb20vd2VnMSIpKSBpc3QuCisKKy8vIExldHp0ZXJlcyB3aXJkIGhhZXVmaWcgYmVudXR6dCBiZWkgZGVyIEVyc3RlbGx1bmcgdm9uIEdlYmlldGVuIHVtIHNpY2ggYmVpCisvLyBVbXp1ZWdlbiBBcmJlaXQgenUgc3BhcmVuOiB6aWVodCBkYXMgR2ViaWV0IHVtICh6LkIuIHZvbiAvcGxheWVycy96ZXNzdHJhLworLy8gbmFjaCAvZC9lYmVuZS96ZXNzdHJhL2FkdmVudC8sIHJlaWNodCBlcyBhdXMsIEhPTUUgenUgYWVuZGVybiB1bmQgbWFuIG11c3MKKy8vIG5pY2h0IDE1MG1hbCBkZW4ga29tcGxldHRlbiBQZmFkIGltIENvZGUgYWVuZGVybi4KKworLy8gbW9lY2h0ZSBtYW4gZWluIERlZmluZSB1ZWJlciBtZWhyZXJlIFplaWxlbiBkZWZpbmllcmVuLCBtdXNzIGRlcgorLy8gWmVpbGVudW1icnVjaCBtaXQgZWluZW0gXCBlc2NhcGVkICB3ZXJkZW46CisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiYmxhIixcCisgICAgIkRpZXMgaXN0IGVpbiBsYWVuZ2VyZXIgVGV4dC5cbiIpCisvLyBXSUNIVElHOiBIaW50ZXIgZGVtIFwgZGFyZiBLRUlOIExlZXJ6ZWljaGVuLCBUYWIgby5hZS4gc3RlaGVuIQorCisvLyBUaXBzOgorLy8gKiBEYW1pdCBtYW4gRGVmaW5lcyBzY2huZWxsIGFscyBzb2xjaGUgZXJrZW5udCwgc29sbHRlbiBhbGxlIERlZmluZXMKKy8vICAgZ3Jvc3NnZXNjaHJpZWJlbiB3ZXJkZW46IHouQi4gUEwgdnMuIHBsCisvLyAqIHZvbiBrb21wbGV4ZW4gRGVmaW5lcyB3aXJkIGFiZ2VyYXRlbiwgd2VpbCBzaWUgc2NobmVsbCBVZWJlcnNpY2h0IAorLy8gICB1bmQgRWZmaXppZW56IHJ1aW5pZXJlbiBrb2VubmVuCisvLyAqIGVpbmlnZSBoYWV1ZmlnIGJlbnV0enRlIERlZmluZXMgZmluZGVuIHNpY2ggaW4gPGRlZmluZXMuaD4KKy8vICogZGVyIERyaXZlciBkZWZpbmllcnQgYmVzdGltbXRlIERlZmluZXMgYXV0b21hdGlzY2guIEVpbmUgTGlzdGUKKy8vICAgZmluZGV0IHNpY2ggaW4gL2RvYy9kcml2ZXIvcHJlZGVmaW5lZAorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS8ucmVhZG1lIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvLnJlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNlZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvLnJlYWRtZQpAQCAtMCwwICsxLDMgQEAKK0RyZWkgQmVpc3BpZWxtb25zdGVyLCBkaWUgd2ljaHRpZ2UgQmFzaXNlaWdlbnNjaGFmdGVuIHZvbiBOUENzIHNvd2llCitkaWUgVmVyZXJidW5nIGRlbW9uc3RyaWVyZW4uIEFuZ2VsZWhudCBhbiBic3Btb24xLmMgdm9uIEJvaW5nLgorKFplc3N0cmEpCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpci5jIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQ2NGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXIuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAgIEVpbiBCZWlzcGllbC1OUEMgKHZvbiBaZXNzdHJhLCBhbmdlbGVobnQgYW4gQm9pbmdzIGJzcG1vbjEuYykKKyovCisKKy8vIERpZXNlIFByYWdtYXMgc29yZ2VuIGRhZnVlciwgZGFzcyBkZXIgRHJpdmVyIGRhcmF1ZiBhY2h0ZXQsIGRhc3MgYmVpCisvLyBGdW5rdGlvbnNhcmd1bWVudGVuLCAtUnVlY2tnYWJld2VydGVuIHVuZCB0ZWlsd2Vpc2UgYmVpIFp1d2Vpc3VuZyB2b24KKy8vIFdlcnRlbiBhbiBWYXJpYWJsZW4gZGVyIHJpY2h0aWdlIERhdGVudHlwIHZlcndlbmRldCB3aXJkICh6LmIuIGtlaW4gc3RyaW5nCisvLyBhbnN0ZWxsZSBlaW5lcyBpbnQgdmVyd2VuZGV0IHdpcmQpLiBTb2xsdGUgaW4ga2VpbmVtIE9iamVrdCBmZWhsZW4uCisjcHJhZ21hIHN0cm9uZ190eXBlcywgc2F2ZV90eXBlcywgcnR0X2NoZWNrcworLy8gRWluaWdlIFdhcm51bmdlbiB3ZXJkZW4gYWxzIEZlaGxlciBiZXRyYWNodGV0IChlbXBmb2hsZW4pCisjcHJhZ21hIHBlZGFudGljLCByYW5nZV9jaGVjaworLy8gU2NoYWx0ZXQgYmVzdGltbXRlIFdhcm51bmdlbiBlaW4gKGVtcGZvaGxlbikKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkLCB3YXJuX2VtcHR5X2Nhc3RzLCB3YXJuX21pc3NpbmdfcmV0dXJuCisjcHJhZ21hIHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEVyYnQgZGVuIFN0YW5kYXJkLU5QQyAvIGRhcyBTdGFuZGFyZC1Nb25zdGVyCitpbmhlcml0ICIvc3RkL25wYyI7CisKKy8vIElua2x1ZGllcnQgRGVmaW5pdGlvbmVuIGZ1ZXIgUHJvcGVydGllcyB1bmQgZWluaWdlIEtvbnN0YW50ZW4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjbGFzcy5oPiAvLyBLb25zdGFudGVuIGZ1ZXIgQWRkQ2xhc3MoKQorCisvLyBjcmVhdGUoKSB3aXJkIGJlaW0gRXJ6ZXVnZW4gZGVzIE9iamVrdCB2b20gRHJpdmVyIGdlcnVmZW4gdW5kIGluaXRpYWxpc2llcnQKKy8vIGRpZXNlbiBOUEMuIEVzIGJla29tbXQga2VpbiBBcmd1bWVudCwgZ2lidCBrZWluZW4gV2VydCB6dXJ1ZWNrIChUeXA6IHZvaWQpCisvLyB1bmQga2FubiBuaWNodCB2b24gYXVzc2VyaGFsYiBkZXMgT2JqZWt0ZXMgZ2VydWZlbiB3ZXJkZW4gKHByb3RlY3RlZCkuCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzLiBGdWVocnQgZGFzIGNyZWF0ZSgpIGRlcyBnZWVyYnRlbgorICAvLyAvc3RkL25wYyBhdXMgdW5kIGluaXRpYWxpc2llcnQgZGVuIFN0YW5kYXJkLU5QQy4KKyAgOjpjcmVhdGUoKTsKKworLyogRGllIEt1cnpiZXNjaHJlaWJ1bmcgd2lyZCB6dW0gQmVpc3BpZWwgYW5nZXplaWd0IHdlbm4gbWFuIGluIGVpbmVuIFJhdW0KKyAgIG1pdCBkZW0gTW9uc3RlciByZWlubGFldWZ0ICovCisgIFNldFByb3AoUF9TSE9SVCwgIlJvdGF1Z2VudmFtcGlyIik7CisKKy8qIEJlaW0gQW5zY2hhdWVuIGRlcyBNb25zdGVycyB3aXJkIGRpZSBsb25nLWRlc2NyaXB0aW9uIGFuZ2V6ZWlndCwKKyAqIFplaWxlbnVtYnJ1Y2ggbmFjaCBCZWRhcmYgbmFjaCA3OCBaZWljaGVuLiAqLworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW4gZmluc3RlciBhdXNzZWhlbmRlciBSb3RhdWdlbnZhbXBpci4iLDc4KSk7CisKKy8qIEVpbiBOYW1lIG11c3Mgc2VpbiwgZGEgc29uc3Qgei5CLiBpbSBUb2Rlc2ZhbGwgJ0xlaWNoZSB2b24gMCcgZGFsaWVndCAqLworICBTZXRQcm9wKFBfTkFNRSwgIlJvdGF1Z2VudmFtcGlyIik7CisgIFNldFByb3AoUF9OQU1FX0FESiwiYXVzZ2VtZXJnZWx0Iik7CisgIAorLyogRGFzIEdlc2NobGVjaHQgZGVzIE1vbnN0ZXJzLiBBbHMgR2VzY2hsZWNodGVyIHNpbmQgKi8KKy8qIGRpZSBpbiA8bGFuZ3VhZ2UuaD4gZGVmaW5pZXJ0ZW4gU3ltYm9sZSBORVVURVIsIE1BTEUgICAqLworLyogdW5kIEZFTUFMRSB6dWxhZXNzaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworCisvKiBFaW4gTW9uc3RlciBicmF1Y2h0IG1pbmRlc3RlbnMgZWluZSBJRCwgdW50ZXIgZGVyIG1hbiBlcyBhbnNwcmVjaGVuIGthbm4gKi8KKy8qIEVzIGthbm4gYWJlciBhdWNoIG1laHJlcmUgdmVyc2NoaWVkZW5lIElEJ3MgaGFiZW4uICAgICAgICAgICAgICAgICAgICAgICAqLworICBBZGRJZCggKHsidmFtcGlyIiwicm90YXVnZW52YW1waXIifSkgKTsKKworLyogWnVlcnN0IHNvbGx0ZSBtYW4gZGVtIE1vbnN0ZXIgZWluZW4gR3J1bmRsZXZlbCBnZWJlbi4gKi8KKy8qIFNldHp0IFN0YW5kYXJkd2VydGUgZnVlciBQX0xFVkVMLCBQX01BWF9IUCAoTGViZW5zcHVua3RlKSwgUF9NQVhfU1AKKyAqIChNYWdpZXB1bmt0ZSksIFBfSEFORFMsIFBfQk9EWSwgUF9YUCB1bmQgZGllIEF0dHJpYnV0ZSBBX1NUUiwgQV9JTlQsIEFfREVYCisgKiB1bmQgQV9DT04uIEFsbGUga29lbm5lbiBzcGFldGVyIG5vY2ggZ2VhZW5kZXJ0IHdlcmRlbi4KKyAqLworICBjcmVhdGVfZGVmYXVsdF9ucGMoIDI1ICk7CisKKy8qIE51biBtYWNoZW4gd2lyIGVzIGV0d2FzIHdpZGVyc3RhbmRzZmFlaGlnZXIsIGluZGVtIHdpciBQX0JPRFkgc2V0emVuLiAgKi8KKy8qIE5pZSBQX1RPVEFMX0FDIG9kZXIgUF9BQyBzZXR6ZW4sIFBfVE9UQUxfQUMgd2lyZCBhdXRvbWF0aXNjaCBiZXJlY2huZXQgKi8KKy8qIHVuZCBQX0FDIGlzdCBudXIgZnVlciBSdWVzdHVuZ2VuIGRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgU2V0UHJvcChQX0JPRFksIDU1KTsKKworLyogRGFzIE1vbnN0ZXIgc2NobGFlZ3QgbWl0IGJsb3NzZW4gSGFlbmRlbiB6dSwgYWxzbyB3aXJkIFBfSEFORFMgZ2VzZXR6dC4gICAqLworLyogQXVjaCBoaWVyIHdlZGVyIFBfVE9UQUxfV0Mgbm9jaCBQX1dDIHNldHplbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIEhhZW5kZW4iLCAxMzV9KSk7CisvKiAgICAgICAgICAgICAgICAgICAgXiBkaWVzZXMgTGVlcnplaWNoZW4gaXN0IHdpY2h0aWcgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWltIEthbXBmIGVyc2NoZWludCBudW46ICdEYXMgTW9uc3RlciBncmVpZnQgRGljaCBtaXQgc2VpbmVuIEhhZW5kZW4gYW4nICovCisvKiAxMzUgZW50c3ByaWNodCBkZXIgV2FmZmVua2xhc3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBHZXNpbm51bmcgZGVzIE1vbnN0ZXJzLCAwIGlzdCBuZXV0cmFsLCBuZWdhdGl2IGJvZXNlIHVuZCBwb3NpdGl2IGd1dCAqLworICBTZXRQcm9wKFBfQUxJR04sIC0xMDApOyAgLyogZXR3YXMgYm9lc2UsIGFiZXIgbmljaHRzIGJlc29uZGVyZXMgKi8KKworLyogRGllIFJhc3NlIGRlcyBNb25zdGVycyAqLworICBTZXRQcm9wKFBfUkFDRSwgIlZhbXBpciIpOworCisvKiBFcmZhaHJ1bmdzcHVua3RlIGRlcyBNb25zdGVycywgYmVpbSBUb2QgZXJoYWVsdCBkZXIgJ0tpbGxlcicgZWluICAgKi8KKy8qIGh1bmRlcnRzdGVsIGRpZXNlcyBXZXJ0ZXMuIFNjaG9uIGltIEthbXBmIGVyaGFlbHQgbWFuIGJlaSBqZWRlbSAgICAqLworLyogU2NobGFnIHdlYXBvbl9jbGFzcypzY2hhZGVuLzEwIHB1bmt0ZSAod2VhcG9uX2NsYXNzIGhpZXIgNTUpLCBhbHNvICovCisvKiBpbnNnZXNhbXQgd2VhcG9uX2NsYXNzKmhpdF9wb2ludHMvMTAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFiIDIwMDAwMCBnaWJ0IGRlciBOUEMgZWluZW4gU3R1ZmVucHVua3QsIGFiIDYwMDAwMCAyIFN0dWZlbnB1bmt0ZSAqLworICBTZXRQcm9wKFBfWFAsIDEzMDAwMCk7CisgIAorLyogRGllIEdyb2Vzc2UgZGVzIE1vbnN0ZXJzIGluIGNtLiBEaWVzIHdpcmQgYmVpIGVpbmlnZW4gS2FtcGZiZWZlaGxlbiAqLworLyogYXVzZ2V3ZXJ0ZXQsIHNvd2llIGJlaSBlaW5pZ2VuIElkZW50aWZpa2F0aW9uc3NwcnVlY2hlbiB2b24gR2lsZGVuLgorICogSXJnZW5kd2FzIHp3aXNjaGVuIDE3MCB1bmQgMTkwIGNtLiAgKi8KKyAgU2V0UHJvcChQX1NJWkUsIDE3MCArIHJhbmRvbSgyMSkpOworCisvKiBFaW4gR2V3aWNodCAoaW4gR3JhbW0pIHNvbGx0ZSBkZXIgTlBDIGhhYmVuLCBpcmdlbmR3YXMgendpc2NoZW4gNDAgdW5kIDQ4CisgKiBrZy4KKyAqLworICBTZXRQcm9wKFBfV0VJR0hULCA0MDAwMCArIHJhbmRvbSg4MDAwKSk7CisKKy8qIFdlaXRlcmUgV2VydGU6IFBfKE1BWClfRk9PRCwgUF8oTUFYKV9EUklOSywgUF8oTUFYKV9BTENPSE9MLCAgICAgICAqLworLyogUF9NU0dJTiwgUF9NU0dPVVQsIFBfTU1TR0lOLCBQX01NU0dPVVQsIFBfTUFYX0hBTkRTICAgICAgICAgICAgICAgICovCisKKy8qIFNwZXppZWxsZSBJbmZvcyAoZnVlciBkZW4gSWRlbnRpZml6aWVyZS1TcHJ1Y2gpICovCisgIFNldFByb3AoUF9JTkZPLCBicmVha19zdHJpbmcoCisgICAgIkRlciBSb3RhdWdlbnZhbXBpciBsYWVzc3Qgc2ljaCB2aWVsbGVpY2h0IG1pdCBLbm9ibGF1Y2ggdmVydHJlaWJlbi4iLAorICAgIDc4KSk7CisKKy8qIE5QQyBrb2VubmVuIGVpbmVyIEtsYXNzZSBhbmdlaG9lcmVuIHVuZCBXYWZmZW4ga29lbm50ZW4gei5CLiBnZWdlbgorICogYmVzdGltbXRlIEtsYXNzZW4vUmFzc2VuIGJlc29uZGVycyAoaW4pZWZmZWt0aXYgc2Vpbi4KKyAqLworICBBZGRDbGFzcygoe0NMX1ZBTVBJUkUsQ0xfVU5ERUFEfSkpOworCisvKiBSZXNpc3RlbnplbiAobmVnYXRpdikgdW5kIEFuZmFlbGxpZ2tlaXRlbiAocG9zaXRpdikgKi8KKyAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLCAoWworICAgICAgICBEVF9CTFVER0VPTjowLjIsRFRfUklQOjAuMiwKKyAgICAgICAgRFRfTUFHSUM6IC0wLjIsIERUX0NPTEQ6IC0wLjEsIERUX1RFUlJPUjogLTAuOCBdKSApOworICAKKy8vIFdlciBoYXQgZGVuIFNwaWVsZXIgZ2VraWxsdCB1bmQgd2FzIHNhZ3QgbWFuIGRhbm4/CisgIFNldFByb3AoUF9LSUxMX05BTUUsIkVpbiBSb3RhdWdlbnZhbXBpciIpOworICBTZXRQcm9wKFBfS0lMTF9NU0csKHsiR3Jvc3NhcnRpZyAlcyEgRWluIHdlaXRlcmVzIE9wZmVyIGZ1ZXIgWmVzc3RyYSEiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgTVNHX1NBWX0pKTsKKworICAvLyBiZXNjaHdlcmRlIGF1ZiAtbW9lcmRlcgorICBTZXRQcm9wKFBfTVVSREVSX01TRywiRHUgc3RlY2tzdCBkb2NoIG1pdCBKb2YgaW0gQnVuZGUsICVzISIpOworICBTZXRQcm9wKFBfRElFX01TRywiIGJyaWNodCBzdG9laG5lbmQgenVzYW1tZW4uXG4iKTsKKworICAvLyBBdWNoIE5QQyBzb2xsdGVuIERldGFpbHMgaGFiZW46CisgIEFkZERldGFpbCggKHsiYXVnZW4iLCJhdWdlbmxpZGVyIiwibGlkZXIifSksIGJyZWFrX3N0cmluZygKKyAgICAiRGVyIFJvdGF1Z2VudmFtcGlyIHNjaGF1dCBEaWNoIG1pdCB3ZWl0IGF1Zmdlcmlzc2VuZW4sIHJvdCAiCisgICAgInNjaGltbWVybmRlbiBBdWdlbiB3aWxkIGFuLiIsNzgpKTsKKyAgLy8gLi4uCisKKyAgLy8gcmllY2h0IGRlciBuYWNoIHdhcz8gLT4gQWRkU21lbGxzKCkKKyAgCisgIC8vIEthbm4gbWFuIGRlbiBuYWNoIHdhcyBmcmFnZW4/IC0+IEFkZEluZm8oKS4KKworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llci5jIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXJtYWdpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM1YWFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9yb3RhdWdlbnZhbXBpcmUvcm90YXVnZW52YW1waXJtYWdpZXIuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICAgRWluIG1hZ2lzY2ggYmVnYWJ0ZXIgQmVpc3BpZWwtTlBDICh2b24gWmVzc3RyYSwgYW5nZWxlaG50IGFuIEJvaW5ncworICAgYnNwbW9uMS5jKQorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisvLyBFaW5pZ2UgV2FybnVuZ2VuIHdlcmRlbiBhbHMgRmVobGVyIGJldHJhY2h0ZXQgKGVtcGZvaGxlbikKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisvLyBTY2hhbHRldCBiZXN0aW1tdGUgV2FybnVuZ2VuIGVpbiAoZW1wZm9obGVuKQorI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQsIHdhcm5fZW1wdHlfY2FzdHMsIHdhcm5fbWlzc2luZ19yZXR1cm4KKyNwcmFnbWEgd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gRGllc2VyIE5QQyBzb2xsIGVpbiBSb3RhdWdlbnZhbXBpciBzZWluLCBkZXIgZWluIHBhYXIgU3BlbGxzIGthbm4uIFVuZCBuZW4KKy8vIFJvdGF1Z2VudmFtcGlyIGdpYnQgZXMgc2Nob24uIEFsc28gZWluZmFjaCBkZW4gbm9ybWFsZW4gUm90YXVnZW52YW1waXIKKy8vIGF1cyBkaWVzZW0gVmVyemVpY2huaXMgZXJiZW4uCitpbmhlcml0IF9fRElSX18rInJvdGF1Z2VudmFtcGlyIjsKKworLy8gSW5rbHVkaWVydCBEZWZpbml0aW9uZW4gZnVlciBQcm9wZXJ0aWVzCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAvLyBOaWNodCB2ZXJnZXNzZW4sIG9obmUgZGFzIGdlaHQgbmljaHRzLiBGdWVocnQgZGFzIGNyZWF0ZSgpIGRlcyBnZWVyYnRlbgorICAvLyBSb3RhdWdlbnZhbXBpciBhdXMgdW5kIGtvbmZpZ3VyaWVydCBpaG4uCisgIDo6Y3JlYXRlKCk7CisKKy8qIERpZSBLdXJ6YmVzY2hyZWlidW5nIHdpcmQgenVtIEJlaXNwaWVsIGFuZ2V6ZWlndCB3ZW5uIG1hbiBpbiBlaW5lbiBSYXVtCisgICBtaXQgZGVtIE1vbnN0ZXIgcmVpbmxhZXVmdCAqLworICBTZXRQcm9wKFBfU0hPUlQsICJSb3RhdWdlbnZhbXBpcm1hZ2llciIpOworCisvKiBCZWltIEFuc2NoYXVlbiBkZXMgTW9uc3RlcnMgd2lyZCBkaWUgbG9uZy1kZXNjcmlwdGlvbiBhbmdlemVpZ3QsCisgKiBaZWlsZW51bWJydWNoIG5hY2ggQmVkYXJmIG5hY2ggNzggWmVpY2hlbi4gKi8KKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAiRWluIGZpbnN0ZXIgYXVzc2VoZW5kZXIgUm90YXVnZW52YW1waXIgaW4gZWluZXIgS3V0dGUuIiw3OCkpOworCisvKiBFaW4gTmFtZSBtdXNzIHNlaW4sIGRhIHNvbnN0IHouQi4gaW0gVG9kZXNmYWxsICdMZWljaGUgdm9uIDAnIGRhbGllZ3QgKi8KKyAgU2V0UHJvcChQX05BTUUsICJSb3RhdWdlbnZhbXBpcm1hZ2llciIpOworICBTZXRQcm9wKFBfTkFNRV9BREosImxpc3RlbnJlaWNoIik7CisKKyAgLy8gZmFzdCBhbGxlIEVpZ2Vuc2NoYWZ0ZW4gdWViZXJuZWhtZW4gd2lyIGVpbmZhY2ggdW52ZXJhZW5kZXJ0IHVudmVyYWVuZGVydAorICAvLyB2b20gbm9ybWFsZW4gUm90YXVnZW52YW1waXIuIERpZSBIYW5kcyBuaWNodCwgZGVyIE1hZ2llciBoYXV0IG5pY2h0IHNvCisgIC8vIGd1dCB6dS4uLgorICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIEhhZW5kZW4iLCA4NX0pKTsKKworICAvLyBvaywgc3BpZWx0IHdlbmlnIFJvbGxlIGluIGRpZXNlbSBGYWxsLCBhYmVyIGRhbWl0cyBzdGlsZWNodCBpc3QsIGtyaWVndAorICAvLyBkZXIgaGllciBqZXR6dCBldHdhcyBtZWhyIGFuIE1hZ2llcHVua3RlbiAoc3BlbGxwb2ludHMpCisgIFNldFByb3AoUF9NQVhfU1AsIDM1MCk7CisKKyAgLy8gdW5kIG5vY2ggZWluIHBhYXIgU3BlbGxzCisgIC8vIEFubWVya3VuZzogZGllc2UgU3BlbGxzIGhhYmVuIG5pY2h0cyBtaXQgaXJnZW5kd2VsY2hlbiBHaWxkZW5zcGVsbHMgenUKKyAgLy8gdHVuIHVuZCAtIGphLCB0YXRzYWVjaGxpY2ggLSB2ZXJicmF1Y2hlbiBrZWluZSBNYWdpZXB1bmt0ZS4uLgorCisgIC8vIHdhaHJzY2hlaW5saWNoa2VpdCBpbiAlIHBybyBydW5kZSwgZWluZW4gU3BlbGwgenUgY2FzdGVuOgorICBTZXRQcm9wKFBfU1BFTExSQVRFLDMwKTsKKyAgLy8gRWluIFNwZWxsLCBkZXIgMTAwIFNjaGFkZW5zcHVua3RlIG1hY2h0IHVuZCBpbiA2MCUgZGVyIEZhZWxsZSBhdXNnZXdhZWhsdAorICAvLyB3aXJkLiBFcnN0ZSBNZWxkdW5nIGdlaHQgYW4gZGVuIFNwaWVsZXIsIGRpZSB6d2VpdGUgYW4gZGVuIFJhdW0uCisgIC8vIFNjaGFkZW5zdHlwIGlzdCBTY2hsYWdzY2hhZGVuLgorICBBZGRTcGVsbCg2MCwxMDAsCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgbWFjaHQgZWluZSBIYW5kYmV3ZWd1bmcgdm9yIERlaW5lbSBHZXNpY2h0LiAiCisgICAgICAiU28gYWJnZWxlbmt0IHN0b2xwZXJzdCBEdSBpbiBmYWVsbHN0IGhhcnQgenUgQm9kZW4uIiw3OCksCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgbWFjaHQgZWluZSBIYW5kYmV3ZWd1bmcgdm9yIEBXRVNTRU4gR2VzaWNodC4gIgorICAgICAgIkBXRVIgc3RvbHBlcnQgdW5kIGZhZWxsdCBoYXJ0IGF1ZiBkZW4gQm9kZW4uIiw3OCksCisgICAgKHtEVF9CTFVER0VPTn0pICk7CisgIC8vIEVpbiBTcGVsbCwgZGVyIDgwMCBTY2hhZGVuc3B1bmt0ZSBtYWNodCB1bmQgaW4gNDAlIGRlciBGYWVsbGUgYXVzZ2V3YWVobHQKKyAgLy8gd2lyZC4gU2NoYWRlbnN0eXA6IEZldWVyLgorICBBZGRTcGVsbCg0MCw4MDAsCisgICAgYnJlYWtfc3RyaW5nKE5hbWUoV0VSKSArICIgc2NoYXV0IERpY2ggbWl0IGJyZW5uZW5kZW4gQXVnZW4gIgorICAgICAgImR1cmNoZHJpbmdlbmQgYW4uIER1IGdsYXVic3QsIGlubmVybGljaCB6dSB2ZXJicmVubmVuLiIsNzgpLAorICAgIGJyZWFrX3N0cmluZyhOYW1lKFdFUikgKyAiIHNjaGF1dCBAV0VOIG1pdCBnbHVlaGVuZGVuIEF1Z2VuIGFuLiAiCisgICAgICAiQFdFUiBrcnVlbW10IHNpY2ggdm9yIFNjaG1lcnplbi4iLDc4KSwKKyAgICAoe0RUX0ZJUkV9KSApOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llcmluLmMgYi9kb2MvYmVpc3BpZWxlL3JvdGF1Z2VudmFtcGlyZS9yb3RhdWdlbnZhbXBpcm1hZ2llcmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvcm90YXVnZW52YW1waXJlL3JvdGF1Z2VudmFtcGlybWFnaWVyaW4uYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICAgRWluIG1hZ2lzY2ggYmVnYWJ0ZXIgQmVpc3BpZWwtTlBDICh2b24gWmVzc3RyYSwgYW5nZWxlaG50IGFuIEJvaW5ncworICAgYnNwbW9uMS5jKQorICAgSW4gZGllc2VtIEZhbGwgc29sbCBlaW5lIE1hZ2llcmluIHNlaW4sIGRpZSBhYmVyIGRpZSBnbGVpY2hlbiBTdGF0cyB3aWUgZGVyCisgICBtYWVubmxpY2hlIEtvbGxlZ2UgaGF0LgorKi8KKworLy8gRGllc2UgUHJhZ21hcyBzb3JnZW4gZGFmdWVyLCBkYXNzIGRlciBEcml2ZXIgZGFyYXVmIGFjaHRldCwgZGFzcyBiZWkKKy8vIEZ1bmt0aW9uc2FyZ3VtZW50ZW4sIC1SdWVja2dhYmV3ZXJ0ZW4gdW5kIHRlaWx3ZWlzZSBiZWkgWnV3ZWlzdW5nIHZvbgorLy8gV2VydGVuIGFuIFZhcmlhYmxlbiBkZXIgcmljaHRpZ2UgRGF0ZW50eXAgdmVyd2VuZGV0IHdpcmQgKHouYi4ga2VpbiBzdHJpbmcKKy8vIGFuc3RlbGxlIGVpbmVzIGludCB2ZXJ3ZW5kZXQgd2lyZCkuIFNvbGx0ZSBpbiBrZWluZW0gT2JqZWt0IGZlaGxlbi4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisvLyBFaW5pZ2UgV2FybnVuZ2VuIHdlcmRlbiBhbHMgRmVobGVyIGJldHJhY2h0ZXQgKGVtcGZvaGxlbikKKyNwcmFnbWEgcGVkYW50aWMsIHJhbmdlX2NoZWNrCisvLyBTY2hhbHRldCBiZXN0aW1tdGUgV2FybnVuZ2VuIGVpbiAoZW1wZm9obGVuKQorI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQsIHdhcm5fZW1wdHlfY2FzdHMsIHdhcm5fbWlzc2luZ19yZXR1cm4KKyNwcmFnbWEgd2Fybl9mdW5jdGlvbl9pbmNvbnNpc3RlbnQKKworLy8gRGllc2VyIE5QQyBzb2xsIGVpbmUgUm90YXVnZW52YW1waXJtYWdpZXJpbiBzZWluLiBVbmQgbmVuCisvLyBSb3RhdWdlbnZhbXBpcm1hZ2llciBnaWJ0IGVzIHNjaG9uLiBBbHNvIGVpbmZhY2ggZGVuIG5vcm1hbGVuCisvLyBSb3RhdWdlbnZhbXBpcm1hZ2llciBhdXMgZGllc2VtIFZlcnplaWNobmlzIGVyYmVuLgoraW5oZXJpdCBfX0RJUl9fKyJyb3RhdWdlbnZhbXBpcm1hZ2llciI7CisKKy8vIElua2x1ZGllcnQgRGVmaW5pdGlvbmVuIGZ1ZXIgUHJvcGVydGllcworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPiAvLyBmdWVyIEZFTUFMRS1EZWZpbmUKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgLy8gTmljaHQgdmVyZ2Vzc2VuLCBvaG5lIGRhcyBnZWh0IG5pY2h0cy4gRnVlaHJ0IGRhcyBjcmVhdGUoKSBkZXMgZ2VlcmJ0ZW4KKyAgLy8gUm90YXVnZW52YW1waXJtYWdpZXJzIGF1cyB1bmQga29uZmlndXJpZXJ0IGlobi4KKyAgOjpjcmVhdGUoKTsKKworICAvLyBHZXNjaGxlY2h0IGFlbmRlcm4uCisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisKKyAgLy8gS3Vyei0gdW5kIExhbmdiZXNjaHJlaWJ1bmcgYWVuZGVybi4KKyAgU2V0UHJvcChQX1NIT1JULCAiUm90YXVnZW52YW1waXJtYWdpZXJpbiIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJFaW5lIGZpbnN0ZXIgYXVzc2VoZW5kZSBSb3RhdWdlbnZhbXBpcm1hZ2llcmluIGluIGVpbmVyIEt1dHRlLiIsNzgpKTsKKworICAvLyBOYW1lIGFucGFzc2VuCisgIFNldFByb3AoUF9OQU1FLCAiUm90YXVnZW52YW1waXJtYWdpZXJpbiIpOworCisgIC8vIE1lbGR1bmcgYW5wYXNzZW4uCisgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBpaHJlbiBIYWVuZGVuIiwgODV9KSk7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhLmMgYi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYS5jCkBAIC0wLDAgKzEsOCBAQAorICAgICB2b2lkIGZ1bigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2FdIGZ1bigpXG4iLCB0aGlzX29iamVjdCgpKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMygpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2FdIGZ1bjMoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYmIuYyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3NzA5MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiLmMKQEAgLTAsMCArMSwxMyBAQAorICAgICBpbnQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbYl0gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICAgICAgZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpLT5mdW4oKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMigpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2JdIGZ1bjIoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgICAgICBmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIiktPmZ1bjMoKTsKKyAgICAgICAgIHRoaXNfb2JqZWN0KCktPmZ1bjMoKTsKKyAgICAgfQorCisgICAgIHZvaWQgZG9fc2hhZG93KG9iamVjdCB0YXJnZXQpIHsgc2hhZG93KHRhcmdldCwgMSk7IH0KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MuYyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNjBlZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjLmMKQEAgLTAsMCArMSwxMSBAQAorICAgICBpbnQgZnVuKCkgeworICAgICAgICAgcHJpbnRmKCIlTyBbY10gZnVuKClcbiIsIHRoaXNfb2JqZWN0KCkpOworICAgICAgICAgZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpLT5mdW4oKTsKKyAgICAgfQorCisgICAgIHZvaWQgZnVuMygpIHsKKyAgICAgICAgIHByaW50ZigiJU8gW2NdIGZ1bjMoKVxuIiwgdGhpc19vYmplY3QoKSk7CisgICAgIH0KKworICAgICB2b2lkIGRvX3NoYWRvdyhvYmplY3QgdGFyZ2V0KSB7IHNoYWRvdyh0YXJnZXQsIDEpOyB9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc2hhZG93L2xvYWRtZS5jIGIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvbG9hZG1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZTRkNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc2hhZG93L2xvYWRtZS5jCkBAIC0wLDAgKzEsMjQgQEAKK3ZvaWQgY3JlYXRlKCkgeworICAgICBvYmplY3QgYSwgYiwgYzsKKworICAgICBpZiAoZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9hYSIpKQorICAgICAgIGRlc3RydWN0KGZpbmRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYWEiKSk7CisgICAgIGEgPSBsb2FkX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2FhIik7CisgICAgIGlmIChmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2JiIikpCisgICAgICAgZGVzdHJ1Y3QoZmluZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9iYiIpKTsKKyAgICAgYiA9IGxvYWRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvYmIiKTsKKyAgICAgaWYgKGZpbmRfb2JqZWN0KCIvZG9jL2JlaXNwaWVsZS9zaGFkb3cvY2MiKSkKKyAgICAgICBkZXN0cnVjdChmaW5kX29iamVjdCgiL2RvYy9iZWlzcGllbGUvc2hhZG93L2NjIikpOworICAgICBjID0gbG9hZF9vYmplY3QoIi9kb2MvYmVpc3BpZWxlL3NoYWRvdy9jYyIpOworCisgICAgIGItPmRvX3NoYWRvdyhhKTsKKyAgICAgYy0+ZG9fc2hhZG93KGEpOworICAgICBwcmludGYoIi0tLSBhLT5mdW4oKSAtLS1cbiIpOworICAgICBhLT5mdW4oKTsKKyAgICAgcHJpbnRmKCItLS0gYi0+ZnVuKCkgLS0tXG4iKTsKKyAgICAgYi0+ZnVuKCk7CisgICAgIHByaW50ZigiLS0tIGMtPmZ1bigpIC0tLVxuIik7CisgICAgIGMtPmZ1bigpOworICAgICBwcmludGYoIi0tLSBiLT5mdW4yKCkgLS0tXG4iKTsKKyAgICAgYi0+ZnVuMigpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvUkVBRE1FIGIvZG9jL2JlaXNwaWVsZS9zc3AvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWNhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9SRUFETUUKQEAgLTAsMCArMSwzIEBACitEaWVzZSBEYXRlaWVuIHNpbmQgbnVyIGFscyBCZWlzcGllbGUgenUgdmVyd2VuZGVuIHVuZCBuaWNodCBpbiBlaW5lbQorYW5kZXJlbiBNdWQgYWxzIGRlbSBNb3JnZW5HcmF1ZW4gZnVlciBTcGllbGVyIHp1Z2FlbmdsaWNoIHp1IG1hY2hlbi4KKyAgQm9pbmcKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2ZpbGVzLmggYi9kb2MvYmVpc3BpZWxlL3NzcC9maWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTk1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9maWxlcy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNkZWZpbmUgU00oeCkgKCIvZG9jL2JlaXNwaWVsZS9zc3AvIit4KQorI2RlZmluZSBMMSh4KSAoU00oImwxLyIreCkpCisjZGVmaW5lIEwyKHgpIChTTSgibDIvIit4KSkKKyNkZWZpbmUgTDMoeCkgKFNNKCJsMy8iK3gpKQorI2RlZmluZSBMNCh4KSAoU00oImw0LyIreCkpCisjZGVmaW5lIEw1KHgpIChTTSgibDUvIit4KSkKKyNkZWZpbmUgTDYoeCkgKFNNKCJsNi8iK3gpKQorI2RlZmluZSBNT04oeCkgKFNNKCJtb24vIit4KSkKKyNkZWZpbmUgT0JKKHgpIChTTSgib2JqLyIreCkpCisKKyNkZWZpbmUgTE9HX09CSiAiL3BsYXllcnMvYm9pbmcvb2JqL2xvZ29iaiIKKyNkZWZpbmUgUEZMQU5aRSAiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9wZmxhbnplIgorI2RlZmluZSBNTU9OU1QgIi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vbWV0YWxsbW9uc3RlciIKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU0MzcyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4MS5jCkBAIC0wLDAgKzEsMzAgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgUmF1bSBpc3QgZ2VmdWVsbHRcbiIrCisgICJtaXQgZ3JhdS1ibGF1ZW0gUmF1Y2gsIGRlciB2b24gZGVtIGdyb3NzZW4gRHJhY2hlbiBzdGFtbXQsIGRlciBpaG4gYmUtXG4iKworICAid29obnQuIEVzIGlzdCBzZWhyIHdhcm0gaGllciBkcmluIHVuZCBhbiBkZW4gV2FlbmRlbiB1bmQgYW4gZGVyIERlY2tlXG4iKworICAia29uZGVuc2llcnQgZGVyIERhbXBmIHp1IGtsZWluZW4gVHJvcGZlbi4gRGVyIGVpbnppZ2UgQXVzZ2FuZyBsaWVndCBpbVxuIisKKyAgIk9zdGVuLlxuIik7CisgIEFkZERldGFpbCgicmF1bSIsICJFaW4gRHJhY2hlIHdvaG50IGhpZXIgbm9ybWFsZXJ3ZWlzZS5cbiIpOworICBBZGREZXRhaWwoKHsiZHJhY2hlIiwgImRyYWNoZW4ifSksICJFciBzY2hlaW50IGdlcmFkZSBuaWNodCBkYSB6dSBzZWluLlxuIik7CisgIEFkZERldGFpbCgicmF1Y2giLCAiRGVyIFJhdWNoIHppZWh0IHp1bSBBdXNnYW5nIGltIE9zdGVuIGhpbmF1cy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAiZGVja2UiLCAibWV0YWxsIiwgInN0YWhsIn0pLCAiQWxsZXMgaGllciBpc3QgYXVzIHJlaW5lbSBTdGFobC5cbiIpOworICBBZGREZXRhaWwoImRhbXBmIiwgIkVyIGtvbmRlbnNpZXJ0IGFuIGRlbiBXYWVuZGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YXNzZXIiLCAia29uZGVuc3dhc3NlciJ9KSwgIkVzIHRyb3BmdCB6dSBCb2Rlbi5cbiIpOworICBBZGREZXRhaWwoInRyb3BmZW4iLCAiU2llIHRyb3BmZW4gYXVmIGRlbiBCb2Rlbi5cbiIpOworICBBZGREZXRhaWwoImF1c2dhbmciLCAiRXIgbGllZ3QgaW0gT3N0ZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oInN0YWhsZHJhY2hlIiksIFJFRlJFU0hfUkVNT1ZFKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMngxIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4Mi5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTM1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgyLmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBJbiBkaWVzZXIgZ2VtdWV0bGljaGVuXG4iKworICAiRWNrZSAobmF0dWVybGljaCBudXIgZnVlciBNZXRhbGwgbGllYmVuZGUgTGViZXdlc2VuKSBoYXQgc2ljaCB3b2hsIGVpbmVcbiIrCisgICJkZXIgbWVya3d1ZXJkaWdlbiBUaXRhbndhbHplbiBlaW5nZW5pc3RldCwgYXVmIGplZGVuIEZhbGwgaXN0IGRlciBCb2RlblxuIisKKyAgImRlcm1hc3NlbiBwbGF0dGdld2FsenQsIHdpZSBlcyBudXIgZGllc2UgQXJ0IHNjaGFmZmVuIGthbm4uIERlciBHYW5nXG4iKworICAic2VsYnN0IGZ1ZWhydCBoaWVyIG5hY2ggU3VlZGVuIHVuZCBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoImVja2UiLCAiUmljaHRpZyBuZXR0IGhpZXIgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGhpZXIgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbHplIiwgInRpdGFud2FsemUifSksICJEaWUgVGl0YW53YWx6ZSBzY2hlaW50IGdlcmFkZSBuaWNodCBkYWhlaW0genUgc2Vpbi5cbiIpOworICBBZGREZXRhaWwoImJvZGVuIiwgIkRlciBCb2RlbiBpc3QgYWJzb2x1dCBwbGF0dC5cbiIpOworICBBZGREZXRhaWwoImdhbmciLCAiRWluIGF1cyBNZXRhbGwgZ2VhcmJlaXRldGVyIEdhbmcuXG4iKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTF4MyIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMngyIikpOworICBBZGRJdGVtKE1PTigidGl0YW53YWx6ZSIpLCBSRUZSRVNIX1JFTU9WRSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgzLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5MzAyOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDMuYwpAQCAtMCwwICsxLDI0IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIEVpbmUgbGFuZ2UgTWV0YWxscm9laHJlXG4iKworICAiZnVlaHJ0IHdlaXRlciB2b24gU3VlZGVuIG5hY2ggTm9yZGVuIHVuZCBzY2hlaW50IGtlaW4gRW5kZSB6dSBuZWhtZW4uIERlaW5lXG4iKworICAiU2Nocml0dGUgaGFsbGVuIGJsZWNoZXJuIGR1cmNoIGRpZSBHYWVuZ2UgdW5kIGluZm9ybWllcmVuIGRlcmVuIEJld29obmVyXG4iKworICAidWViZXIgRGVpbmUgQW53ZXNlbmhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7Im1ldGFsbHJvZWhyZSIsICJyb2VocmUiLCAiZ2FuZyIsICJnYWVuZ2UifSksICJEdSBiZWZpbmRlc3QgRGljaCBpbiBlaW5lciBsYW5nZW4gTWV0YWxscm9laHJlLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgc2llaHQgc2VociBzdGFiaWwgYXVzLlxuIik7CisgIEFkZERldGFpbCgoeyJib2RlbiIsICJkZWNrZSIsICJ3YW5kIiwgIndhZW5kZSJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgiYmV3b2huZXIiLCAiSGllciBzY2hlaW5lbiBrZWluZSB6dSBzZWluLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0xeDIiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0xeDQiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXg0LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMXg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3OWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDQuYwpAQCAtMCwwICsxLDI0IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBNZXRhbGxyb2VocmUsIGluIGRlclxuIisKKyAgIkR1IERpY2ggYmVmaW5kZXN0IGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLiBBdWNoIGhpZXIga2xpbmd0IGRlciBCb2RlblxuIisKKyAgInVudGVyIERlaW5lbiBGdWVzc2VuIHJlY2h0IGhvaGwsIGVzIGlzdCB3b2hsIHdpcmtsaWNoIGV0d2FzIEJlc29uZGVyZXNcbiIrCisgICJkYXJ1bnRlci4gQWxsZXJkaW5ncyBzaW5kIGtlaW5lcmxlaSBBbnplaWNoZW4gZnVlciBlaW5lbiBadWdhbmcgenUgc2VoZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAicm9laHJlIiwgIm1ldGFsbHJvZWhyZSJ9KSwgIkRlciBHYW5nIGZ1ZWhydCBuYWNoIE5vcmRlbiB1bmQgU3VlZGVuLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkhhcnRlcywgZ2xhZW56ZW5kZXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSIsICJib2RlbiIsICJkZWNrZSJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgienVnYW5nIiwgIkVzIGlzdCBrZWluZXIgenUgc2VoZW4uXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTF4MyIpKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTF4NSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDUuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20xeDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTRmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTF4NS5jCkBAIC0wLDAgKzEsMzEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRGVyIHZvZWxsaWcgbWl0IE1ldGFsbFxuIisKKyAgInZlcmtsZWlkZXRlIEdhbmcgbWFjaHQgaGllciBlaW5lIEJpZWd1bmcgdm9uIE9zdGVuIG5hY2ggTm9yZGVuLCB3byBlclxuIisKKyAgImluIGRpZSBzY2h3YXJ6ZSBEdW5rZWxoZWl0IGZ1ZWhydC4gRGVpbmUgU2Nocml0dGUgaGFsbGVuIGhpZXIgbGVpY2h0IG5hY2gsXG4iKworICAiZXMgc2NoZWludCBzaWNoIHdvaGwgZWluIEhvaGxyYXVtIHVudGVyIGRlbSBCb2RlbiB6dSBiZWZpbmRlbi5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJFcyBzY2hlaW50IEVpc2VuIG9kZXIgU3RhaGwgenUgc2Vpbi5cbiIpOworICBBZGREZXRhaWwoKHsiZWlzZW4iLCAic3RhaGwifSksICJEdSB3ZWlzc3QgbmljaHQgZ2VuYXUsIG9iIGVzIEVpc2VuIG9kZXIgU3RhaGwgaXN0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgInJvZWhyZSJ9KSwgIkRlciBHYW5nIG1hY2h0IGVpbmVuIEtuaWNrLlxuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJTaWUgdmVyc2NobGluZ3QgYWxsZXMuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImJvZGVuIiwgImRlY2tlIn0pLCAiQWxsZXMgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJob2hscmF1bSIsICJEdSBrYW5uc3Qga2VpbmUgSGlud2Vpc2UgYXVmIGVpbmVuIFp1Z2FuZyBmaW5kZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJ6dWdhbmciLCAiRHUgc2llaHN0IGtlaW5lbi5cbiIpOworICBBZGREZXRhaWwoKHsia25pY2siLCAiYmllZ3VuZyJ9KSwgIlNvIG5lbm50IHNpY2ggc293YXMgaGFsdCAuLi4gaWNoIGthbm4gbml4IGRhZnVlciFcbiIpOworICBBZGRJdGVtKE1PTigia2FtcGZibGVjaCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIAorICBBZGRFeGl0KCJub3JkZW4iLCBMMSgibTF4NCIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtMng1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4MS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMngxLmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEaWVzZXIgR2FuZyBoaWVyIGlzdCBhdXNcbiIrCisgICJyZWluc3RlbSBTdGFobCBnZWZlcnRpZ3QsIGRlciBpbiBEZWluZW0gTGljaHQgbWF0dCBmdW5rZWx0LiBBdXMgZWluZXJcbiIrCisgICJLYW1tZXIgaW0gV2VzdGVuIGRyaW5nZW4gUmF1Y2hzY2h3YWRlbiBoZXJ2b3IgdW5kIGVpbiBTY2huYXViZW4gaXN0IHp1XG4iKworICAiaG9lcmVuLiBEdSBrYW5uc3QgZXMgYWxsZXJkaW5ncyBhdWNoIHZvcnppZWhlbiwgbmFjaCBTdWVkZW4gZGVtIFVuaGVpbFxuIisKKyAgInp1IGVudGdlaGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJyb2VocmUiLCAicm9laHJlbiJ9KSwgIkRlciBHYW5nIG1hY2h0IGVpbmUgQmllZ3VuZyB2b24gU3VlZGVuIG5hY2ggV2VzdGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJib2RlbiIsICJkZWNrZSIsICJ3YW5kIiwgIndhZW5kZSIsICJtZXRhbGwiLCAic3RhaGwifSksICJBbGxlcyBoaWVyIGlzdCBhdXMgaGFydGVtIFN0YWhsLlxuIik7CisgIEFkZERldGFpbCgia2FtbWVyIiwgIkltIFdlc3RlbiBsaWVndCBlaW5lIEthbW1lci5cbiIpOworICBBZGREZXRhaWwoKHsicmF1Y2hzY2h3YWRlbiIsICJyYXVjaCIsICJzY2h3YWRlbiJ9KSwgIkRlciBSYXVjaCB6aWVodCBkdXJjaCBlaW4gcGFhciBSaXR6ZW4gaW4gZGVyIERlY2tlIGFiLlxuIik7CisgIEFkZERldGFpbCgoeyJyaXR6ZSIsICJyaXR6ZW4ifSksICJEaWUgUml0emVuIGhhYmVuIG5pY2h0cyBCZW1lcmtlbnN3ZXJ0ZXMgYW4gc2ljaC5cbiIpOworICBBZGREZXRhaWwoInNjaG5hdWJlbiIsICJWb24gd2VtIHdvaGwgZGFzIFNjaG5hdWJlbiBrb21tdD9cbiIpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtMXgxIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtMngyIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4Mi5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWZjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMngyLmMKQEAgLTAsMCArMSwyNiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBIaWVyIHZlcnp3ZWlndCBzaWNoIGRlclxuIisKKyAgIkdhbmcgaW4gdmVyc2NoaWVkZW5lIE1ldGFsbHJvZWhyZW4sIGRpZSBuYWNoIE5vcmRlbiwgU3VlZGVuIHVuZCBXZXN0ZW5cbiIrCisgICJmdWVocmVuLiBBdXNzZXJkZW0gaXN0IGluIGRlciBEZWNrZSBlaW4ga2xlaW5lcyBMb2NoLCBkdXJjaCBkYXMgZWluZVxuIisKKyAgIkxlaXRlciBuYWNoIG9iZW4gZnVlaHJ0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJtZXRhbGxyb2VocmUiLCAibWV0YWxscm9laHJlbiIsICJyb2VocmUiLCAicm9laHJlbiJ9KSwgIkdhZW5nZSBmdWVocmVuIGluIGRpZSB2ZXJzY2hpZWRlbnN0ZW4gUmljaHR1bmdlbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAibWV0YWxsIn0pLCAiSGllciBpc3QgZWluZmFjaCBhbGxlcyBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgibGVpdGVyIiwgIkRpZSBMZWl0ZXIgZnVlaHJ0IGR1cmNoIGVpbiBMb2NoIGluIGRlciBEZWNrZSBuYWNoIG9iZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImxvY2giLCAiZGVja2UifSksICJJbiBkZXIgRGVja2UgaXN0IGVpbiBMb2NoLlxuIik7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0yeDMiKSk7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0yeDEiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0xeDIiKSk7CisgIEFkZEV4aXQoIm9iZW4iLCBMMSgib2JlbiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjkxYWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4My5jCkBAIC0wLDAgKzEsMjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgR2FuZywgaW4gZGVtIER1XG4iKworICAiRGljaCBiZWZpbmRlc3QgZnVlaHJ0IHNjaG51cmdlcmFkZSB2b24gTm9yZGVuIG5hY2ggU3VlZGVuLiBEaWUgV2FlbmRlXG4iKworICAicmVmbGVrdGllcmVuIGRhcyBMaWNodCB1bmQgRGVpbmUgU2Nocml0dGUgZXJ6ZXVnZW4gZWluZW4gbWV0YWxsaXNjaGVuXG4iKworICAiS2xhbmcgYXVmIGRlbSBCb2Rlbi5cbiIpOyAKKyAgQWRkRGV0YWlsKCh7ImJvZGVuIiwgIndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgiZ2FuZyIsICJFciBmdWVocnQgbmFjaCBOb3JkZW4gdW5kIFN1ZWRlbi5cbiIpOworICBBZGREZXRhaWwoImxpY2h0IiwgIkVzIGtvbW10IGlyZ2VuZHdvaGVyLlxuIik7CisgIEFkZERldGFpbCgic2Nocml0dGUiLCAiV2VubiBEdSBsYWV1ZnN0LCBtYWNoc3QgRHUgU2Nocml0dGUsIGRhcyB3dXNzdGVzdCBEdSBhYmVyLCBvZGVyP1xuIik7CisgIEFkZERldGFpbCgia2xhbmciLCAiRGVyIEtsYW5nIGlzdCBuaWNodCBzb25kZXJsaWNoIGludGVyZXNzYW50LCBhYmVyIHp3ZWlmZWxsb3Mgdm9yaGFuZGVuLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm0yeDIiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm0yeDQiKSk7CisgIEFkZEl0ZW0oTU9OKCJkb3Nlbm9lZmZuZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4NC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTJ4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NGI0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng0LmMKQEAgLTAsMCArMSwyMiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgdm9lbGxpZyBtaXQgTWV0YWxsXG4iKworICAiYXVzZ2VzY2hsYWdlbmUgR2FuZyBtYWNodCBoaWVyIGVpbmVuIHNjaGFyZmVuIEtuaWNrIHZvbiBOb3JkZW4gbmFjaCBPc3RlblxuIisKKyAgInVuZCB2ZXJzY2h3aW5kZXQgZG9ydCBpbiBkZXIgRHVua2VsaGVpdC5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAiYm9kZW4iLCAiZGVja2UiLCAibWV0YWxsIn0pLCAiQWxsZXMgaGllciBpc3QgYXVzIE1ldGFsbC5cbiIpOworICBBZGREZXRhaWwoImdhbmciLCAiRGVyIEdhbmcgZnVlaHJ0IG5hY2ggTm9yZGVuIHVuZCBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoImR1bmtlbGhlaXQiLCAiRHUga2FubnN0IGhpbmdlaGVuIHVuZCBzY2hhdWVuLCBvYiBzaWUgZGFubiBub2NoIGRhIGlzdC5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtMngzIikpOworICBBZGRFeGl0KCJvc3RlbiIsTDEoIm0zeDQiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng1LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tMng1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMGMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20yeDUuYwpAQCAtMCwwICsxLDI2IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBXYWVuZGUgZGVzIEdhbmdlcyxcbiIrCisgICJkZXIgdm9uIE9zdGVuIG5hY2ggV2VzdGVuIChvZGVyIGFuZGVyc3J1bSkgdmVybGFldWZ0LCBzaW5kIG1pdCBnbGFlbnplbmRlbVxuIisKKyAgIk1ldGFsbCBhdXNnZWtsZWlkZXQuIElyZ2VuZHdpZSBrb21tdCBEaXIgZGllc2UgVW1nZWJ1bmcgemllbWxpY2ggc2VsdHNhbVxuIisKKyAgInZvciwgYWJlciBrZWluZSBTb3JnZSwgZXMga29tbXQgbm9jaCB2aWVsIHNjaGxpbW1lciFcbiIpOworICBBZGREZXRhaWwoKHsiZ2FuZyIsICJyb2VocmUifSksICJEZXIgR2FuZyB2ZXJsYWV1ZnQgdm9uIE9zdGVuIG5hY2ggV2VzdGVuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSIsICJkZWNrZSIsICJib2RlbiJ9KSwgIkFsbGVzIGlzdCBhdXMgZ2xhZW56ZW5kZW0gTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgaXN0IGFuIGVpbmVyIFN0ZWxsZSBsZWljaHQgZWluZ2VkZWxsdC5cbiIpOworICBBZGREZXRhaWwoKHsiZGVsbGUiLCAic3RlbGxlIiwgImJldWxlIn0pLCAiRGEgd29sbHRlIHdvaGwgamVtYW5kIG1pdCBkZW0gS29wZiBkdXJjaCBkaWUgV2FuZC5cbiIpOworICBBZGRFeGl0KCJvc3RlbiIsTDEoIm0zeDUiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0xeDUiKSk7CisgIEFkZEl0ZW0oTU9OKCJkb3Nlbm9lZmZuZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRJdGVtKE1PTigiZG9zZW5vZWZmbmVyIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAyMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4MS5jCkBAIC0wLDAgKzEsMzEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBhbSBFaW5nYW5nIHp1bSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBFdHdhcyBMaWNodFxuIisKKyAgImRyaW5ndCB2b20gQXVzZ2FuZyBpbSBOb3JkZW4gaGVyZWluLCBkb2NoIGltIFN1ZWRlbiBsYXVlcnQgZGllIHBlY2hzY2h3YXJ6ZVxuIisKKyAgIkR1bmtlbGhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJlaW5nYW5nIiwgIkVzIGlzdCBkZXIgRWluZ2FuZyB6dSBtZWhyLCBhbHMgRHUgZGVua3N0LlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiRGVyIEJvZGVuIGJlc3RlaHQgYXVzIGdyYXVlbSBGZWxzLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEZXIgRmVscyBpc3QgbmljaHQgYmVzb25kZXJzIGludGVyZXNzYW50LCBudXIgZ3JhdS5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEaWUgV2FlbmRlIHNpbmQgdm9uIE9ya2JsdXQgYmVzY2htdXR6dC5cbiIpOworICBBZGREZXRhaWwoKHsib3JrYmx1dCIsICJibHV0In0pLCAiT3JrcyB3ZXJkZW4gaGllciB3b2hsIHp1bSBTcGFzcyBnZW1ldHplbHQuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJVZWJlciBEZWluZW0gS29wZiwgZGFzIHdpcmQgRGlyIGhpZXIgbm9jaCBvZWZ0ZXJzIHBhc3NpZXJlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9laGxlbmxhYnlyaW50aCIsICJsYWJ5cmludGgiLCAiaG9laGxlbiJ9KSwgIkRpZXNlIExhYnlyaW50aCBlcnN0cmVja3Qgc2ljaCB1ZWJlciBldGxpY2hlIEViZW5lbiwgdmllbCBTcGFzcyBiZWltXG5Fcmt1bmRlbi5cbiIpOworICBBZGREZXRhaWwoImxpY2h0IiwgIkRhcyBsZXR6dGUgVGFnZXNsaWNodC5cbiIpOworICBBZGREZXRhaWwoImF1c2dhbmciLCAiRGVyIEF1c2dhbmcgYXVzIGRlciBEdW5rZWxoZWl0LlxuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJEYXMgd2lyZCBEaXIgZG9ydCB1bnRlbiBub2NoIG9lZnRlcnMgYmVnZWduZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oIm9yayIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oTU9OKCJvcmsiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRFeGl0KCJub3JkZW4iLCAiL2QvZ2ViaXJnZS9yb29tL3NwaXR6ZTQiKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTN4MiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTEzNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4Mi5jCkBAIC0wLDAgKzEsMjkgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRWluIHNjaG1hbGVyIEdhbmcsIGRlclxuIisKKyAgInZvbiBOb3JkZW4gbmFjaCBTdWVkZW4gZnVlaHJ0LCBpc3QgaGllciBkdXJjaCBkZW4gaGFydGVuIEZlbHMgZ2VoYXVlbi5cbiIrCisgICJEZXIgR2FuZyBpc3QgbnVyIGdyb2IgYmVoYXVlbiwgZWluIFplaWNoZW4gZGFmdWVyLCBkYXNzIGhpZXIgbmljaHQgWndlcmdlXG4iKworICAiYW0gV2VyayB3YXJlbiwgc29uZGVybiBib2VzZSBXZXNlbiwgd2FocnNjaGVpbmxpY2ggT3Jrcy5cbiIpOworICBBZGREZXRhaWwoImZlbHMiLCAiRGVyIEZlbHMgaXN0IGhhcnQgdW5kIG51ciBncm9iIGJlaGF1ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAiZ2FlbmdlIn0pLCAiRGVyIEdhbmcgZnVlaHJ0IHZvbiBOb3JkZW4gbmFjaCBTdWVkZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIHNpZWhzdCBEdSB6YWhscmVpY2hlIFVlYmVycmVzdGUgdm9uIEFiZW50ZXVyZXJuLCBkaWUgbmljaHRcbnZvcnNpY2h0aWcgZ2VudWcgd2FyZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7InJlc3QiLCAidWViZXJyZXN0IiwgInJlc3RlIiwgInVlYmVycmVzdGUiLCAiYWJlbnRldXJlciJ9KSwKKyAgIlVob2ggLi4uIGJsdXRpZ2UgU2FjaGUgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCJibHV0IiwgIldlaWEgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGF1cyBGZWxzIHVuZCBuaWNodCBzb25kZXJsaWNoIGludGVyZXNzYW50LlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiV2VubiBEdSB1ZWJlcmxlZ3N0LCB3YXMgZGEgYWxsZXMgdWViZXIgRGVpbmVtIEtvcGYgc2Nod2VidCAuLi4gb2hvaCFcbiIpOworICBBZGREZXRhaWwoKHsib3JrIiwgIm9ya3MifSksICJEYXZvbiBoYXQgZXMgc2ljaGVyIGVpbmlnZSBpbiBkZXIgTmFlaGUuXG4iKTsKKyAgQWRkRGV0YWlsKCh7Inp3ZXJnIiwgInp3ZXJnZSJ9KSwgIlp3ZXJnZSBoYWJlbiBoaWVybWl0IG5pY2h0cyB6dSB0dW4hXG4iKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTN4MyIpKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTN4MSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRmY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4My5jCkBAIC0wLDAgKzEsMjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgc2NobWFsZSBHYW5nIG1hY2h0XG4iKworICAiaGllciBlaW5lIEJpZWd1bmcgdm9uIE5vcmRlbiBuYWNoIE9zdGVuLCB3byBlciBqZXdlaWxzIGluIGRpZSBEdW5rZWxoZWl0XG4iKworICAiZnVlaHJ0LlxuIik7CisgIEFkZERldGFpbCgiZ2FuZyIsICJEZXIgR2FuZyBtYWNodCBlaW5lIEJpZWd1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkdW5rZWxoZWl0IiwgIlNjaHdhcnplIER1bmtlbGhlaXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGlzdCBuaWNodHMgQmVzb25kZXJlcyB6dSBzZWhlbi5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3QgdG90YWwgbGFuZ3dlaWxpZy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJBbiBkZXIgV2FuZCBoYWVuZ3QgZWluZSBIYW5kLlxuIik7CisgIEFkZERldGFpbCgiaGFuZCIsICJBY2ggbmVlLCBoYXQgc2ljaCBudXIgZ2VyZWltdC5cbiIpOworICBBZGREZXRhaWwoImJpZWd1bmciLCAiU2llIGZ1ZWhydCBuYWNoIE5vcmRlbiB1bmQgT3N0ZW4uXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTN4MiIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNHgzIikpOworICBBZGRJdGVtKE1PTigib3JrIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk0OTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4NC5jCkBAIC0wLDAgKzEsMzkgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gTWV0YWxsYmVzY2hsYWdlbmUgV2FlbmRlXG4iKworICAidW1yaW5nZW4gRGljaCBpbSBOb3JkZW4sIE9zdGVuIHVuZCBTdWVkZW4gd2FlaHJlbmQgZWluIHJvZWhyZW5hcnRpZ2VyIEdhbmdcbiIrCisgICJuYWNoIFdlc3RlbiBmdWVocnQuIEF1c3NlcmRlbSBiZWZpbmRldCBzaWNoIGltIEJvZGVuIGVpbiBMb2NoLCBkdXJjaCBkYXNcbiIrCisgICJlaW5lIExlaXRlciBuYWNoIHVudGVuIGZ1ZWhydC5cbiIpOworICBBZGREZXRhaWwoImxvY2giLCAiV2FzIGVpbmVuIGRhIHVudGVuIHdvaGwgZXJ3YXJ0ZW4gbWFnP1xuIik7CisgIEFkZERldGFpbCgibGVpdGVyIiwgIkRpZSBMZWl0ZXIgZnVlaHJ0IG5hY2ggdW50ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJJbSBCb2RlbiBpc3QgZWluIExvY2guXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgImRlY2tlIiwgIm1ldGFsbCJ9KSwgIkFsbGVzIGlzdCBhdXMgTWV0YWxsLlxuIik7CisgIEFkZERldGFpbCgoeyJyb2VocmUiLCAiZ2FuZyJ9KSwgIkRlciBHYW5nIGZ1ZWhydCBuYWNoIFdlc3Rlbi5cbiIpOworICBBZGRJdGVtKE1PTigidGl0YW53YWx6ZSIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm0yeDQiKSk7CisgIEFkZFNwZWNpYWxFeGl0KCJ1bnRlbiIsICJ1bnRlbiIpOworfQorCit1bnRlbigpCit7CisgIGlmIChwcmVzZW50KCJ0aXRhbndhbHplIikpCisgIHsKKyAgICB3cml0ZSgiRGllIFRpdGFud2FsemUgbGFlc3N0IERpY2ggbmljaHQgdm9yYmVpLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgdGhpc19wbGF5ZXIoKS0+bW92ZShMMigibTN4NCIpLCBNX0dPLCAibmFjaCB1bnRlbiIpOworICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKCJib2luZzpkcm9tX21hcmtlciIsIDEpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDUuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL20zeDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM1OGZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTN4NS5jCkBAIC0wLDAgKzEsMjYgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERlciByb2VocmVuYXJ0aWdlIEdhbmdcbiIrCisgICJmdWVocnQgdm9uIE9zdGVuIG5hY2ggV2VzdGVuIGR1cmNoIGRpZSBEdW5rZWxoZWl0LCBudXIgaGllciBnbGFlbnp0IGRhc1xuIisKKyAgIk1ldGFsbCBpbiBEZWluZW0gTGljaHQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImdhbmciLCAicm9laHJlIn0pLCAiV2VyIHdvaGwgZGllc2VuIEdhbmcgYW5nZWxlZ3QgaGF0P1xuIik7CisgIEFkZERldGFpbCgiZHVua2VsaGVpdCIsICJEdSBrYW5uc3Qgc2llIG5pY2h0IGVycmVpY2hlbiwgc29sYW5nZSBEdSBEZWluIExpY2h0IGFuIGxhZXNzdC5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJBbGxlcyBoaWVyIGlzdCBhdXMgYmxhbmtlbSBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJaaWVtbGljaCB1bmludGVyZXNzYW50LlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkhleSEgRGEgaXN0IGVpbmUgSW5zY2hyaWZ0IVxuIik7CisgIEFkZERldGFpbCgiaW5zY2hyaWZ0IiwgIkRhcyBpc3QgZXR3YXMsIHdhcyBtYW4gbGVzZW4ga2Fubi5cbiIpOworICBBZGRSZWFkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUgbGllc3Q6IEJvaW5nIHdhciBoaWVyLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiSXN0IHNpZSBuaWNodCBodWVic2NoP1xuIik7CisgIEFkZEV4aXQoIm9zdGVuIixMMSgibTR4NSIpKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTJ4NSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDEuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQzNTFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4MS5jCkBAIC0wLDAgKzEsMzggQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRHUgaGFzdCBkaWUgSG9laGxlIGVpbmVzXG4iKworICAic2NocmVja2xpY2hlbiBVbnRpZXJzIGVycmVpY2h0LiBEZXIgR2VzdGFuayBpc3Qgd2lya2xpY2ggZ3JhdWVuZXJyZWdlbmRcbiIrCisgICJ1bmQgZGVyIEFuYmxpY2sgcnVtbGllZ2VuZGVyIEtub2NoZW4gdW5kIGhhbGIgdmVyd2VzdGVyIEtvZXJwZXJ0ZWlsZSB2b25cbiIrCisgICJhcm1lbiBPcGZlcm4gdHV0IHNlaW4gVWVicmlnZXMsIHVtIERpciBkZW4gQXBwZXRpdCB6dSB2ZXJkZXJiZW4uIERlclxuIisKKyAgImVpbnppZ2UgQXVzZ2FuZyBhdXMgZGllc2VtIExvY2ggYmVmaW5kZXQgc2ljaCBpbSBPc3Rlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9laGxlIiwgImxvY2gifSksICJFaW4gdWVibGVzIExvY2gsIGluIGRhcyBEdSBoaWVyIGdlcmF0ZW4gYmlzdC5cbiIpOworICBBZGREZXRhaWwoImdlc3RhbmsiLCAiRGlyIHdpcmQgYmVpbmFoZSBzY2hsZWNodC5cbiIpOworICBBZGREZXRhaWwoKHsidGVpbGUiLCAia29lcnBlcnRlaWxlIn0pLCAiQnVhaCwgZGFzIGlzdCBqYSB3aWRlcmxpY2guXG4iKTsKKyAgQWRkRGV0YWlsKCJhdXNnYW5nIiwgIkRlciBBdXNnYW5nIGlzdCBpbSBPc3Rlbi5cbiIpOworICBBZGRTcGVjaWFsRGV0YWlsKCJrbm9jaGVuIiwgImtub2NoZW4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGxhbmd3ZWlsaWcgdW5kIGdyYXUuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaXN0IHVuaW50ZXJlc3NhbnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEaWUgdmVyd2VzZW5kZW4gS29lcnBlcnRlaWxlIGF1ZiBkZW0gQm9kZW4gc2luZCBrZWluIHNjaG9lbmVyIEFuYmxpY2suXG4iKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNXgxIikpOworICBBZGRJdGVtKE1PTigidHJvbGxtb3BzIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KKwora25vY2hlbigpCit7CisgICBpZiAocHJlc2VudCgidHJvbGxtb3BzIikpCisgICAgICByZXR1cm4gIkRlciBUcm9sbG1vcHMgbGFlc3N0IG5pY2h0IHp1LCBkYXNzIER1IHNlaW4gQWJlbmRlc3NlbiBkdXJjaHd1ZWhsc3QuXG4iOworCisgICBpZiAodGhpc19wbGF5ZXIoKS0+RmluZFBvdGlvbigiRHUgd3VlaGxzdCBpbiBkZW4gS25vY2hlbiBoZXJ1bSB1bmQgZmluZGVzdCBlaW5lbiBaYXViZXJ0cmFuay5cbiIpKQorICAgICAgcmV0dXJuICIiOworICAgcmV0dXJuICJEdSB3dWVobHN0IGluIGRlbiBLbm9jaGVuIGhlcnVtLCBmaW5kZXN0IGFiZXIgbmljaHRzLlxuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDU2ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4Mi5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEYXMgaGllciBzY2hlaW50IHdvaGxcbiIrCisgICJkZXIgQXVmZW50aGFsdHNyYXVtIHZvbiBlaW4gcGFhciBzdGlua2VuZGVuIFRyb2xsZW4genUgc2Vpbi4gRWluZSBNZW5nZVxuIisKKyAgImFsdGVyIEtub2NoZW4gbGllZ2VuIGF1ZiBkZW0gQm9kZW4gcnVtIHVuZCBpbiBkZXIgRWNrZSBzdGlua3QgZWluIGdyb3NzZXJcbiIrCisgICJIYXVmZW4gVHJvbGxrb3Qgdm9yIHNpY2ggaGluLiBBbGxlcyBpbiBhbGxlbSBrZWluIGdlbXVldGxpY2hlciBPcnQsXG4iKworICAidmllbGxlaWNodCBzb2xsdGVzdCBEdSBpaG4gbmFjaCBTdWVkZW4gdmVybGFzc2VuLlxuIik7CisgIEFkZERldGFpbCgia25vY2hlbiIsICJEaWUgS25vY2hlbiB3dXJkZW4gdm9uIFRyb2xsZW4gYWJnZW5hZ3QuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGxpZWdlbiBLbm9jaGVuLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiRGllIERlY2tlIGhpZXIgaXN0IG5pY2h0IHNvIGdyYXVlbmhhZnQgaW50ZXJlc3NhbnQsIGljaCB3ZXR0ZSBlcyB3aXJkXG5pbnRlcmVzc2FudGVyLCB3ZW5uIER1IGVpbiBwYWFyIEViZW5lbiB0aWVmZXIgdm9yZHJpbmdzdC5cbiIpOworICBBZGREZXRhaWwoKHsiZWJlbmUiLCAiZWJlbmVuIn0pLCAiVGphLCB3ZW5uIER1IHd1ZXNzdGVzdCB3aWV2aWVsZSBIb2hscmFldW1lIHNpY2ggdW50ZXIgRGlyIGJlZmluZGVuLCBkYW5uXG53dWVyZGVzdCBEdSBoaWVyIG5pY2h0IHNvIHJ1aGlnIHN0ZWhlbi5cbiIpOworICBBZGREZXRhaWwoKHsiaG9obHJhdW0iLCAiaG9obHJhZXVtZSJ9KSwgIkVya3VuZGUgc2llISBTb2ZvcnQhXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiU2llIHNpbmQgdmVyc2NobWllcnQgdW5kIGVrZWxoYWZ0LlxuIik7CisgIEFkZERldGFpbCgidHJvbGwiLCAiS2VpbmVyIGRhISBBZXRzY2hiYWV0c2NoIVxuIik7CisgIEFkZERldGFpbCgiZWNrZSIsICJXdWVyZyFcbiIpOworICBBZGREZXRhaWwoKHsidHJvbGxrb3QiLCAia290IiwgImhhdWZlbiJ9KSwgIklnaXR0ISBEYXMgc3Rpbmt0IGphIGVyYmFlcm1saWNoLlxuIik7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm00eDMiKSk7CisgIEFkZEl0ZW0oTU9OKCJ0cm9sbCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEl0ZW0oTU9OKCJ0cm9sbCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZENtZCgiZXJrdW5kZSIsICJlcmt1bmRlbiIpOworfQorCitlcmt1bmRlbihzdHIpCit7IAorICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZXJrdW5kZW4/XG4iKTsKKyAgIGlmICghc3RyIHx8IChzdHIhPSJob2hscmF1bSIgJiYgc3RyICE9ImhvaGxyYWV1bWUiKSkKKyAgICAgIHJldHVybiAwOworICAgd3JpdGUoIkFsc28gZWluIGJpc3NjaGVuIG1laHIgbXVzc3QgRHUgZGEgc2Nob24gZnVlciB0dW4uXG4iKTsKKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4My5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDcyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHgzLmMKQEAgLTAsMCArMSwzMSBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgZHVyY2ggZGVuIGhhcnRlblxuIisKKyAgIkZlbHMgZ2VoYXVlbmUgR2FuZyB2ZXJ6d2VpZ3Qgc2ljaCBoaWVyIG5hY2ggTm9yZGVuLCBPc3RlbiB1bmQgV2VzdGVuLlxuIisKKyAgIkR1IHN0ZWxsc3QgZmVzdCwgZGFzcyB2b20gTm9yZGVuIGhlciBlaW4gemllbWxpY2ggdW5hbmdlbmVobWVyIEdlcnVjaFxuIisKKyAgImtvbW10LlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEZXIgRmVscyB3dXJkZSB2b24gT3JrcyBvZGVyIFRyb2xsZW4gYmVhcmJlaXRldCwgdW5kIGRhcyB6aWVtbGljaCBzY2hsZWNodC5cbiIpOworICBBZGREZXRhaWwoKHsiZ2FuZyIsICJnYWVuZ2UifSksICJEZXIgR2FuZyB2ZXJ6d2VpZ3Qgc2ljaCBoaWVyLlxuIik7CisgIEFkZERldGFpbCgiZ2VydWNoIiwgIk1hbiBrb2VubnRlIGVzIGF1Y2ggR2VzdGFuayBuZW5uZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJnZXN0YW5rIiwgIldlbm4gZGVyIEhpbW1lbCBoaWVyIHNpY2h0YmFyIHdhZXJlLCB3dWVyZGUgZXMgenUgaWhtIHN0aW5rZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJBdWYgZGVtIEJvZGVuIGZpbmRlc3QgRHUgbmljaHRzIHZvbiBCZWRldXR1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJHcmF1ZXIgRmVscy5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJBbiBkZXIgV2FuZCBzaWVoc3QgRHUgZWluZSBJbnNjaHJpZnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUga2FubnN0IHNpZSBsZXNlbi5cbiIpOworICBBZGRSZWFkRGV0YWlsKCJpbnNjaHJpZnQiLCAiRHUgbGllc3Q6IE5pY2h0IGFsbGVzLCB3YXMgbWFuIG5pY2h0IHNpZWh0LCBpc3QgYXVjaCB3aWNodGlnLlxuIik7CisgIEFkZERldGFpbCgoeyJvcmtzIiwgInRyb2xsZSJ9KSwgIkRpZSBsYXVmZW4gaGllciBpcmdlbmR3byBydW0gLi4uIG9kZXIgbGllZ2VuIHRvdCBpbiBkZXIgRWNrZS5cbiIpOworICBBZGREZXRhaWwoImVja2UiLCAiSW4gZGllc2VyIEVja2Ugc2luZCBqZWRlbmZhbGxzIGtlaW5lLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm00eDIiKSk7CisgIEFkZEV4aXQoIm9zdGVuIixMMSgibTV4MyIpKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTN4MyIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA0ODVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTR4NC5jCkBAIC0wLDAgKzEsMjggQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIk1ldGFsbGViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRGllcyBpc3QgendlaWZlbGxvcyBkaWVcbiIrCisgICJIZWltYXQgZWluZXMgZGVyIGJlcnVlY2h0aWd0ZW4gRWlzZW5mcmVzc2VyLCBkaWUgV2FlbmRlIHNlaGVuIGF1Y2ggc2Nob25cbiIrCisgICJnYW56IHplcm5hZ3QgYXVzLiBEZXIgZWluemlnZSBBdXNnYW5nIGZ1ZWhydCBuYWNoIFN1ZWRlbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEaWUgV2FlbmRlIHNpbmQgYXVzIHJlaW5lbSBFaXNlbiB1bmQgd3VyZGVuIHZvbiBlaW5lbSBFaXNlbmZyZXNzZXIgc2Nob25cbnppZW1saWNoIHN0YXJrIG1pc3NoYW5kZWx0LlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiRGVyIEJvZGVuIGlzdCBhdXMgTWV0YWxsIHVuZCBmdW5rZWx0IGltIExpY2h0LiBTb2xsdGVzdCBEdSBuYXR1ZXJsaWNoIE5hY2h0LVxuc2ljaHQgaGFiZW4sIGRhbm4gZnVua2VsdCBlcyBudXIgaW4gRGVpbmVyIEVpbmJpbGR1bmcuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaGF0IGVpbmUgZ2V3YWx0aWdlIExhc3QgenUgdHJhZ2VuLlxuIik7CisgIEFkZERldGFpbCgibGFzdCIsICJGcmFnIG1pY2ggbmljaHQgd2lldmllbGUgVG9ubmVuIEdlc3RlaW4gc2ljaCB1ZWJlciBEaXIgYmVmaW5kZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJnZXN0ZWluIiwgIlNvd2FzIGdpYnQgZXMgaW0gR2ViaXJnZSwgd2VubiBlcyBhdWNoIGhpZXIgbmljaHQgc28gb2ZmZW5zaWNodGxpY2ggaXN0LlxuIik7CisgIEFkZERldGFpbCgiZ2ViaXJnZSIsICJBY2ggaG9lciBkb2NoIGF1ZiAuLi5cbiIpOworICBBZGREZXRhaWwoImVpc2VuZnJlc3NlciIsICJEZXIgaGF0IHNpY2ggd29obCB6dSBUb2RlIGdlZnJlc3Nlbi5cbiIpOworICBBZGREZXRhaWwoKHsibWV0YWxsIiwgImVpc2VuIn0pLCAiRXMgZ2xhZW56dCBtYXR0LlxuIik7CisgIEFkZERldGFpbCgiYXVzZ2FuZyIsICJFciBsaWVndCBpbSBTdWVkZW4uXG4iKTsKKyAgQWRkSXRlbShNT04oImVpc2VuZnJlc3NlciIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm00eDUiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHg1LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNHg1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0Nzc0YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL200eDUuYwpAQCAtMCwwICsxLDI2IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcm9vbSIpOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNZXRhbGxlYmVuZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgICJEdSBiaXN0IGltIEhvZWhsZW5sYWJ5cmludGggZGVyIFNjaHJlY2tlbnNzcGl0emUuIERpZSBtZXRhbGxpc2NoZW4gUm9laHJlblxuIisKKyAgInZlcnp3ZWlnZW4gc2ljaCBoaWVyIG5hY2ggTm9yZGVuLCBPc3RlbiB1bmQgV2VzdGVuLiBJbSBOb3JkZW4gc2NoZWludCBldHdhc1xuIisKKyAgIlVuYW5nZW5laG1lcyB6dSBsYXVlcm4sIG1lcmt3dWVyZGlnZSBHZXJhZXVzY2hlIGRyaW5nZW4gdm9uIGRvcnQgaGllcmhlci5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUiLCAicm9laHJlIiwgInJvZWhyZW4iLCAiZ2FlbmdlIiwgImdhbmcifSksICJEaWUgR2FlbmdlIHNpbmQgdm9lbGxpZyBtaXQgTWV0YWxsIGF1c2dla2xlaWRldC5cbiIpOworICBBZGREZXRhaWwoIm1ldGFsbCIsICJEYXMgTWV0YWxsIGdsYWVuenQgc2lsYmVybi5cbiIpOworICBBZGREZXRhaWwoInVuYW5nZW5laG1lcyIsICJXZXIgd2Vpc3MsIHdhcyBzaWNoIGRvcnQgdmVyYmlyZ3QgLi4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEdSBiaXN0IGZyb2gsIGRhc3MgZXMgaGllciBlaW5lbiBCb2RlbiBnaWJ0LCBzb25zdCB3dWVyZGVzdCBEdSB0aWVmIGZhbGxlbi5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3QgbWV0YWxsaXNjaCB1bmQgZ2xhZW56dC5cbiIpOworICBBZGREZXRhaWwoKHsiZ2VyYWV1c2NoIiwgImdlcmFldXNjaGUifSksICJFcyBxdWlldHNjaHQuXG4iKTsKKyAgQWRkRXhpdCgibm9yZGVuIixMMSgibTR4NCIpKTsKKyAgQWRkRXhpdCgib3N0ZW4iLEwxKCJtNXg1IikpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtM3g1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4MS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjVhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgxLmMKQEAgLTAsMCArMSwyNiBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLCAxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIlN0ZWluZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgZ3JvYiBiZWhhdWVuZSBHYW5nXG4iKworICAibWFjaHQgaGllciBlaW5lIEJpZWd1bmcgdm9uIFN1ZWRlbiBuYWNoIFdlc3Rlbiwgd28gZXIgaW4gZWluZW0gc2Nod2FyemVuXG4iKworICAiTG9jaCB2ZXJzY2h3aW5kZXQsIGF1cyBkZW0gZWluIGZ1ZXJjaHRlcmxpY2hlciBHZXN0YW5rIGRyaW5ndC5cbiIpOyAKKyAgQWRkRGV0YWlsKCJnYW5nIiwgIkRlciBHYW5nIGZ1ZWhydCBpbiBkaWUgRHVua2VsaGVpdC5cbiIpOworICBBZGREZXRhaWwoImR1bmtlbGhlaXQiLCAiU2Nod2FyemUsIGxpY2h0bG9zZSBEdW5rZWxoZWl0LlxuIik7CisgIEFkZERldGFpbCgibG9jaCIsICJIaWVyIGxhdWVydCBpcmdlbmQgZXR3YXMgU2NocmVja2xpY2hlcy5cbiIpOworICBBZGREZXRhaWwoImdlc3RhbmsiLCAiRGVyIEdlc3RhbmsgaXN0IHdpcmtsaWNoIGdyYXVlbmhhZnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJIb3BwbGEsIGhpZXIgbGllZ2VuIEZsZWlzY2hmZXR6ZW4gcnVtLCBpbSBXZXN0ZW4gc2NoZWludCB3b2hsIHdhcyB6dSB3dWV0ZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImZsZWlzY2hmZXR6ZW4iLCAiZmV0emVuIiwgImZsZWlzY2gifSksICJJc3QgamEgZWtsaWchXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIHZlcnNjaG1pZXJ0LlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiR2FlaG4uXG4iKTsKKyAgQWRkRXhpdCgid2VzdGVuIixMMSgibTR4MSIpKTsKKyAgQWRkRXhpdCgic3VlZGVuIixMMSgibTV4MiIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY2YTVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4Mi5jCkBAIC0wLDAgKzEsMjYgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRWluIG1pdCByb2hlciBHZXdhbHQgaW5cbiIrCisgICJkZW4gRmVscyBnZW5hZ3RlciBHYW5nIGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLiBEdSBzcHVlcnN0LCBkYXNzXG4iKworICAiaGludGVyIGplZGVyIEVja2UgT3JrcyBvZGVyIGFuZGVyZXMgdWVibGVzIEdlenVlY2h0IGxhdWVybiBrb2VubmVuLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSJ9KSwgIkRlciBHYW5nIGZ1ZWhydCB2b24gU3VlZGVuIG5hY2ggTm9yZGVuLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJFcyBpc3QgZWluIGhhcnRlciBGZWxzLCBkZXIgdm9uIGJvZXNlbiBXZXNlbiBkdXJjaGJvaHJ0IHd1cmRlLlxuIik7CisgIEFkZERldGFpbCgoeyJvcmsiLCAib3JrcyIsICJnZXp1ZWNodCJ9KSwgIk1vbWVudGFuIHNpZWhzdCBEdSBrZWluZSBPcmtzLCBhYmVyIGRhcyBrYW5uIHNpY2ggamEgc2NobmVsbCBhZW5kZXJuLlxuIik7CisgIEFkZERldGFpbCgiYm9kZW4iLCAiQmxhbmtlciBGZWxzLlxuIik7CisgIEFkZERldGFpbCgiZmVscyIsICJEYXMgd2lyZCBhbGxtYWVobGljaCBsYW5nd2VpbGlnLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiQW4gZGVyIERlY2tlIGhhZW5ndCBlaW5lIGJ1bnRlIEdpcmxhbmRlLlxuIik7CisgIEFkZERldGFpbCgiZ2lybGFuZGUiLCAiV2VyIGRpZSB3b2hsIGRhIGF1ZmdlaGFlbmd0IGhhdD9cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJ3YWVuZGUifSksICJEYSBnaWJ0IGVzIG5pY2h0cyBpbnRlcmVzc2FudGVzIHp1IHNlaGVuLlxuIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm01eDEiKSk7CisgIEFkZEV4aXQoInN1ZWRlbiIsTDEoIm01eDMiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgzLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNGNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL201eDMuYwpAQCAtMCwwICsxLDMyIEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfTElHSFQsIDApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJTdGVpbmViZW5lIik7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgIkR1IGJpc3QgaW0gSG9laGxlbmxhYnlyaW50aCBkZXIgU2NocmVja2Vuc3NwaXR6ZS4gRHVua2xlIEdhZW5nZSBmdWVocmVuXG4iKworICAibmFjaCBOb3JkZW4sIFN1ZWRlbiB1bmQgV2VzdGVuLiBEZXIgc3VlZGxpY2hlIEdhbmcgaXN0IGV0d2FzIG1lcmt3dWVyZGlnLFxuIisKKyAgImRlbm4gc2VpbiBFaW5nYW5nIGlzdCBtaXQgZ2xhZW56ZW5kZW0gTWV0YWxsIHNlbHRzYW0gYmVzY2hsYWdlbi5cbiIpOworICBBZGREZXRhaWwoKHsiZmVsc2JvZGVuIiwgImJvZGVuIn0pLCAiRGVyIGJsYW5rZSBGZWxzYm9kZW4gZ2VodCBpbSBTdWVkZW4gaW4gTWV0YWxsIHVlYmVyLlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSJ9KSwgIkVzIHNpbmQgR2FlbmdlIGRlciBPcmtzLlxuIik7CisgIEFkZERldGFpbCgiZWluZ2FuZyIsICJJbSBTdWVkZW4gZ2xhZW56ZW4gZGllIFdhZW5kZSwgZGllIG1pdCBNZXRhbGwgYmVzY2hsYWdlbiBzaW5kLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkRpZSBXYWVuZGUgc2luZCBkYSAuLi4gd2llIGltbWVyLlxuIik7CisgIEFkZERldGFpbCgiZGVja2UiLCAiRGllIERlY2tlIGlzdCBuaWNodCBpbnRlcmVzc2FudC5cbiIpOworICBBZGREZXRhaWwoImZlbHMiLCAiR3JhdWVyIEZlbHMuXG4iKTsKKyAgQWRkRGV0YWlsKCJtZXRhbGwiLCAiRXMgc2NoZWludCBFaXNlbiB6dSBzZWluLlxuIik7CisgIEFkZERldGFpbCgiZWlzZW4iLCAiSmEsIHp3ZWlmZWxsb3MsIGVzIGlzdCBFaXNlbi5cbiIpOworICBBZGRFeGl0KCJ3ZXN0ZW4iLEwxKCJtNHgzIikpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtNXgyIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtNXg0IikpOworCisgIEFkZEl0ZW0oTU9OKCJvcmtjaGVmIiksIFJFRlJFU0hfUkVNT1ZFKTsKK30KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWQxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXg0LmMKQEAgLTAsMCArMSwyNSBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEZXIgR2FuZywgZGVyIGhpZXIgdm9uXG4iKworICAiTm9yZGVuIG5hY2ggU3VlZGVuIGZ1ZWhydCwgYWVobmVsdCBtZWhyIGVpbmVyIFJvZWhyZSwgZGVubiBhbGxlcyBpc3Qgdm9sbC1cbiIrCisgICJzdGFlbmRpZyBhdXMgZWluZW0gZ2xhZW56ZW5kZW4gTWV0YWxsLiBEdSBmcmFnc3QgRGljaCwgd2VyIHdvaGwgZGllc2VcbiIrCisgICJHYWVuZ2UgYW5nZWxlZ3QgaGF0LlxuIik7CisgIEFkZERldGFpbCgoeyJnYW5nIiwgImdhZW5nZSIsICJyb2VocmUiLCAicm9ociJ9KSwgIkRpZSBHYWVuZ2Ugc2luZCB2b2VsbGlnIG1pdCBNZXRhbGwgYXVzZ2VrbGVpZGV0LlxuIik7CisgIEFkZERldGFpbCgibWV0YWxsIiwgIkRhcyBNZXRhbGwgZ2xhZW56dCBzaWxiZXJuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkRpZSBXYWVuZGUgZ2xhZW56ZW4gc2lsYmVybi5cbiIpOworICBBZGREZXRhaWwoImJvZGVuIiwgIlNlaSBmcm9oLCBkYXNzIGVyIGRhIGlzdC5cbiIpOworICBBZGREZXRhaWwoImRlY2tlIiwgIkRpZSBEZWNrZSBpc3Qgd2lya2xpY2ggemllbWxpY2ggbGFuZ3dlaWxpZy5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLEwxKCJtNXgzIikpOworICBBZGRFeGl0KCJzdWVkZW4iLEwxKCJtNXg1IikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbDEvbTV4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTliYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9tNXg1LmMKQEAgLTAsMCArMSwyNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiTWV0YWxsZWJlbmUiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBFaWdlbnRsaWNoIGtvZW5udGUgbWFuXG4iKworICAiZXMgYXVjaCBmYXN0IFJvZWhyZW5sYWJ5cmludGggbmVubmVuLCBkZW5uIER1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyXG4iKworICAic29sY2hlbiwgZGllIGhpZXIgZWluZSBCaWVndW5nIHZvbiBOb3JkZW4gbmFjaCBXZXN0ZW4gbWFjaHQuIERpZSBXYWVuZGVcbiIrCisgICJzaW5kIGF1cyBlaW5lbSBnbGFlbnplbmRlbiBNZXRhbGwgZ2VmZXJ0aWd0LCB3YXMgRGlyIHppZW1saWNoIG1lcmt3dWVyZGlnXG4iKworICAidm9ya29tbXQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIiwgInJvZWhyZSIsICJyb2VocmVuIiwgImdhZW5nZSIsICJnYW5nIn0pLCAiRGllIEdhZW5nZSBzaW5kIHZvZWxsaWcgbWl0IE1ldGFsbCBhdXNnZWtsZWlkZXQuXG4iKTsKKyAgQWRkRGV0YWlsKCJtZXRhbGwiLCAiRGFzIE1ldGFsbCBnbGFlbnp0IHNpbGJlcm4uXG4iKTsKKyAgQWRkRGV0YWlsKCJib2RlbiIsICJEZXIgQm9kZW4gaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCJkZWNrZSIsICJTZWxic3QgZGllIERlY2tlIGdsYWVuenQgbWV0YWxsaXNjaCwgRHUgZnJhZ3N0IERpY2gsIHdlciBkYXMgYW5nZWxlZ3QgaGF0LlxuIik7CisgIEFkZERldGFpbCgiYmllZ3VuZyIsICJEaWUgQmllZ3VuZyBmdWVocnQgdm9uIE5vcmRlbiBuYWNoIFdlc3Rlbi5cbiIpOworICBBZGRJdGVtKE1PTigia2FtcGZibGVjaCIpLCBSRUZSRVNIX1JFTU9WRSk7CisgIEFkZEV4aXQoIm5vcmRlbiIsTDEoIm01eDQiKSk7CisgIEFkZEV4aXQoIndlc3RlbiIsTDEoIm00eDUiKSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9sMS9vYmVuLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9sMS9vYmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiYzAzOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL2wxL29iZW4uYwpAQCAtMCwwICsxLDI3IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisgCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyAKK2NyZWF0ZSgpCit7CisgIHJlcGxhY2VfcHJvZ3JhbSgic3RkL3Jvb20iKTsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAwKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQmVpbSBLbm9jaGVuc2NoYWVsZXIiKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAiRHUgYmlzdCBpbSBIb2VobGVubGFieXJpbnRoIGRlciBTY2hyZWNrZW5zc3BpdHplLiBEaWVzZXIga2xlaW5lIFJhdW0gaXN0XG4iKworICAiZGllIEhlaW1hdCBlaW5lcyBmdWVyY2h0ZXJsaWNoZW4gVW5nZWhldWVycywgZGllIEhlaW1hdCBkZXMgc2NocmVja2xpY2hlblxuIisKKyAgIktub2NoZW5zY2hhZWxlcnMuIEltIEJvZGVuIGRlcyBSYXVtcyBpc3QgZWluIGtsZWluZXMgTG9jaCwgZHVyY2ggZGFzIGVpbmVcbiIrCisgICJMZWl0ZXIgbmFjaCB1bnRlbiBmdWVocnQuXG4iKTsKKyAgQWRkRGV0YWlsKCJyYXVtIiwgIkRlciBSYXVtIGlzdCB6aWVtbGljaCBrbGVpbi5cbiIpOworICBBZGREZXRhaWwoKHsid2FuZCIsICJkZWNrZSIsICJ3YWVuZGUiLCAibWV0YWxsIn0pLCAiQWxsZXMgaXN0IGF1cyBNZXRhbGwuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImJvZGVuIiwgImxvY2gifSksICJJbSBCb2RlbiBpc3QgZWluIExvY2gsIGR1cmNoIGRhcyBlaW5lIExlaXRlciBuYWNoIHVudGVuIGZ1ZWhydC5cbiIpOworICBBZGREZXRhaWwoImxlaXRlciIsICJEaWUgTGVpdGVyIGZ1ZWhydCBuYWNoIHVudGVuLlxuIik7CisgIEFkZERldGFpbCgidW5nZWhldWVyIiwgIkRlciBLbm9jaGVuc2NoYWVsZXIgaXN0IGVpbmZhY2ggZnVlcmNodGVybGljaC5cbiIpOworICBBZGREZXRhaWwoImtub2NoZW5zY2hhZWxlciIsICJadW0gR2x1ZWNrIGlzdCBlciBnZXJhZGUgbmljaHQgZGFoZWltLlxuIik7CisgIEFkZEl0ZW0oTU9OKCJrbm9jaGVuc2NoYWVsZXIiKSwgUkVGUkVTSF9SRU1PVkUpOworICBBZGRFeGl0KCJ1bnRlbiIsIEwxKCJtMngyIikpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Rvc2Vub2VmZm5lci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Rvc2Vub2VmZm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDYyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vZG9zZW5vZWZmbmVyLmMKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBBZGRJZCgoeyJkb3Nlbm9lZmZuZXIiLCAib2VmZm5lciJ9KSk7CisgICBBZGRBZGplY3RpdmUoKHsibW9iaWxlciIsICJtb2JpbGVuIn0pKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBtb2JpbGVyIERvc2Vub2VmZm5lciIpOworICAgU2V0UHJvcChQX0xPTkcsICJEZXIgRG9zZW5vZWZmbmVyIG1vZWNodGUgRGlyIHNpY2hlcmxpY2ggZGVuIEtvcGYgbWl0IHNlaW5lbiBzY2hhcmZlblxuU2NobmVpZGVyYWVkZXJuIG9lZmZuZW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiRG9zZW5vZWZmbmVyIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTIpOworICAgU2V0UHJvcChQX01BWF9IUCwgMTIwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTEyMyk7CisgICBTZXRQcm9wKFBfQk9EWSwgODApOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHNjaGFyZmVuIFNjaG5laWRlcmFlZGVybiIsIDUwfSkpOworICAgU2V0UHJvcChQX1hQLCAzMDAwMCk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwKSs0MCk7CisgICBzZXRfbGl2aW5nX25hbWUoImRvc2Vub2VmZm5lciIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Vpc2VuZnJlc3Nlci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2Vpc2VuZnJlc3Nlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2IwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vZWlzZW5mcmVzc2VyLmMKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBBZGRJZCgoeyJlaXNlbmZyZXNzZXIiLCAiZnJlc3NlciJ9KSk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gRWlzZW5mcmVzc2VyIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJFaXNlbmZyZXNzZXIgZXJuYWVocmVuIHNpY2ggYXVzc2NobGllc3NsaWNoIHZvbiBFaXNlbiwgYWxsZXJkaW5ncyBzaW5kXG4iKworICAgInNpZSBzbyBrdXJ6c2ljaHRpZywgZGFzcyBzaWUgZXJzdG1hbCBpbiBhbGxlcyByZWluYmVpc3Nlbiwgd2FzIHNpZVxuIisKKyAgICJpcmdlbmR3aWUgd2Focm5laG1lbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJFaXNlbmZyZXNzZXIiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxNTApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMjE1KTsKKyAgIFNldFByb3AoUF9CT0RZLCA3NSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgZWlzZW5iZXNjaGxhZ2VuZW4gWmFlaG5lbiIsIDU1fSkpOworICAgU2V0UHJvcChQX1hQLCA0MjAwMCk7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMSk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwMCkrNTApOyAgIC8qIE5hamEsIGt1cnpzaWNodGlnIGhhbHQuLi4gOy0pICovCisgICBzZXRfbGl2aW5nX25hbWUoImVpc2VuZnJlc3NlciIpOworICAgQWRkSXRlbSggT0JKKCJlaXNlbmtsdW1wZW4iKSApOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2thbXBmYmxlY2guYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9rYW1wZmJsZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxOGQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9rYW1wZmJsZWNoLmMKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0ICJzdGQvbnBjIjsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS2FtcGZibGVjaCIpOworICAgU2V0UHJvcChQX0xPTkcsIAorICAgIkRhcyBLYW1wZmJsZWNoIHNpZWh0IGlyZ2VuZHdpZSBhdXMgd2llIGVpbiBub3JtYWxlcyBCYWNrYmxlY2gsIG51clxuIisKKyAgICJ2aWVsIGdlZmFlaHJsaWNoZXIhXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiS2FtcGZibGVjaCIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJibGVjaCIsICJrYW1wZmJsZWNoIiwiXG5rYW1wZmJsZWNoIn0pKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgOCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxMDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMzMpOworICAgU2V0UHJvcChQX0JPRFksIDcwKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBlaXNlbmhhcnRlbiBTY2hsYWVnZW4iLCA2MH0pKTsKKyAgIFNldFByb3AoUF9YUCwgMzAwMDApOworICAgU2V0UHJvcChQX1NJWkUsIDQwKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiTWV0YWxsbW9uc3RlciIpOworICAgU2V0UHJvcChQX1ZVTE5FUkFCSUxJVFksICh7IERUX1dBVEVSIH0pKTsKKyAgIFNldFByb3AoUF9OT0NPUlBTRSwgMSk7CisgICBTZXRQcm9wKFBfRElFX01TRywgIiBmYWVsbHQgbGF1dCBzY2hlcHBlcm5kIHVtLlxuIik7CisgICBzZXRfbGl2aW5nX25hbWUoImthbXBmYmxlY2giKTsKK30KKworZGllKCkKK3sKKyAgIGNsb25lX29iamVjdChPQkooImthbXBmYmxlY2giKSktPm1vdmUoZW52aXJvbm1lbnQoKSk7CisgICA6OmRpZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2tub2NoZW5zY2hhZWxlci5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL2tub2NoZW5zY2hhZWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzFlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24va25vY2hlbnNjaGFlbGVyLmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgS25vY2hlbnNjaGFlbGVyIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJEZXIgS25vY2hlbnNjaGFlbGVyIGdlaHQgdW0sIGdlaHQgdW1cbiIrCisgICAiRGVyIEtub2NoZW5zY2hhZWxlciBnZWh0IHVtLCBnZWh0IHVtXG4iKworICAgIlNlaW4gTWVzc2VyIHNvIGxhbmcsIHdpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmVcbiIrCisgICAiV2llIHRhdXNlbmQgZ3Jvc3NlIFphZWhuZSwgc2VpbiBNZXNzZXIgc28gbGFuZ1xuIisKKyAgICJFciBzY2huZWlkZXQgRGljaCBpbiBTdHVlY2tlLCBwb3J0aW9uc2dlcmVjaHQgdW5kIGZlaW5cbiIrCisgICAiRXIgc2NobmVpZGV0IERpY2ggaW4gU3R1ZWNrZSwgdW5kIGtlaW5lciB0dXRzIGlobSBnbGVpY2hcbiIrCisgICAiRXIgc2NoYWVsdCBkaWUgS25vY2hlbiwgZXIgcXVhZWx0IERlaW5lbiBHZWlzdFxuIisKKyAgICJFciBzY2hhZWx0IGRpZSBLbm9jaGVuLCBlciBxdWFlbHQgRGVpbmVuIEdlaXN0XG4iKworICAgIkhhYmV0IGFjaHQsIGhhYmV0IGFjaHQhIFNlaWV0IHZvcnNpY2h0aWcsIGhhYmV0IEFjaHQhXG4iKworICAgIlNjaGF1IERpY2ggdW0sIHNjaGF1IERpY2ggdW1cbiIrCisgICAiU2NoYXUgRGljaCB1bSwgRHUgd2lyc3QgZGVyIG5hZWNoc3RlIHNlaW5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJLbm9jaGVuc2NoYWVsZXIiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgQWRkSWQoKHsic2NoYWVsZXIiLCAia25vY2hlbnNjaGFlbGVyIn0pKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTgpOworICAgU2V0UHJvcChQX01BWF9IUCwgMzAwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTc4OSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVtIGxhbmdlbiBNZXNzZXIiLCAxNDV9KSApOworICAgU2V0UHJvcChQX0JPRFksIDExMCk7CisgICBTZXRQcm9wKFBfWFAsIDIyMDAwMCk7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMSk7CisgICBTZXRQcm9wKFBfU0laRSwgMjIwKTsKKyAgIHNldF9saXZpbmdfbmFtZSgia25vY2hlbnNjaGFlbGVyIik7CisgICBjbG9uZV9vYmplY3QoT0JKKCJzY2hhZWxtZXNzZXIiKSktPm1vdmUodGhpc19vYmplY3QoKSk7CisgICBjb21tYW5kKCJ6dWVja2UgbWVzc2VyIik7Cit9CisKK1F1ZXJ5QXJ0aWNsZShjLCBkLCBmKQoreworICAgcmV0dXJuIDo6UXVlcnlBcnRpY2xlKGMsIDEsIGYpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL21ldGFsbG1vbnN0ZXIuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9tZXRhbGxtb25zdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4MjE4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9tZXRhbGxtb25zdGVyLmMKQEAgLTAsMCArMSwyOCBAQAoraW5oZXJpdCAic3RkL25wYyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfTk9DT1JQU0UsIDEpOworICAgU2V0UHJvcChQX1JBQ0UsICJNZXRhbGxtb25zdGVyIik7CisgICBTZXRQcm9wKFBfRElFX01TRywgIiB6ZXJmYWVsbHQgaW4gc2VpbmUgQmVzdGFuZHRlaWxlLlxuIik7CisgICBTZXRQcm9wKFBfVlVMTkVSQUJJTElUWSwgKHsgRFRfV0FURVIgfSkpOworfQorCitkaWUoKQoreworICAgY3JlYXRlX2JsZWNoKCk7CisgICA6OmRpZSgpOworfQorCitjcmVhdGVfYmxlY2goKQoreworICAgb2JqZWN0IGI7CisgICBiID0gY2xvbmVfb2JqZWN0KE9CSigiYmxlY2giKSk7CisgICBiLT5tb3ZlKGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmsuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL29yay5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIGdyaW1taWdlciBPcmsiKTsKKyAgIFNldFByb3AoUF9MT05HLCAiRGVyIE9yayBzY2hhdXQgRGljaCB1bmZyZXVuZGxpY2ggYW4gdW5kIHdlZGVsdCBtaXQgc2VpbmVtIEtydW1tc2Nod2VydC5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJPcmsiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICAgQWRkSWQoIm9yayIpOworICAgU2V0UHJvcChQX1JBQ0UsICJPcmsiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTApOworICAgU2V0UHJvcChQX01BWF9IUCwgMTMwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTI1MCk7CisgICBTZXRQcm9wKFBfWFAsIDkwMDAwKTsKKyAgIFNldFByb3AoUF9CT0RZLCA1MCk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDIwKSsxMTApOworICAgc2V0X2xpdmluZ19uYW1lKCJvcmsiKTsKKyAgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgIEFkZEl0ZW0oT0JKKCJrcnVtbXNjaHdlcnQiKSxDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigib3JraG9zZSIpLENMT05FX1dFQVIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL29ya2NoZWYuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmtjaGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2ZTZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9vcmtjaGVmLmMKQEAgLTAsMCArMSwyOSBAQAoraW5oZXJpdCAic3RkL25wYyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gQW5mdWVocmVyIGRlciBPcmtzIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkRpZXMgaXN0IGVpbiBmZXR0ZXIsIHN0aW5rZW5kZXIgT3JrLUhhZXVwdGxpbmcsIGRlciBEaXIgYWxsZXMgXG5hbmRlcmUgYWxzIGZyZXVuZGxpY2ggZ2Vzb25uZW4gaXN0LlxuIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIk9yayIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgICBBZGRJZCgoeyJvcmsiLCAiYW5mdWVocmVyIiwgImhhZXVwdGxpbmcifSkpOworICAgU2V0UHJvcChQX1JBQ0UsICJPcmsiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMTYpOworICAgU2V0UHJvcChQX01BWF9IUCwgMjIwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTI4MCk7CisgICBTZXRQcm9wKFBfWFAsIDE2MDAwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgNjApOworICAgU2V0UHJvcChQX1NJWkUsIHJhbmRvbSgyMCkrMTMwKTsKKyAgIHNldF9saXZpbmdfbmFtZSgib3JrY2hlZiIpOworICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgQWRkSXRlbShPQkooInNhZWJlbCIpLENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJvcmtob3NlIiksQ0xPTkVfV0VBUik7CisgICBBZGRJdGVtKE9CSigib3JraGVsbSIpLENMT05FX1dFQVIpOworfQorCisgICAgICAKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi9zdGFobGRyYWNoZS5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3N0YWhsZHJhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlZmNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi9zdGFobGRyYWNoZS5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBNTU9OU1Q7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFN0YWhsZHJhY2hlIik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICJEZXIgU3RhaGxkcmFjaGUgaXN0IGVpbiBlcm5zdHp1bmVobWVuZGVyIEdlZ25lciwgZ2VwYW56ZXJ0IG1pdCBQbGF0dGVuXG4iKworICAgImF1cyByZWluZW0gU3RhaGwgaXN0IGVzIHNjaHdlciwgaWhtIGlyZ2VuZHdpZSBTY2hhZGVuIHp1enVmdWVnZW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAoeyJTdGFobGRyYWNoZSIsICJTdGFobGRyYWNoZW4iLCAiU3RhaGxkcmFjaGVuIiwgIlN0YWhsZHJhY2hlbiJ9KSk7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIEFkZElkKCh7ImRyYWNoZSIsICJzdGFobGRyYWNoZSIsICJkcmFjaGVuIiwgInN0YWhsZHJhY2hlbiJ9KSk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkRyYWNoZSIpOworICAgU2V0UHJvcChQX0xFVkVMLCAyMCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCA0MDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtMjUwKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBzdGFlaGxlcm5lbiBLbGF1ZW4iLCAxNTB9KSk7CisgICBTZXRQcm9wKFBfQk9EWSwgMTMwKTsKKyAgIFNldFByb3AoUF9YUCwgMzAwMDAwKTsKKyAgIFNldFByb3AoUF9TSVpFLCByYW5kb20oNTApKzI1MCk7CisgICBTZXRDaGF0cyg0MCwgKHsKKyAgICAgICJEZXIgU3RhaGxkcmFjaGUgc2NobmF1YnQgbGF1dC5cbiIsCisgICAgICAiRGVyIFN0YWhsZHJhY2hlIHNjaGF1dCBEaWNoIG1pdCBzdGFlaGxlcm5lbSBCbGljayBhbi5cbiIsCisgICAgICAiRGVyIFN0YWhsZHJhY2hlIHdhZWx6dCBzaWNoIGhlcnVtLlxuIiwKKyAgICAgICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IGV0d2FzIHN0YWhsYmxhdWVzIEZldWVyLlxuIiwKKyAgIH0pICk7CisgICBBZGRTcGVsbCgxLCAxMTUsICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IHN0YWhsYmxhdWVzIEZldWVyIGF1ZiBEaWNoLlxuIiwKKyAgCSAgICAgICAgICAgICJEZXIgU3RhaGxkcmFjaGUgc3B1Y2t0IHN0YWhsYmxhdWVzIEZldWVyIGF1ZiBAV0VOLlxuIiwKKwkgICAgRFRfRklSRSk7CisgICBTZXRQcm9wKFBfU1BFTExSQVRFLDIwKTsKKyAgIGNsb25lX29iamVjdChPQkooImd1bW1pc3RpZWZlbCIpKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKKyAgIGNsb25lX29iamVjdChPQkooInN0YWhsc2Nod2VydCIpKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKKyAgIHNldF9saXZpbmdfbmFtZSgic3RhaGxkcmFjaGUiKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90aXRhbndhbHplLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vdGl0YW53YWx6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTEzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9tb24vdGl0YW53YWx6ZS5jCkBAIC0wLDAgKzEsMzAgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+ICAgICAgICAgICAgICAgICAgICAKKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IE1NT05TVDsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBUaXRhbndhbHplIik7CisgICBTZXRQcm9wKFBfTE9ORywgIlBhc3MgbnVyIGF1ZiwgZGFzcyBkaWVzZSBUaXRhbndhbHplIERpciBuaWNodCB1ZWJlciBkaWUgWmVoZW4gcm9sbHQuXG5CZWkgZGllc2VtIEdld2ljaHQga29lbm50ZSBkYXMgYXVlc3NlcnN0IHVuYW5nZW5laG1lIEZvbGdlbiBoYWJlbi5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJUaXRhbndhbHplIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAyKTsKKyAgIEFkZElkKCh7IndhbHplIiwgInRpdGFud2FsemUifSkpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNCk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAxNzApOworICAgU2V0UHJvcChQX0FMSUdOLCAxMjApOworICAgU2V0UHJvcChQX1hQLCA1MTAwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgOTApOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IHd1Y2h0aWdlbiBTY2hsYWVnZW4iLCA2MH0pKTsKKyAgIFNldFByb3AoUF9TSVpFLCAyMTApOworICAgU2V0UHJvcChQX0RJRV9NU0csICIgemVyZmFlbGx0IGluIGlocmUgQmVzdGFuZHRlaWxlLlxuIik7CisgICBTZXRBdHRhY2tDaGF0cygzMCwgKHsKKyAgICJEaWUgVGl0YW53YWx6ZSB2ZXJzdWNodCBEaWNoIHBsYXR0IHp1IHdhbHplbi5cbiIsCisgICAiRGllIFRpdGFud2FsemUgbWFjaHQ6IFJ1bXBlbCwgcG9sdGVyIC4uLlxuIiwKKyAgICJEaWUgVGl0YW53YWx6ZSByb2VocnQuXG4ifSkpOworICAgc2V0X2xpdmluZ19uYW1lKCJ0aXRhbndhbHplIik7CisgICBBZGRJdGVtKE9CSigidGl0YW5yaW5nIikpOyAKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbC5jIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3Ryb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMTA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbC5jCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRyb2xsIik7CisgICBTZXRQcm9wKFBfTE9ORywgIkVpbiBUcm9sbCB3aWUgYXVzIGRlbSBCaWxkZXJidWNoOiBHcm9zcywgaGFlc3NsaWNoIHVuZCBkdW1tLlxuIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIlRyb2xsIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiVHJvbGwiKTsKKyAgIEFkZElkKCJ0cm9sbCIpOworICAgU2V0UHJvcChQX0xFVkVMLCAxNSk7CisgICBTZXRQcm9wKFBfTUFYX0hQLCAyMDApOworICAgU2V0UHJvcChQX0FMSUdOLCAtNDE3KTsKKyAgIFNldFByb3AoUF9YUCwgMTIwMDAwKTsKKyAgIFNldFByb3AoUF9CT0RZLCAzNSk7CisgICBTZXRQcm9wKFBfU0laRSwgcmFuZG9tKDQwKSsxOTkpOworICAgc2V0X2xpdmluZ19uYW1lKCJ0cm9sbCIpOworICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICAgQWRkSXRlbShPQkooInRyb2xsZG9sY2giKSxDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigic3RlaW5yaW5nIiksQ0xPTkVfV0VBUik7CisgICBBZGRJdGVtKE9CSigibGtoZW1kIiksQ0xPTkVfV0VBUik7Cit9CisgICAgICAKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbG1vcHMuYyBiL2RvYy9iZWlzcGllbGUvc3NwL21vbi90cm9sbG1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMwNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3AvbW9uL3Ryb2xsbW9wcy5jCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAic3RkL25wYyI7CisKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRyb2xsbW9wcyIpOworICAgU2V0UHJvcChQX0xPTkcsIAorICAgIkRpZXMgaXN0IGVpbmVyIGRlciBzYWdlbnVtd29iZW5lbiwgYmx1dHJ1ZW5zdGlnZW4gVHJvbGxtb2Vwc2UuIEhlcnZvci1cbiIrCisgICAiZ2VnYW5nZW4gYXVzIGRlciBtaXNzbHVuZ2VuZW4gS3JldXp1bmcgendpc2NoZW4gZWluZW0gVHJvbGwgdW5kIGVpbmVtXG4iKworICAgIk1vcHMsIHRlcnJvcmlzaWVyZW4gZGllc2UgZ3JhdXNhbWVuIEJlc3RpZW4gamV0enQgZGllIFdlbHQuIEZsaWVoLCBzby1cbiIrCisgICAibGFuZ2UgRHUgbm9jaCBrYW5uc3QuXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiVHJvbGxtb3BzIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgIEFkZElkKCJ0cm9sbG1vcHMiKTsKKyAgIEFkZElkKCJ0cm9sbCIpOworICAgQWRkSWQoIm1vcHMiKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiVHJvbGwiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMjApOworICAgU2V0UHJvcChQX01BWF9IUCwgMzUwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgLTczNSAtIHJhbmRvbSgxMDApKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBibHV0dmVyc2NobWllcnRlbiBLcmFsbGVuIiwgMjAwICtyYW5kb20oMTApfSkpOworICAgU2V0UHJvcChQX1hQLCAzNTAwMDApOworICAgU2V0UHJvcChQX0JPRFksIDE0MCArIHJhbmRvbSg0MCkpOworICAgU2V0UHJvcChQX1NJWkUsIHJhbmRvbSgyMCkrMTA1KTsgIC8qIERhIHNpbmQgZGllIEdyb2Vzc2VuIGRlciBFbHRlcm4gZHJpbiAqLworICAgc2V0X2xpdmluZ19uYW1lKCJ0cm9sbG1vcHMiKTsKKyAgIFNldFByb3AoUF9BR0dSRVNTSVZFLCAxKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9ibGVjaC5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2JsZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1YzJlYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9ibGVjaC5jCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitjcmVhdGUoKSB7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBhbHRlcyBCbGVjaCIpOworICBTZXRQcm9wKFBfTE9ORywgIkRhcyBzaW5kIGRpZSBVZWJlcnJlc3RlIGVpbmVzIE1ldGFsbG1vbnN0ZXJzLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiQmxlY2giKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIEFkZElkKCJibGVjaCIpOworICBBZGRBZGplY3RpdmUoKHsiYWx0IiwgImFsdGVzIn0pKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTEwMCk7CisgIFNldFByb3AoUF9WQUxVRSwgcmFuZG9tKFF1ZXJ5UHJvcChQX01BWF9IUCkpKzEwMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovZWlzZW5rbHVtcGVuLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovZWlzZW5rbHVtcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjMTIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9laXNlbmtsdW1wZW4uYwpAQCAtMCwwICsxLDE2IEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworY3JlYXRlKCkgeworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS2x1bXBlbiBFaXNlbiIpOworICBTZXRQcm9wKFBfTE9ORywgIlNpZWh0IGF1cywgYWxzIGhhZXR0ZSBkYSBzY2hvbiBqZW1hbmQgZHJhbiBydW1nZW5hZ3QuIERlcmplbmlnZSBtdXNzXG5hYmVyIHNlaHIgc3RhYmlsZSBaYWVobmUgZ2VoYWJ0IGhhYmVuLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiS2x1bXBlbiIpOworICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgQWRkSWQoKHsia2x1bXBlbiIsICJlaXNlbiIsICJrbHVtcGVuIGVpc2VuIn0pKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfSVJPTik7CisgIFNldFByb3AoUF9XRUlHSFQsIDI0MzgpOworICBTZXRQcm9wKFBfVkFMVUUsIHJhbmRvbSg3NTApKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9ndW1taXN0aWVmZWwuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9ndW1taXN0aWVmZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2d1bW1pc3RpZWZlbC5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorIAoraW5oZXJpdCAic3RkL2FybW91ciI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBQYWFyIEd1bW1pc3RpZWZlbCIpOworICAgU2V0UHJvcChQX0xPTkcsICJEYW1pdCBiZWtvbW10IG1hbiBzaWNoZXIga2VpbmUgbmFzc2VuIEZ1ZXNzZS5cbiIpOworICAgU2V0UHJvcChQX05BTUUsICJQYWFyIEd1bW1pc3RpZWZlbCIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJzdGllZmVsIiwgImd1bW1pc3RpZWZlbCIsICJwYWFyIiwgInBhYXIgc3RpZWZlbCJ9KSk7CisgICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX0JPT1QpOworICAgU2V0UHJvcChQX0FDLCAwKTsKKyAgIFNldFByb3AoUF9XRUlHSFQsIDcwMCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDEyMCk7CisgICBTZXRQcm9wKFBfUkVNT1ZFX0ZVTkMsIHRoaXNfb2JqZWN0KCkpOworfQorCitSZW1vdmVGdW5jKCkKK3sKKyAgIG9iamVjdCBlbnY7CisgICBpZiAoKGVudj1lbnZpcm9ubWVudChRdWVyeVByb3AoUF9XT1JOKSkpPT1maW5kX29iamVjdChMMigibTJ4MSIpKSB8fAorICAgICAgIGVudj09ZmluZF9vYmplY3QoTDIoIm0xeDEiKSkpCisgICB7CisgICAgICB3cml0ZSgiRGFzIHdhZXJlIGtlaW5lIHNvIHRvbGxlIElkZWUgaGllciBkaWUgR3VtbWlzdGllZmVsIGF1c3p1emllaGVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAxOworfQorICAgICAgIAorCisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9rYW1wZmJsZWNoLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova2FtcGZibGVjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYzk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova2FtcGZibGVjaC5jCkBAIC0wLDAgKzEsMjIgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiB0b3RlcyBLYW1wZmJsZWNoIik7CisgIFNldFByb3AoUF9MT05HLCAiU2llaHQgYXVzIHdpZSBlaW4gbm9ybWFsZXMgS2FtcGZibGVjaCwgbnVyIHRvdC4gQXVzc2VyZGVtIHVlYmVycmFzY2h0IERpY2ggZGVyIG1lcmt3dWVyZGlnZSBHcmlmZi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIkthbXBmYmxlY2giKTsKKyAgU2V0UHJvcChQX05BTUVfQURKLCAidG90Iik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1NISUVMRCk7CisgIFNldFByb3AoUF9BQywgMTIpOworICBTZXRQcm9wKFBfV0VJR0hULCA4NTApOworICBTZXRQcm9wKFBfVkFMVUUsIDQyMCk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfTUVUQUwpOworICBTZXRQcm9wKFBfSU5GTywgIlppZW1saWNoZXIgU2Nod2FjaHNpbm4gZGllc2VzIE9iamVrdCwgb2RlciBuaWNodD9cbiIpOworICBBZGRJZCgoeyJzY2hpbGQiLCAiYmxlY2giLCAia2FtcGZibGVjaCIsICJ0b3RlcyBrYW1wZmJsZWNoIn0pKTsKKyAgQWRkRGV0YWlsKCJncmlmZiIsICJNaXQgSGlsZmUgZGVzIEdyaWZmcyBrYW5uc3QgRHUgZGFzIHRvdGUgS2FtcGZibGVjaCBhbHMgU2NoaWxkIGJlbnV0emVuLlxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmova3J1bW1zY2h3ZXJ0LmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmova3J1bW1zY2h3ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5ZmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9rcnVtbXNjaHdlcnQuYwpAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgoraW5oZXJpdCAic3RkL3dlYXBvbiI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS3J1bW1zY2h3ZXJ0Iik7CisgIFNldFByb3AoUF9MT05HLCAiRGFzIEtydW1tc2Nod2VydCBzaWVodCBhdXMsIGFscyBoYWV0dGUgZXMgZWlubWFsIGVpbmVtIE9yayBnZWhvZXJ0LlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiS3J1bW1zY2h3ZXJ0Iik7CisgIFNldFByb3AoUF9HRU5ERVIsIDApOworICBTZXRQcm9wKFBfV0MsIDEzMCArIHJhbmRvbSgxNSkpOworICBTZXRQcm9wKFBfVkFMVUUsIDEyMDAgKyByYW5kb20oMjAwKSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDExMDAgKyByYW5kb20oMTAwKSk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfU1dPUkQpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1NMQVNIKTsKKyAgU2V0UHJvcChQX05SX0hBTkRTLCAxKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCJzY2h3ZXJ0Iik7CisgIEFkZElkKCJrcnVtbXNjaHdlcnQiKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9sa2hlbWQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9sa2hlbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM4MWJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL2xraGVtZC5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBsZWljaHRlcyBLZXR0ZW5oZW1kIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIG5pY2h0IHNvbmRlcmxpY2ggZ3V0IGdlYXJiZWl0ZXRlcyBLZXR0ZW5oZW1kLiBBbnppZWhlbiBrYW5uIG1hblxuZXMgYWJlciB0cm90emRlbS5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIktldHRlbmhlbWQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfQVJNT1VSKTsKKyAgU2V0UHJvcChQX0FDLCAxOCk7CisgIFNldFByb3AoUF9XRUlHSFQsIDE3MDApOworICBTZXRQcm9wKFBfVkFMVUUsIDEyMDAgK3JhbmRvbSgxMDApKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCh7ImtldHRlbmhlbWQiLCAiaGVtZCJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovb3JraGVsbS5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hlbG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ2YThiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hlbG0uYwpAQCAtMCwwICsxLDIwIEBACitpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+ICAgICAgICAgICAgICAgICAgICAKKyNpbmNsdWRlIDxjb21iYXQuaD4KKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBPcmtoZWxtIik7CisgIFNldFByb3AoUF9MT05HLCAiRWluIHN0YWJpbGVyIEhlbG0sIGRlciBzY2hvbiBhdXNnaWViaWcgdm9uIGVpbmVtIHN0aW5rZW5kZW4gT3JrXG5nZXRyYWdlbiB3dXJkZS5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIk9ya2hlbG0iKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfSEVMTUVUKTsKKyAgU2V0UHJvcChQX0FDLCA3KTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgNDUwKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAzNTApOworICBTZXRQcm9wKFBfTUFURVJJQUwsIChbTUFUX01JU0NfTUVUQUw6OTUsIE1BVF9TTElNRTo1XSkpOworICBBZGRJZCgoeyJoZWxtIiwgIm9ya2hlbG0ifSkpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL29ya2hvc2UuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9vcmtob3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMDA1NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9vcmtob3NlLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KK2luaGVyaXQgInN0ZC9hcm1vdXIiOworIAorY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluZSBPcmtob3NlIik7CisgIFNldFByb3AoUF9MT05HLCAiRGllIEJlaW5iZWtsZWlkdW5nIHZvbiBPcmtzLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiSG9zZSIpOworICBTZXRQcm9wKFBfR0VOREVSLCAyKTsKKyAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9UUk9VU0VSUyk7CisgIFNldFByb3AoUF9BQywgNyk7CisgIFNldFByb3AoUF9XRUlHSFQsIDU1NSk7CisgIFNldFByb3AoUF9WQUxVRSwgNDgwICsgcmFuZG9tKDQwKSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKFtNQVRfQ0xPVEg6OTksIE1BVF9TSElUOjFdKSk7CisgIEFkZElkKCh7Imhvc2UiLCAiaG9zZW4iLCAib3JraG9zZSIsICJvcmtob3NlbiJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2FlYmVsLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2FlYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlYzk1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zYWViZWwuYwpAQCAtMCwwICsxLDIzIEBACitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4gICAgICAgICAgICAgICAgICAgIAorI2luY2x1ZGUgPGNvbWJhdC5oPgorIAorY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIHNjaGFydGlnZXIgU2FlYmVsIik7CisgIFNldFByb3AoUF9MT05HLCAiRGVyIFNhZWJlbCBpc3Qgc2NoYXJ0aWcsIGtvZW5udGUgYWJlciB0cm90emRlbSByZWNodCBicmF1Y2hiYXIgc2Vpbi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIlNhZWJlbCIpOyAKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9XQywgMTQ0KTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAxNTI1KTsKKyAgU2V0UHJvcChQX1dFSUdIVCwgMTI2NCk7CisgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfU1dPUkQpOworICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1NMQVNIKTsKKyAgU2V0UHJvcChQX05SX0hBTkRTLCAxKTsKKyAgU2V0UHJvcChQX01BVEVSSUFMLCBNQVRfTUlTQ19NRVRBTCk7CisgIEFkZElkKCJzYWViZWwiKTsKKyAgQWRkQWRqZWN0aXZlKCh7InNjaGFydGlnIiwgInNjaGFydGlnZXIiLCAic2NoYXJ0aWdlbiJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2NoYWVsbWVzc2VyLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovc2NoYWVsbWVzc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwYjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zY2hhZWxtZXNzZXIuYwpAQCAtMCwwICsxLDI1IEBACitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gS25vY2hlbnNjaGFlbG1lc3NlciIpOworICAgU2V0UHJvcChQX0xPTkcsIAorCSAgICJFaW4gTWVzc2VyIHNvIGxhbmcsIHdpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmVcbiIrCisJICAgIldpZSB0YXVzZW5kIGdyb3NzZSBaYWVobmUsIGVpbiBNZXNzZXIgc28gbGFuZ1xuIisKKwkgICAiU28gbGFuZywgd2llIHRhdXNlbmQgZ3Jvc3NlLCBncm9zc2UgWmFlaG5lXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiS25vY2hlbnNjaGFlbG1lc3NlciIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgICBBZGRJZCgoeyJrbm9jaGVuc2NoYWVsbWVzc2VyIiwgInNjaGFlbG1lc3NlciIsICJtZXNzZXIifSkpOworICAgU2V0UHJvcChQX1dDLCAxNDUpOworICAgU2V0UHJvcChQX05SX0hBTkRTLCAxKSwKKyAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfS05JRkUpOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9TTEFTSCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDE2MTApOworICAgU2V0UHJvcChQX1dFSUdIVCwgMTE1MCk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX01FVEFMKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGFobHNjaHdlcnQuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGFobHNjaHdlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ2ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3N0YWhsc2Nod2VydC5jCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvd2VhcG9uIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTdGFobHNjaHdlcnQiKTsKKyAgU2V0UHJvcChQX0xPTkcsICJEaWVzZXMgU2Nod2VydCBoYXQgZWluZSBLbGluZ2UgYXVzIHJlaW5lbSBTdGFobCwgbWl0IGRlciBtYW4gc2VpbmUgR2VnbmVyXG53b2hsIHppZW1saWNoIGd1dCBuaWVkZXJtYWNoZW4ga2Fubi4gRGFzIFNjaHdlcnQgaXN0IHJlY2h0IHNjaHdlciB1bmRcbmxhZXNzdCBzaWNoIG51ciBtaXQgendlaSBIYWVuZGVuIGZ1ZWhyZW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJTdGFobHNjaHdlcnQiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMCk7CisgIFNldFByb3AoUF9XQywgMTc1KTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAxNzUwICsgcmFuZG9tKDEwMCkpOworICBTZXRQcm9wKFBfV0VJR0hULCAyOTI2KTsKKyAgU2V0UHJvcChQX1dFQVBPTl9UWVBFLCBXVF9TV09SRCk7CisgIFNldFByb3AoUF9EQU1fVFlQRSwgRFRfU0xBU0gpOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDIpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9TVEVFTCk7CisgIEFkZElkKCh7InNjaHdlcnQiLCAic3RhaGxzY2h3ZXJ0IiwgIlxuc3Nwc3RhaGxzY2h3ZXJ0In0pKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGVpbnJpbmcuYyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai9zdGVpbnJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEwOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3N0ZWlucmluZy5jCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+Citpbmhlcml0ICJzdGQvYXJtb3VyIjsKKyAKK2NyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTdGVpbnJpbmciKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4ga2xlaW5lciBSaW5nLCB2b2VsbGlnIGF1cyBlaW5lbSBncmF1ZW4gU3RlaW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJTdGVpbnJpbmciKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgMSk7CisgIFNldFByb3AoUF9BUk1PVVJfVFlQRSwgQVRfUklORyk7CisgIFNldFByb3AoUF9BQywgMik7CisgIFNldFByb3AoUF9XRUlHSFQsIDI3MCk7CisgIFNldFByb3AoUF9WQUxVRSwgMzAwICtyYW5kb20oMTUwKSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfU1RPTkUpOworICBBZGRJZCgoeyJyaW5nIiwgInN0ZWlucmluZyJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdGl0YW5yaW5nLmMgYi9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdGl0YW5yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ZGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvc3NwL29iai90aXRhbnJpbmcuYwpAQCAtMCwwICsxLDE4IEBACitpbmhlcml0ICJzdGQvYXJtb3VyIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAiRWluIFRpdGFucmluZyIpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBSaW5nIGF1cyBUaXRhbi5cbiIpOworICBTZXRQcm9wKFBfTkFNRSwgIlRpdGFucmluZyIpOworICBTZXRQcm9wKFBfR0VOREVSLCAxKTsKKyAgQWRkSWQoKHsidGl0YW5yaW5nIiwgInJpbmcifSkpOworICBTZXRQcm9wKFBfQVJNT1VSX1RZUEUsIEFUX1JJTkcpOworICBTZXRQcm9wKFBfQUMsIDIpOworICBTZXRQcm9wKFBfV0VJR0hULCAyODApOworICBTZXRQcm9wKFBfVkFMVUUsIDUyMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3NzcC9vYmovdHJvbGxkb2xjaC5jIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3Ryb2xsZG9sY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA2MDkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS9zc3Avb2JqL3Ryb2xsZG9sY2guYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgoraW5oZXJpdCAic3RkL3dlYXBvbiI7CisgCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gVHJvbGxkb2xjaCIpOworICBTZXRQcm9wKFBfTE9ORywgIkVpbiBsYW5nZXIsIHNjaGFyZmVyIERvbGNoLCBkZW0gR2VzdGFuayBuYWNoIG11c3MgZXIgZWluZW0gVHJvbGxcbmdlaG9lcnQgaGFiZW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJUcm9sbGRvbGNoIik7CisgIFNldFByb3AoUF9HRU5ERVIsIDEpOworICBTZXRQcm9wKFBfV0MsIDExOSk7CisgIFNldFByb3AoUF9WQUxVRSwgMTAwMCArcmFuZG9tKDQwMCkpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MDAgK3JhbmRvbSg1MCkpOworICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0tOSUZFKTsKKyAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9QSUVSQ0UpOworICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX01FVEFMKTsKKyAgQWRkSWQoKHsiZG9sY2giLCAidHJvbGxkb2xjaCJ9KSk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlLy5yZWFkbWUgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmZjQxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvLnJlYWRtZQpAQCAtMCwwICsxLDEzIEBACisKK0hpZXIgbGllZ2VuIFRlc3QtT2JqZWt0ZSB6dSBtYW4tcGFnZXMuIFVudGVyc2NoaWVkZW4gd2lyZCBtb21lbnRhbiBudXIgbmFjaDoKKy0geHh4X3Rlc3RvYmogLT4gZGFzIGthbm4gbWFuIGxhZGVuIHVuZCBnZ2YgY2xvbmVuCistIHh4eF90ZXN0cmF1bSAtPiBkZW4ga2FubiBtYW4gYmV0cmV0ZW4KKworRGVyIFByYWVmaXggZGV1dGV0IGFuLCBmdWVyIHdlbGNoZSBGZWF0dXJlcyAoYWxzbyBtYW4tcGFnZXMpIGRlciBUZXN0Y29kZSBnZXNjaHJpZWJlbiB3dXJkZS4gRGllIG1hbi1wYWdlIHNlbGJzdCBuZW5udCBkaWVzZW4gRGF0ZWluYW1lbiBoaWVyLCBpbnNvZmVybjoKKyogYml0dGUgbWl0IEJlZGFjaHQgdmVyYWVuZGVybiAtIHBydWVmZW4sIHdlbGNoZSBGdW5rdGlvbmFsaXRhZXQKKyAgYmVpc3BpZWxoYWZ0IGdlemVpZ3Qgd2VyZGVuIHNvbGwgdW5kIGRhcyBuaWNodCBsb2VzY2hlbgorKiBiaXR0ZSBEYXRlaW5hbWVuIG51ciB2ZXJhZW5kZXJuLCB3ZW5uIGlociBldWNoIHNpY2hlciBzZWlkLCBfYWxsZV8KKyAgZGFyYXVmIHZlcndlaXNlbmRlbiBtYW4tcGFnZXMgZWJlbmZhbGxzIGdlYWVuZGVydCB6dSBoYWJlbgorCitWZXJhbnR3b3J0bGljaDogR2xvaW5zb24KKwpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9hdHRhY2tfYnVzeV9zZW5zaXRpdmVfdGVzdG9iai5jIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9hdHRhY2tfYnVzeV9zZW5zaXRpdmVfdGVzdG9iai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjVkODgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2F0dGFja19idXN5X3NlbnNpdGl2ZV90ZXN0b2JqLmMKQEAgLTAsMCArMSwxMDUgQEAKK2luaGVyaXQgIi9zdGQvdGhpbmciOw0KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+DQorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4NCisjaW5jbHVkZSA8c2Vuc2l0aXZlLmg+DQorDQorcHJpdmF0ZSBhY3Rpb25fcHVzdGUoc3RyaW5nIHN0cik7DQorcHJpdmF0ZSBpbnQgY291bnRlcjsNCisNCit2b2lkIGNyZWF0ZSgpIHsNCisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47DQorICA6OmNyZWF0ZSgpOw0KKyAgY291bnRlciA9IDIrcmFuZG9tKDQpOw0KKyAgDQorICBTZXRQcm9wKFBfTkFNRSwgIlB1c3RlYmx1bWUiKTsNCisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUga2xlaW5lIFB1c3RibHVtZSIpOw0KKyAgU2V0UHJvcChQX0xPTkcsIGJyZWFrX3N0cmluZygNCisgICAgIkVpbmUgYWJnZWJsdWVodGUgUGZsYW56ZSwgZGllIGpldHp0IHdpZSBlaW4ga2xlaW5lciwgd2Vpc3NlciBCYWxsICINCisJImF1c3NpZWh0LiBEaWUgZmllZHJpZ2VuIFNhbWVuIGZsaWVnZW4gYmVzdGltbXQgcHJpbWEuIiwgNzgpKTsNCisgIEFkZERldGFpbCgic2FtZW4iLCAiRXIgc2llaHQgc2VociBmZWluIHVuZCBsZWljaHQgYXVzLlxuIik7DQorICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7DQorICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1BMQU5UKTsNCisgIFNldFByb3AoUF9OT0JVWSwgMSk7DQorICBTZXRQcm9wKFBfVkFMVUUsIHJhbmRvbSgxMCkpOw0KKw0KKyAgU2V0UHJvcChQX0lORk8sICJTdGFya2VyIFdpbmQgdGFldGUgaWhyIG5pY2h0IGd1dC5cbiIpOw0KKw0KKyAgQWRkSWQoKHsiYmx1bWUiLCAicHVzdGVibHVtZSIsICJsb2V3ZW56YWhuIn0pKTsNCisgIFNldFByb3AoUF9DT01CQVRDTURTLChbInB1c3RlIGxvZXdlbnphaG4iOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoW0NfSEVBTDogNV0pXSkpOw0KKw0KKyAgU2V0UHJvcChQX1NFTlNJVElWRSwoeyh7U0VOU0lUSVZFX0FUVEFDSywgRFRfQUlSLCAyMH0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICh7U0VOU0lUSVZFX0lOVkVOVE9SWSwgRFRfQUlSLCAyMH0pfSkpOw0KKyANCisgIEFkZENtZCgicHVzdGUmQElEIiwgIydhY3Rpb25fcHVzdGUsICJQdXN0ZSB3ZW4gb2RlciB3YXMgKGFuKT8iKTsNCit9DQorDQorcHJpdmF0ZSBhY3Rpb25fcHVzdGUoc3RyaW5nIHN0cikgew0KKyAgaWYoZW52aXJvbm1lbnQoKSE9dGhpc19wbGF5ZXIoKSkgew0KKyAgICBub3RpZnlfZmFpbCgiRGF6dSBzb2xsdGVzdCBkdSAiK25hbWUoV0VOLDEpKyIgaGFiZW4uXG4iKTsNCisJcmV0dXJuIDA7DQorICB9DQorICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfQVRUQUNLX0JVU1kpKSB7DQorICAgIHdyaXRlKCJEdSBoYXN0IGRhZnVlciBtb21lbnRhbiBlaW5mYWNoIG5pY2h0IG1laHIgZGllIFB1c3RlLlxuIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0FUVEFDS19CVVNZLCAxKTsNCisNCisgIGlmKGNvdW50ZXI8MCkgew0KKyAgICB3cml0ZShicmVha19zdHJpbmcoIkR1IHB1c3Rlc3Qgc2lubmxvcyBhdWYgIituYW1lKFdFTiwgMikrIi4iLCA3OCkpOw0KKwlzYXkoYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsNCisJICAiIHB1c3RldCB3aWUgZGFlbWxpY2ggZ2VnZW4gIituYW1lKFdFTiwgMCkrIi4iLCA3OCkpOw0KKwlyZXR1cm4gMTsNCisgIH0gZWxzZSB7DQorICAgIHdyaXRlKGJyZWFrX3N0cmluZygNCisgICAgICAiRHUgcHVzdGVzdCAiK25hbWUoV0VOLCAyKSsiIHZvcnNpY2h0aWcgYW4sIGVpbmlnZSBTYW1lbiAiDQorICAgICAgImxvZXNlbiBzaWNoIHVuZCBmbGllZ2VuIHRhdW1lbG5kIGluIGRlaW5lbSBBdGVtIGRhdm9uLiIrDQorCSAgKGNvdW50ZXI8MD8iIEVzIGJsZWlidCBudXIgbm9jaCBlaW4gbnV0emxvc2VyIFN0cnVuay4iOiIiKSwgNzgpKTsNCisgICAgc2F5KGJyZWFrX3N0cmluZygNCisgICAgICB0aGlzX3BsYXllcigpLT5OYW1lKFdFUikrIiBwdXN0ZXQgc2FjaHRlIGdlZ2VuICIrbmFtZShXRU4sIDApKyIgdW5kICINCisJICAiZHUgc2NoYXVzdCB2ZXJ6dWVja3QgZGVuIGRhdm9uZmxpZWdlbmRlbiBTYW1lbiBuYWNoLiIsIDc4KSk7DQorICB9DQorCQ0KKyAgb2JqZWN0IHdobyA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5RW5lbXkoKTsNCisgIA0KKyAgaWYob2JqZWN0cCh3aG8pKSB7DQorICAgIGlmKCFpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSkgew0KKyAgICAgIHdoby0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIDgwK3JhbmRvbSgxMCksIDYpOw0KKwkgIHRoaXNfcGxheWVyKCktPmhlYWxfc2VsZig1KTsNCisJfSBlbHNlDQorCSAgd2hvLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgOTArcmFuZG9tKDEwKSwgNCk7DQorICB9DQorDQorICBjb3VudGVyLS07DQorICBpZihjb3VudGVyPDApIHsNCisgICAgY2FsbF9vdXQoIydyZW1vdmUsIDEwK3JhbmRvbSg2MCkpOw0KKwlBZGRJZCgic3RydW5rIik7DQorCVNldFByb3AoUF9OQU1FLCAiU3RydW5rIik7DQorCVNldFByb3AoUF9TSE9SVCwgIkRlciBTdHJ1bmsgZWluZXIgUHVzdGVibHVtZSIpOw0KKwlTZXRQcm9wKFBfTE9ORywgIkVpbiBoYWVzc2xpY2hlciwgbGVlcmVyIFN0cnVuay5cbiIpOw0KKwlTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCisNCitwcml2YXRlIHZvaWQgbm90aWZ5X2Vudl9kZXN0cm95KCkgew0KKyAgb2JqZWN0IG9iID0gZW52aXJvbm1lbnQoKTsNCisgIHdoaWxlKG9iICYmICFsaXZpbmcob2IpKSBvYiA9IGVudmlyb25tZW50KG9iKTsNCisgIGlmKG9iamVjdHAob2IpKQ0KKyAgICB0ZWxsX29iamVjdChvYiwgIkRlciBXaW5kIHplcmJsYWVzdCAiK25hbWUoV0VOLCAyKSsiLlxuIik7DQorICByZW1vdmUoMSk7DQorfQ0KKw0KK3ZhcmFyZ3Mgdm9pZCB0cmlnZ2VyX3NlbnNpdGl2ZV9hdHRhY2soKSB7DQorICBub3RpZnlfZW52X2Rlc3Ryb3koKTsNCit9DQorDQordmFyYXJncyB2b2lkIHRyaWdnZXJfc2Vuc2l0aXZlX2ludigpIHsNCisgIG5vdGlmeV9lbnZfZGVzdHJveSgpOw0KK30NCisNCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgew0KKyAgaWYoIXNpbGVudCAmJiBsaXZpbmcoZW52aXJvbm1lbnQoKSkpDQorICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KCksICJEdSB3aXJmc3QgIituYW1lKFdFTiwgMikrIiB3ZWcuXG4iKTsNCisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2NvbW1hbmRfbWVfdGVzdHJhdW0uYyBiL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvY29tbWFuZF9tZV90ZXN0cmF1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDg2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL2NvbW1hbmRfbWVfdGVzdHJhdW0uYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MT05HLCAiQWRkQ21kLVRlc3RyYXVtLCBLb21tYW5kb3MgIgorICAgICAgICAgICAgICAgICAgIlwia3JpZWNoXCIgdW5kIFwic2NobGVpY2hlJmhlcmFufGhlcnVtXCIuIik7CisgIEFkZENtZCgic2NobGVpY2hlJmhlcmFufGhlcnVtIiwgImFjdGlvbl9zY2hsZWljaGVuIik7CisgIEFkZEV4aXQoImdpbGRlIiwgIi9naWxkZW4vYWJlbnRldXJlciIpOworfQorCit2b2lkIGluaXQoKSB7CisgIDo6aW5pdCgpOworICBhZGRfYWN0aW9uKCJhY3Rpb25fa3JpZWNoZW4iLCAia3JpZWNoIiwgMSk7Cit9CisKK3N0YXRpYyBhY3Rpb25fc2NobGVpY2hlbihzdHJpbmcgc3RyKSB7CisgIHN0cmluZyB0bXAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9SQUNFKTsKKyAgaWYodG1wWzwxXT09J2UnKSB0bXA9dG1wWzAuLjwyXTsKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKCJEdSB2ZXJzdWNoc3QgbGVpc2UgenUgc2NobGVpY2hlbiwgZGFiZWkgcGFzc2llcnQgIgorICAgICJkaXIgYWJlciBlaW4gYWxsenUgIisKKwkodG1wPT0iTWVuc2NoIj8ibWVuc2NobGljaGVzIjpsb3dlcl9jYXNlKHRtcCkrImlzY2hlcyIpKworCSIgTWlzc2dlc2NoaWNrLiBWZXJmbHVjaHQhIiwgNzgpKTsKKyAgdGhpc19wbGF5ZXIoKS0+Y29tbWFuZF9tZSgiXFxmdXJ6ZSIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhY3Rpb25fa3JpZWNoZW4oc3RyaW5nIHN0cikgeworICB3cml0ZShicmVha19zdHJpbmcoIkRlaW5lIEtuaWUgdHVuIHp1IHNlaHIgd2VoIGRhZnVlci4iLCA3OCkpOworICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwgYnJlYWtfc3RyaW5nKHRoaXNfcGxheWVyKCktPk5hbWUoV0VSKSsKKyAgICAiIGtuYWNrdCBtaXQgZGVuIEtuaWVuLiIsIDc4KSk7CisgIHJldHVybiAxOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdGVzdG9iamVrdGUvbW9kaWZ5c2tpbGxzcGVsbF90ZXN0LmMgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL21vZGlmeXNraWxsc3BlbGxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTgzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL21vZGlmeXNraWxsc3BlbGxfdGVzdC5jCkBAIC0wLDAgKzEsMTAzIEBACisvLyBNb2RpZnlTa2lsbC1CZWlzcGllbCBmdWVyIGVpbmVtIFNwZWxsLiBFcmxhZXV0ZXJ1bmcgYXVmIG1hbi1QYWdlCisvLyB1bmQgaW0gT2JqZWt0IHNlbGJzdAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxicmVha19zdHJpbmcuaD4KKworc3RhdGljIGludCBza2lsbHNldChzdHJpbmcgc3RyKTsKK3N0YXRpYyBpbnQgc2tpbGx1bnNldChzdHJpbmcgc3RyKTsKKwordm9pZCBjcmVhdGUoKSB7CisgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHsKKyAgICBzZXRfbmV4dF9yZXNldCgtMSk7CisgICAgcmV0dXJuOworICB9CisKKyAgOjpjcmVhdGUoKTsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisKKyAgU2V0UHJvcChQX05BTUUsICJTa2lsbGJlaXNwaWVsIik7CisgIFNldFByb3AoUF9TSE9SVCwgIkVpbmUgU2tpbGxiZWlzcGllbCIpOworICBTZXRQcm9wKFBfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICJNaXQgXCJza2lsbHNldFwiIGthbm4gbWFuIHNpY2ggZGVuIFNraWxsIChlaWdlbnRsaWNoIFNwZWxsKSAiCisgICAgIlwiZm5yeFwiIHNldHplbi5cbiIrCisgICAgIkR1cmNoIFwic2tpbGx1bnNldFwiIHdpcmQgZGVyIFNraWxsIGdlbG9lc2NodC5cbiIKKyAgICAiRGFzIHphZWhsdCBkZXNoYWxiIGFscyBTcGVsbCwgd2VpbCBlciBrbGVpbmdlc2NocmllYmVuIHVuZCAiCisgICAgImRhbWl0IGRpcmVrdCB2b20gU3BpZWxlciAoYWxzbyBkaXIpIGFscyBLb21tYW5kbyB2aWEgVXNlU3BlbGwoKSAiCisgICAgImF1c2Z1ZWhyYmFyIGlzdC4iLCA3OCwgMCwgQlNfTEVBVkVfTVlfTEZTKSk7CisgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgIEFkZElkKCh7ImJlaXNwaWVsIiwgInNraWxsYmVpc3BpZWwiLCAic3BlbGxiZWlzcGllbCIsCisgICAgICAgICAgInNraWxsIiwgInNwZWxsIn0pKTsKKyAgCisgIEFkZENtZCgic2tpbGxzZXQiLCAjJ3NraWxsc2V0KTsKKyAgQWRkQ21kKCJza2lsbHVuc2V0IiwgIydza2lsbHVuc2V0KTsKK30KKworLy8gVGVzdGZ1bmt0aW9uLCB3ZWlsIGltIENvZGUgZGF6dSBhdWZnZWZvcmRlcnQgd2lyZCwgZGFzIE9iamVrdCBhdWNoCisvLyBtYWwgenUgd2VnenVsZWdlbi4gU3BpZWxlciBzb2xsdGVuIG5pY2h0IGFuIHNpY2ggaGVydW1mdW1tZWxuLgorcHJpdmF0ZSBzdGF0aWMgaW50IF9jaGVja0xlYXJuZXIob2JqZWN0IHBsKSB7CisgIGlmKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBNYWdpZXIsIGRlc2hhbGIgZ2VodCBkYXMgbmljaHQuXG4iKTsKKyAgICBjYWxsX291dCgjJ3JlbW92ZSwgMSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2tpbGxzZXQoc3RyaW5nIHN0cikgeworICBpZighX2NoZWNrTGVhcm5lcih0aGlzX3BsYXllcigpKSkKKyAgICByZXR1cm4gMDsKKworICBpZih0aGlzX3BsYXllcigpLT5RdWVyeVNraWxsKCJmbnJ4IikpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUga2FubnN0IGRlbiBTa2lsbCBzY2hvbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgdGhpc19wbGF5ZXIoKS0+TW9kaWZ5U2tpbGwoImZucngiLAorICAgIChbU0lfQ0xPU1VSRTogZnVuY3Rpb24gaW50IChvYmplY3QgY2FzdGVyLCBzdHJpbmcgc2tpbGwsIG1hcHBpbmcgc2luZikgeworICAgICAgICAgICAgY2FzdGVyLT5MZWFyblNraWxsKCJmbnJ4IiwgMSk7CisgICAgICAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsICJQZW5nISBEZWluIFNraWxsd2VydCBzdGVpZ3QgYXVmICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+UXVlcnlTa2lsbEFiaWxpdHkoImZucngiKSsiLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgfSwKKyAgICAgIFNJX1NLSUxMQUJJTElUWTogODQzMl0pLCAxMDAsICJBTlkiKTsKKyAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgYnJlYWtfc3RyaW5nKAorICAgICJEZXIgU2tpbGwgaXN0IGdlc2V0enQuIFRpcHAgZG9jaCBlaW4gcGFhciBNYWwgXCJmbnJ4XCIgdW5kIHNjaGF1IGRlbiAiCisgICAgIkNvZGUgdW50ZXIgIitsb2FkX25hbWUodGhpc19vYmplY3QoKSkrIiBhbiwgZGFtaXQgZHUgc2llaHN0LCBkYXNzIGRlciAiCisgICAgIlNraWxsIGpldHp0IG51ciBhdXMgZWluZW0gRWludHJhZyBpbiBkaXIgdW5kIGVpbmVyIHVlYmVyIFVzZVNwZWxsKCkgIgorICAgICJnZXJ1ZmVuZW4gRnVua3Rpb24gaW4gZGllc2VtIE9iamVrdCBiZXN0ZWh0LiBEZXIgU2tpbGwgaXN0IGtlaW4gIgorICAgICJLb21tYW5kbyBpbiBlaW5lbSBhbmRlcmVuIE9iamVrdC5cblxuIgorICAgICJXZW5uIGR1IGRpZXNlcyBPYmpla3Qgd2VnbGVnc3QsIGZ1bmt0aW9uaWVydCBhbHNvIGFsbGVzIHdlaXRlci4gIgorICAgICJaZXJzdG9lcnN0IGR1IGFiZXIgZGFzIE9iamVrdCAob2RlciBkaWNoIG1pdCBcImVuZGVcIiwgZnVua3Rpb25pZXJ0ICIKKyAgICAiZGllIFNraWxsZnVua3Rpb24gbmljaHQgbWVoci5cbiIKKyAgICAiU2NoYXUgZGlyIGF1Y2ggeGV2YWwgdGhpc19wbGF5ZXIoKS0+UXVlcnlTa2lsbChcImZucnhcIikgYW4uIiwgNzgsIDAsCisgICAgQlNfTEVBVkVfTVlfTEZTKSk7CisgIHJldHVybiAxOworfQorCisvLyBIZXJlIGJlIGRyYWdvbnMhCisvLyBCaXR0ZSBiZW51dHp0IGRpZSBmb2xnZW5kZSBBcnQgdm9uIE1hbmlwdWxhdGlvbiBkZXIgU2tpbGxzIG51ciBkYW5uLAorLy8gd2VubiBpaHIgZ2VuYXUgd2lzc3QsIHdhcyBpaHIgdHV0LiBJbiBhbmRlcmVuIFdvcnRlbjogTklDSFQgTUFDSEVOIQorLy8gVW5kIHdlbm4sIGRhbm4gTlVSIEFNIEVJR0VORU4gTUFHSUVST0JKRUtULCBOSUNIVCBBTiBTUElFTEVSTiEKK3N0YXRpYyBpbnQgc2tpbGx1bnNldChzdHJpbmcgc3RyKSB7CisgIGlmKCFfY2hlY2tMZWFybmVyKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybiAwOworCisgIC8vIHBlciBRdWVyeSgpIGRhcyBNYXBwaW5nIGFuIGRlciBfcXVlcnlfKi1GdW4gdm9yYmVpIGRpcmVrdCBob2xlbgorICBtYXBwaW5nIHNraWxscyA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5KFBfTkVXU0tJTExTKTsKKyAgLy8gLi4uIHVuZCBtYW5pcHVsaWVyZW4gKHdpcmt0IHNpY2ggd2VnZW4gUmVmZXJlbnogZGlyZWt0IGF1cykKKyAgaWYobWFwcGluZ3Aoc2tpbGxzKSAmJiBtYXBwaW5ncChza2lsbHNbIkFOWSJdKSAmJgorICAgICBtZW1iZXIoc2tpbGxzWyJBTlkiXSwgImZucngiKSkgeworICAgIGVmdW46Om1fZGVsZXRlKHNraWxsc1siQU5ZIl0sICJmbnJ4Iik7CisgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIkVybGVkaWd0LlxuIik7CisgIH0gZWxzZQorICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICJOaWNodHMgenUgZXJsZWRpZ2VuLlxuIik7CisgIAorICByZXR1cm4gMTsKK30KKwordm9pZCByZXNldCgpIHsKKyAgcmVtb3ZlKCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3Rlc3RvYmpla3RlL25ldGRlYWRfaW5mb190ZXN0cmF1bS5jIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9uZXRkZWFkX2luZm9fdGVzdHJhdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmQ4YTcxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS90ZXN0b2JqZWt0ZS9uZXRkZWFkX2luZm9fdGVzdHJhdW0uYwpAQCAtMCwwICsxLDY5IEBACisvLyBCZWlzcGllbHJhdW0gZnVlciBQX05FVERFQURfSU5GTy1GdW5rdGlvbmFsaXRhZXQKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YnJlYWtfc3RyaW5nLmg+Citpbmhlcml0ICIvc3RkL3Jvb20iOworICAgICAKK3N0cmluZyBjcmVhdGVfZGVzdGlueShtaXhlZCB2YWwpOworaW50IGNyZWF0ZV9yb29tKHN0cmluZyBkaXIpOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSB7CisgICAgLy8gc2V0emUgSW5mb3JtYXRpb25lbiwgZGllIGluIGVpbmVtIE5ldHp0b3RlbiBnZXNwZWljaGVydCB3ZXJkZW4gc29sbGVuCisgICAgU2V0KFBfTkVUREVBRF9JTkZPLCByYW5kb20oNSkpOworICAgIFNldFByb3AoUF9JTlRfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgIldlbm4gZHUgaGllciBlaW5zY2hsYWVmc3QsIHdpcmQgZGVyIFJhdW0gbmFjaCAzMHMgemVyc3RvZXJ0LiBCZWltICIKKyAgICAgICJBdWZ3YWNoZW4gd2lyc3QgZHUgYW4gZGllIEJsdWVwcmludCBkaWVzZXMgUmF1bXMgZGllIEluZm8gIisKKyAgICAgIFF1ZXJ5UHJvcChQX05FVERFQURfSU5GTykrIiB1ZWJlcmdlYmVuLiBEaWVzZSB3aXJkIGF1cyBkaWVzZXIgSW5mbyAiCisgICAgICAiZWluZW4gUmF1bXBmYWQgZXJtaXR0ZWxuLCBpbiBkZW4gZHUgYmV3ZWd0IHdpcnN0LiIsIDc4KSk7CisgIH0gZWxzZSB7CisgICAgLy8gQmx1ZXByaW50OiBoaWVyIGthbm4gbWFuIHp1IGVpbmVtIENsb25lcmF1bSBnZWhlbgorICAgIEFkZEV4aXQoImNsb25lcmF1bSIsICMnY3JlYXRlX3Jvb20pOworICAgIFNldFByb3AoUF9JTlRfTE9ORywgYnJlYWtfc3RyaW5nKAorICAgICAgIlp1bSBUZXN0ZW4gZWluZmFjaCBkZW4gQXVzZ2FuZyAnY2xvbmVyYXVtJyBiZW51dHplbi4gRXMgd2lyZCBkYW5uICIKKyAgICAgICJlaW4gUmF1bSBnZWNsb250LCBpbiBkZW4gbWFuIGJld2VndCB3aXJkLiBXZW5uIG1hbiBkb3J0IGVpbnNjaGxhZWZ0LCAiCisgICAgICAid2lyZCBkZXIgZ2VjbG9udGUgUmF1bSBuYWNoIGNpcmNhIDMwcyB6ZXJzdG9lcnQuXG4iCisgICAgICAiQmVpbSBBdWZ3YWNoZW4gd2VyZGVuIGRpZSBpbSBTcGllbGVyIGdlc3BlaWNoZXJ0ZW4gSW5mb3JtYXRpb25lbiBkZXMgIgorICAgICAgImdlY2xvbnRlbiAodW5kIG51bm1laHIgemVyc3RvZXJ0ZW4pIFJhdW1lcyBiZW51dHp0LCB1bSBlaW5lbiAiCisgICAgICAiYWx0ZXJuYXRpdmVuIEF1ZndhY2hyYXVtIChLbGVydXNnaWxkZSwgS2FyYXRlZ2lsZGUsIFdhbGQgb2RlciBQb3J0ICIKKyAgICAgICJWYWluKSB6dSBiZXN0aW1tZW4uXG4iCisgICAgICAiQW5kZXJuZmFsbHMgd3VlcmRlIGRlciBTcGllbGVyIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgZXJ3YWNoZW4uIiwgNzgsCisgICAgICAwLCBCU19MRUFWRV9NWV9MRlMpKTsKKyAgfQorCisgIC8vIFNldC1NZXRob2QsIHVtIGRpZSBJbmZvcm1hdGlvbmVuIGF1cyBQX05FVERFQURfSU5GTyBiZWltIEF1ZndhY2hlbgorICAvLyBpbiBkZXIgQmx1ZXByaW50IGF1c3dlcnRlbiB6dSBrb2VubmVuCisgIFNldChQX05FVERFQURfSU5GTywgIydjcmVhdGVfZGVzdGlueSwgRl9TRVRfTUVUSE9EKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxKTsKK30KKyAgICAgCisvLyBSYXVtIGVudGZlcm5lbiwgbm9ybWFsZXJ3ZWlzZSBzbyBLRUlORSBHVVRFIElERUUhCit2b2lkIEJlY29tZXNOZXREZWFkKG9iamVjdCBwbCkgeworICBjYWxsX291dCgjJ3JlbW92ZSwgMzApOworfQorCisvLyBlcnpldWdlIGVpbmVuIENsb25lcmF1bSB1bmQgYmV3ZWdlIGRlbiBTcGllbGVyIGRhaGluCitpbnQgY3JlYXRlX3Jvb20oc3RyaW5nIGRpcikgeworICBvYmplY3QgZGVzdCA9IGNsb25lX29iamVjdChvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSk7CisgIHRoaXNfcGxheWVyKCktPm1vdmUoZGVzdCwgTV9OT0NIRUNLKTsKKyAgcmV0dXJuIDE7Cit9CisgICAgIAorLy8gU2V0LU1ldGhvZCBmdWVyIFBfTkVUREVBRF9JTkZPOiBnaWJ0IFBmYWQgenVydWVjaworLy8gYmVudXR6ZSBkaWUgSW5mb3JtYXRpb25lbiBhdXMgZGVtIGpldHp0IGF1ZndhY2hlbmRlbiBOZXR6dG90ZW4sIHVtIGVpbmVuCisvLyBhbHRlcm5hdGl2ZW4gQXVmd2FjaHJhdW0genUgZXJtaXR0ZWxuLCBkYSBkZXIgRWluc2NobGFmcmF1bSB6ZXJzdG9lcnQgaXN0CitzdHJpbmcgY3JlYXRlX2Rlc3RpbnkobWl4ZWQgdmFsKSB7CisgIGlmIChpbnRwKHZhbCkpIHsKKyAgICBzd2l0Y2ggKHZhbCkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gIi9kL2ViZW5lL3Jvb20vUG9ydFZhaW4vcG9faGFmMSI7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiAiL2dpbGRlbi9rbGVydXMiOworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gIi9naWxkZW4va2FyYXRlIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgfQorICAgIHJldHVybiAiL2QvZWJlbmUvcm9vbS93YWxkd2VnNCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdmlydHVhbC8ucmVhZG1lIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiZGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvdmlydHVhbC8ucmVhZG1lCkBAIC0wLDAgKzEsMiBAQAorRWluIGVpbmZhY2hlcyBCZWlzcGllbCBmdWVyIHBlciB2aXJ0dWFsIGNvbXBpbGVyIGVyemV1Z3RlIE9iamVrdGUgdm9uIFplc3N0cmEKK3VuZCBlaW4gbGVpY2h0IGtvbXBsZXhlcmVzIHZvbiBIYXRlLgpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdl9yb29tLmMgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92X3Jvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMyOGZkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdl9yb29tLmMKQEAgLTAsMCArMSwxMiBAQAoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK2NyZWF0ZSgpCit7CisgICAgICAgIGlmKElTX0JMVUUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPkN1c3RvbWl6ZU9iamVjdCgpOworICAgICAgICBjYWxsX291dChzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5T2JqZWN0IiwgZmluZF9vYmplY3QoT0JKRUNURCkpLCAyKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvdmlydHVhbC9oYXRlL3ZyX2NvbXBpbGVyLmMgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTBkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5jCkBAIC0wLDAgKzEsODUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBWUl9DT01QSUxFUi5DIC0tIHZpcnR1YWwgcm9vbSBjb21waWxlcgorLy8KKy8vICREYXRlOiAyMDAyLzA4LzI4IDA5OjU3OjE4ICQKKy8vICRSZXZpc2lvbjogMS4zICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmMsdiAkCisgKiBSZXZpc2lvbiAxLjMgIDIwMDIvMDgvMjggMDk6NTc6MTggIFJpa3VzCisgKiBhdWYgc3Ryb25nX3R5cGVzIHVtZ2VzdGVsbHQKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDcvMjcgMTQ6NDg6MTggIEpvZgorICogc3VpZAorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5NC8wMi8wMSAgMTk6NDc6NTcgIEhhdGUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisqLworCisvLyBwcmluY2lwbGU6CisvLyAJLSBpbmhlcml0IHRoaXMgb2JqZWN0IGludG8geW91ciBvd24gJ3ZpcnR1YWxfY29tcGlsZXIuYycKKy8vICAtIGN1c3RvbWl6ZSBWYWxpZGF0ZSgpIGFuZCBDdXN0b21pemVPYmplY3QoKSBmb3IgeW91IG93biBzYWtlCisvLyAgCisvLyAgKiBWYWxpZGF0ZSgpIGNoZWNrcyBpZiBhIHJvb20gZmlsZW5hbWUgZ2l2ZW4gYXMgYXJndW1lbnQgKHdpdGhvdXQgcGF0aCkKKy8vICAgIGlzIHZhbGlkIGFuZCByZXR1cm5zIHRoaXMgZmlsZW5hbWUgd2l0aCBzdHJpcHBlZCAnLmMnISEKKy8vICAqIEN1c3RvbWl6ZU9iamVjdCgpIHVzZXMgdGhlIHByZXZpb3VzX29iamVjdCgpLT5GdW5jdGlvbigpIHN0cmF0ZWd5IHRvCisvLyAgICBjdXN0b21pemUgdGhlIHN0YW5kYXJkIG9iamVjdCAoZm9yIGV4YW1wbGUgdG8gc2V0IGEgZGVzY3JpcHRpb24pCisvLworLy8gUHJvcGVydGllczogUF9WQUxJRF9OQU1FLCBQX01JTl9YLCBQX01BWF9YLCBQX01JTl9ZLCBQX01BWF9ZCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdmlydHVhbC92X2NvbXBpbGVyIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8dl9jb21waWxlci5oPgorI2luY2x1ZGUgIi9vYmovdmlydHVhbC92cl9jb21waWxlci5oIgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9WQUxJRF9OQU1FLCAicmF1bSIpOworfQorCitzdHJpbmcgVmFsaWRhdGUoc3RyaW5nIGZpbGUpCit7CisgIGludCB4LHk7CisgIHN0cmluZyBwYXRoLCBuYW1lOworCisgIGZpbGUgPSA6OlZhbGlkYXRlKGZpbGUpOworCWlmKChzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpID09IDMpICYmCisJCQluYW1lID09IFF1ZXJ5UHJvcChQX1ZBTElEX05BTUUpICYmCisJCSAgKHggPj0gUXVlcnlQcm9wKFBfTUlOX1gpICYmIHggPD0gUXVlcnlQcm9wKFBfTUFYX1gpKSAmJgorCQkgICh5ID49IFF1ZXJ5UHJvcChQX01JTl9ZKSAmJiB5IDw9IFF1ZXJ5UHJvcChQX01BWF9ZKSkKKwkJKQorICAgICAgcmV0dXJuIGZpbGU7Cit9CisKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpCit7CisJc3RyaW5nIHBhdGgsIGZpbGUsIG5hbWU7CisJaW50IHgseTsKKworCWlmKCEoZmlsZSA9IDo6Q3VzdG9taXplT2JqZWN0KCkpKSByZXR1cm4gMDsKKworCXBhdGggPSBRdWVyeVByb3AoUF9DT01QSUxFUl9QQVRIKTsKKwlzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpOworCW5hbWUgPSBRdWVyeVByb3AoUF9WQUxJRF9OQU1FKTsKKwlpZih5IDwgUXVlcnlQcm9wKFBfTUFYX1kpKQorCSAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgibm9yZGVuIiwgCisJCXBhdGgrIi8iK25hbWUrIlsiKyh4ICApKyIsIisoeSsxKSsiXSIpOworCWlmKHkgPiBRdWVyeVByb3AoUF9NSU5fWSkpCisJICAgIHByZXZpb3VzX29iamVjdCgpLT5BZGRFeGl0KCJzdWVkZW4iLCAKKwkJcGF0aCsiLyIrbmFtZSsiWyIrKHggICkrIiwiKyh5LTEpKyJdIik7CisJaWYoeCA8IFF1ZXJ5UHJvcChQX01BWF9YKSkKKwkgICAgcHJldmlvdXNfb2JqZWN0KCktPkFkZEV4aXQoIm9zdGVuIiAsIAorCQlwYXRoKyIvIituYW1lKyJbIisoeCsxKSsiLCIrKHkgICkrIl0iKTsKKwlpZih4ID4gUXVlcnlQcm9wKFBfTUlOX1gpKQorCSAgICBwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgid2VzdGVuIiwgCisJCXBhdGgrIi8iK25hbWUrIlsiKyh4LTEpKyIsIisoeSAgKSsiXSIpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvaGF0ZS92cl9jb21waWxlci5oIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdnJfY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNmYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL2hhdGUvdnJfY29tcGlsZXIuaApAQCAtMCwwICsxLDMzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gVl9DT01QSUxFUi5IIC0tIGEgZ2VuZXJhbCB2aXJ0dWFsIGNvbXBpbGVyIG9iamVjdAorLy8KKy8vICREYXRlOiAxOTk0LzAyLzAxIDE5OjQ3OjU3ICQKKy8vICRSZXZpc2lvbjogMS4xICQKKy8qICRMb2c6IHZyX2NvbXBpbGVyLmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMDEgIDE5OjQ3OjU3ICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorKi8KKworI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfXworCisjZGVmaW5lIFBfVkFMSURfTkFNRQkidmFsaWRfbmFtZSIKKyNkZWZpbmUgUF9NSU5fWAkJCQkibWluX3giCisjZGVmaW5lIFBfTUFYX1gJCQkJIm1heF94IgorI2RlZmluZSBQX01JTl9ZCQkJCSJtaW5feSIKKyNkZWZpbmUgUF9NQVhfWQkJCQkibWF4X3kiCisKKyNlbmRpZiAvLyBfX1ZfQ09NUElMRVJfSF9fCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworI2RlZmluZSBfX1ZSX0NPTVBJTEVSX0hfUFJPVE9fXworCisjZW5kaWYgLy8gX19WUl9DT01QSUxFUl9IX1BST1RPX18KKworI2VuZGlmIC8vTkVFRF9QUk9UT1RZUEVTCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS9zdGRfYXJlbmEuYyBiL2RvYy9iZWlzcGllbGUvdmlydHVhbC96ZXNzdHJhL3N0ZF9hcmVuYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmU1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS9zdGRfYXJlbmEuYwpAQCAtMCwwICsxLDIwIEBACitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICAgaWYoIWNsb25lcChUTykpCisgICAgICAgIHJldHVybjsKKyAgICA6OmNyZWF0ZSgpOworCisgICAgU2V0UHJvcChQX0lOVF9MT05HLCBicmVha19zdHJpbmcoCisgICAgICAgICAgIkR1IHN0ZWhzdCBoaWVyIGluIGVpbmVyIHZvZWxsaWcgbGVlcmVuIEFyZW5hLiIKKyAgICAgICAgICAiR2VnZW4gd2VuIHNvbGx0ZXN0IER1IGhpZXIgZGVubiBnbGVpY2gga2FlbXBmZW4uLi4/Iiw3OCkpOworICAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJJbiBlaW5lciBBcmVuYSIpOworICAgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgICAgU2V0UHJvcChQX0lORE9PUlMsMCk7CisKKyAgICBBZGRFeGl0KCJyYXVzIiwgIi9naWxkZW4vYWJlbnRldXJlciIpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL3plc3N0cmEvdmlydHVhbF9jb21waWxlci5jIGIvZG9jL2JlaXNwaWVsZS92aXJ0dWFsL3plc3N0cmEvdmlydHVhbF9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NzUzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3ZpcnR1YWwvemVzc3RyYS92aXJ0dWFsX2NvbXBpbGVyLmMKQEAgLTAsMCArMSwzMiBAQAoraW5oZXJpdCAiL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIuYyI7CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHJ0dF9jaGVja3Msc2F2ZV90eXBlcworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICAgIDo6Y3JlYXRlKCk7CisKKyAgICAvLyBqZWRlciBTcGllbGVyIGtyaWVndCBlaW5lICJLb3BpZSIgdm9uIHN0ZF9hcmVuYSBhbHMgUmF1bS4KKyAgICBTZXRQcm9wKFBfU1REX09CSkVDVCwgX19ESVJfXyJzdGRfYXJlbmEiKTsKKyAgICBTZXRQcm9wKFBfQ09NUElMRVJfUEFUSCwgX19ESVJfXyk7Cit9CisKK3B1YmxpYyBzdHJpbmcgVmFsaWRhdGUoc3RyaW5nIGZpbGUpCit7CisgICAgc3RyaW5nIHJhdW0sIHNwaWVsZXI7CisgICAgLy8uYyBhYnNjaG5laWRlbgorICAgIGZpbGU9OjpWYWxpZGF0ZShmaWxlKTsKKyAgICAvLyB3ZW5uIGRhcyBnZXd1ZW5zY2h0IGZpbGUgZGVtIFNjaGVtYSAiYXJlbmF8c3BpZWxlcm5hbWUiIGZvbGd0LCBpc3QgZXMKKyAgICAvLyB6dWxhZXNzaWcuCisgICAgaWYoc3NjYW5mKGZpbGUsIiVzfCVzIixyYXVtLHNwaWVsZXIpPT0yICYmIHJhdW09PSJhcmVuYSIpCisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAvLyBuaWNodCB6dWxhZXNzaWcuCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9maWxlcy5oIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL2ZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyNWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9maWxlcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2RlZmluZSBIT01FKHgpICIvZG9jL2JlaXNwaWVsZS8iK3gKKyNkZWZpbmUgV0FMRCh4KSBIT01FKCJ6YXViZXJ3YWxkLyIreCkKKyNkZWZpbmUgUk9PTSh4KSBXQUxEKCJyb29tLyIreCkKKyNkZWZpbmUgTlBDKHgpICBXQUxEKCJucGMvIit4KQorI2RlZmluZSBPQkooeCkgIFdBTEQoIm9iai8iK3gpCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgIi9wL3NlcnZpY2UvcGFkcmVpYy9tbnBjL21ucGMuaCIKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgpCisjZGVmaW5lIFBPICAgIHByZXZpb3VzX29iamVjdCgpCisjZGVmaW5lIERFQlVHKHgpIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJwYWRyZWljIiksIHgpOworCisjZGVmaW5lIFNBRUNLQ0hFTiAiL2Qvd2FsZC9wYWRyZWljL29iai9zYWVja2NoZW4uYyIKKworCisjZGVmaW5lIFpBVUJFUldBTEQgIlxucGFkcmVpY3phdWJlcndhbGQiIC8qIGdlc2V0enQgd2VubiBtYW4gaW0gd2FsZCBpc3QgKi8KKyNkZWZpbmUgQUdHUkVTU0lWRV9USU1FIDkwMCAgICAgICAgICAgICAgLyogemVpdCBiaXMgenVyIGJlZnJpZWR1bmcgKi8KKyNkZWZpbmUgWkFVQkVSV0FMRE5QQyBXQUxESUQoIm5wYyIpCisjZGVmaW5lIEFVU0dBTkcgICAgICJcbnBhZHJlaWNhdXNnYW5nIiAgIC8qIGRpZSBsZXR6dGUgQmV3ZWd1bmcgKi8KKyNkZWZpbmUgV0FMRElEKHgpICAgWkFVQkVSV0FMRCt4CisjZGVmaW5lIEVYVFJBX0xPTkcgICAiXG5wYWRyZWljenVzYXR6bG9uZyIgLyogenVyIGVyZ2Flbnp1bmcgenVyIFZDLWxvbmcgKi8KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvYXJpbmEuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvYXJpbmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA4ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9hcmluYS5jCkBAIC0wLDAgKzEsMTAxIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJBcmluYSBkaWUgV2FsZGZlZSIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICAiVm9yIERpciBzdGVodCBBcmluYSBkaWUgd2Vpc2UgV2FsZGZlZS4gU2llIGlzdCBkaWUgTGVocmVyaW4gZGVzIFdhbGRlcyB1bmRcbiIKKyAgICAgKyJ1bnRlcnJpY2h0ZXQgZGllIFBpeGllcy4gSW4gaWhyZXIgSGFuZCBoYWVsdCBzaWUgZWluZW4ga2xlaW5lbiBaZWlnZXN0b2NrIG1pdFxuIgorICAgICArImRlbSBzaWUgYWxsZXMgbW9lZ2xpY2hlIGVya2xhZXJ0IHVuZCBCdWNoc3RhYmVuIGluIGRlbiBTYW5kIHplaWNobmV0LiBBdWNoXG4iCisgICAgICsiQXJpbmEgaXN0LCBnZW5hdXNvIHdpZSBpaHJlIFNjaHdlc3RlbiwgYmlsZGh1ZWJzY2gsIGRvY2ggaWhyIGdlc3RyZW5nZXIgQmxpY2tcbiIKKyAgICAgKyJmbG9lc3N0IGplZGVtIGluIGlocmVyIE5hZWhlIGdyb3NzZW4gUmVzcGVrdCBlaW4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiQXJpbmEiKTsKKyAgIFNldFByb3AoUF9BUlRJQ0xFLCAwKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDgwKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjgwLCJjb24iOjQwLCJzdHIiOjE2LCJkZXgiOjUwXSkgKTsKKyAgIFNldFByb3AoUF9ESVNBQkxFX0FUVEFDSywgLTEwMDAwKTsgLy8gaXMgbmljaCA6KQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDIwMDApOworICAgU2V0UHJvcChQX1NQLCAyMDAwKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDcwMCk7CisgICBTZXRQcm9wKFBfSFAsIDcwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDQwMCk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkZlZSIpOworICAgU2V0UHJvcChQX1NJWkUsIDE2MCtyYW5kb20oMTYpKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9DT1JQU0UsIE9CSigiZmVlbmxlaWNoZSIpKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMCk7IC8vIGtlaW4gcmF1c2NoZW4gOikKKyAgIEFkZEFkamVjdGl2ZSgid3VuZGVyc2Nob2VuIik7CisgICBBZGRJZCgoeyJhcmluYSIsICJmZWUiLCAid2FsZGZlZSIsIFdBTERJRCgiZmVlIil9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgaWhyZW4gemFydGVuIEhhZW5kZW4iLCAxNTAsIERUX0JMVURHRU9OfSkgKTsKKyAgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywgKFtTQV9TUEVMTF9QRU5FVFJBVElPTjogMjAwXSkpOworICAgU2V0UHJvcChQX1hQLCA4MDAqMjAwKjUqMik7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX1pfTk9fTUFURVJJQUwsIDEpOworICAgU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgInNjaHdlaWd0IHVuZCBsYWVjaGVsdCBEaWNoIGVpbmZhY2ggbnVyIGZyZXVuZGxpY2ggYW4uXG4iKTsKKyAgIE1vZGlmeVNraWxsKCJ2ZXJsZXR6ZSIsCisgICAgICAoW1NJX1NLSUxMQUJJTElUWTo5MDAwLCBTSV9TUEVMTENPU1Q6MCwKKyAgICAgICAgU0lfU1BFTExGQVRJR1VFOjAsIFNJX05PX0NPTlNFUVVFTkNFUzoxMDAwMCwKKyAgICAgICAgU0lfU0tJTExSRVNUUl9VU0U6KFtQX0dVSUxEX0xFVkVMOjAsU1JfRlJFRV9IQU5EUzowXSksCisgICAgICAgIFNJX0FSTU9VUl9SRVNUUjowXSksMCwiemF1YmVyZXIiKTsKKyAgIFNldFByb3AoUF9HVUlMRCwgMCk7CisgICBTZXRQcm9wKFBfUkVTSVNUQU5DRV9TVFJFTkdUSFMsCisgICAgICAoW0RUX1BPSVNPTjogMC4xNSwKKyAgICAgICAgRFRfTUFHSUM6IC0wLjMgXSkgKTsKKyAgIEFkZEl0ZW0oT0JKKCJzdG9jayIpLCBDTE9ORV9XSUVMRCk7CisgICBBZGRJdGVtKE9CSigia2xlaWQiKSwgQ0xPTkVfV0VBUik7CisgICBpZiAoZmlsZV9zaXplKFNBRUNLQ0hFTik+MCkgQWRkSXRlbShTQUVDS0NIRU4sIENMT05FX05FVyk7Cit9CisKK3ZvaWQgQXR0YWNrKG9iamVjdCBlbmVteSkKK3sKKyAgIGludCBub3JtYWxfc3BlZWQ7CisgICBub3JtYWxfc3BlZWQ9KGVuZW15LT5RdWVyeVByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyl8fChbXSkpW1NBX1NQRUVEXXx8MTAwOworICAgaWYgKGVuZW15ICYmIGVuZW15LT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKSA+IG5vcm1hbF9zcGVlZCkgeworICAgICAgd3JpdGUoIkRpZSBGZWUgbWFjaHQgZWluZSBiZXJ1aGlnZW5kZSBIYW5kYmV3ZWd1bmcgdW5kIHBsb2V0emxpY2ggZnVlaGxzdCBEdSBEaWNoXG4iCisgICAgICAgICAgICsicnVoaWcgdW5kIER1IG1lcmtzdCB3aWUgRHUgYWxsbWFlaGxpY2ggd2llZGVyIGxhbmdzYW1lciB3aXJzdC4uLlxuIik7CisgICAgICBlbmVteS0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIC0yMCwgMTgwKTsKKyAgIH0KKyAgIGlmIChlbmVteSkgOjpBdHRhY2soZW5lbXkpOworICAgU2V0UHJvcChQX0dVSUxELCAiemF1YmVyZXIiKTsKKyAgIGNvbW1hbmQoInZlcmxldHplIG1pdCAiKyh7ImZldWVyIiwgIm1hZ2llIiwgImVpcyIsICJ3YXNzZXIiLCAid2luZCJ9KVtyYW5kb20oNSldICk7CisgICBTZXRQcm9wKFBfR1VJTEQsIDApOworfQorCitpbnQgRGVmZW5kKGludCBkYW0sIG1peGVkIGR0cywgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgIGludCBub3JtYWxfc3BlZWQ7CisgICBub3JtYWxfc3BlZWQ9KGVuZW15LT5RdWVyeVByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUyl8fChbXSkpW1NBX1NQRUVEXXx8MTAwOworICAgaWYgKGVuZW15ICYmIGVuZW15LT5RdWVyeVNraWxsQXR0cmlidXRlKFNBX1NQRUVEKSA+IG5vcm1hbF9zcGVlZCkgeworICAgICAgd3JpdGUoTmFtZShXRVIpKyIgbWFjaHQgZWluZSBiZXJ1aGlnZW5kZSBIYW5kYmV3ZWd1bmcgdW5kIHBsb2V0emxpY2ggZnVlaGxzdCBEdSBEaWNoXG4iCisgICAgICAgICAgICsicnVoaWcgdW5kIER1IG1lcmtzdCB3aWUgRHUgYWxsbWFlaGxpY2ggd2llZGVyIGxhbmdzYW1lciB3aXJzdC4uLlxuIik7CisgICAgICBlbmVteS0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIC0yMCwgMTgwKTsKKyAgIH0KKworICAgaWYgKCghc3BlbGwgfHwgKG1hcHBpbmdwKHNwZWxsKSAmJiBzcGVsbFtTUF9QSFlTSUNBTF9BVFRBQ0tdKSkgJiYgIXJhbmRvbSgzKSkgeworICAgICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIE5hbWUoV0VSKSsiIHdlaWNodCBzY2huZWxsIGVpbmVuIFNjaHJpdHQgenVydWVjayB1bmQgd2VpY2h0IERlaW5lbSBBbmdyaWZmIGF1cy5cbiIpOworICAgICAgZGFtPTA7CisgICB9CisgICByZXR1cm4gKGludCk6OkRlZmVuZChkYW0sIGR0cywgc3BlbGwsIGVuZW15KTsKK30KKwordm9pZCBOb3RpZnlQbGF5ZXJEZWF0aChvYmplY3Qgd2hvLCBvYmplY3Qga2lsbGVyLCBvYmplY3QgbG9zdF9leHApCit7CisgIGlmICghd2hvIHx8IGtpbGxlciE9TUUpIHJldHVybjsgLy8gdW5pbnRlcmVzc2FudAorICBsb2dfZmlsZSgicGFkcmVpYy9raWxsIiwgY3RpbWUodGltZSgpKSsiICIrY2FwaXRhbGl6ZShnZXR1aWQod2hvKSkrIiBnZXRvZXRldCB2b24gL3phdWJlcndhbGQvYXJpbmFcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgQXJpbmEgd3VyZGUgdm9uICIrZ2V0X2tpbGxlcigpKyIgZ2V0b2V0ZXQuXG4iKTsKKyAgOjpkaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvbGF1ZmVpY2hlLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL2xhdWZlaWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NDkyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL2xhdWZlaWNoZS5jCkBAIC0wLDAgKzEsMTI0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworaW5oZXJpdCBNTlBDX01PVklORzsKKwordm9pZCBjcmVhdGUoKQoreworICAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgICBzdGRucGM6OmNyZWF0ZSgpOworICAgbW92aW5nOjptbnBjX2NyZWF0ZSgpOworICAgU2V0UHJvcChQX05BTUVfQURKLCAiYWx0Iik7CisgICBTZXRQcm9wKFBfTkFNRSwgIkVpY2hlIik7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW5lIGFsdGUgRWljaGUiKTsKKyAgIFNldFByb3AoUF9NU0dPVVQsICJ3YW5kZXJ0Iik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIlZvciBEaXIgc3RlaHQgZWluZSBzZWhyIHNlaHIgYWx0ZSBFaWNoZS4gRG9jaCBkaWVzZSBFaWNoZSBpc3Qga2VpbmVcbiIKKyAgICArImdld29laG5saWNoZSBFaWNoZSwgd2llIER1IHNpZSBiZXJlaXRzIGFuIHZpZWxlbiBhbmRlcmVuIFN0ZWxsZW4gZ2VzZWhuIGhhc3QuXG4iCisgICAgKyJEaWVzZSBFaWNoZSBsZWJ0ISBEdSBrYW5uc3QgZGV1dGxpY2ggZWluZW4gTXVuZCwgZWluZSBOYXNlIHVuZCBzb2dhciB6d2VpXG4iCisgICAgKyJPaHJlbiBlcmtlbm5lbi4gU2llIGlzdCBlaWdlbnRsaWNoIHNlaHIgZnJpZWRsaWNoIGdlc29ubmVuLCBrYW5uIGFiZXIgYXVjaFxuIgorICAgICsic2VociBzZWhyIGJvZXNlIHdlcmRlbiwgd2VubiBlcyBqZW1hbmQgd2FndCBkaWUgUnVoZSBkZXMgV2FsZGVzIHp1IHN0b2VyZW4uXG4iKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiZWljaGUiKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgNTApOworICAgU2V0UHJvcChQX0FUVFJJQlVURVMsIChbImludCI6NTAsImNvbiI6NTAsInN0ciI6NzAsImRleCI6MTVdKSApOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDUwMCk7CisgICBTZXRQcm9wKFBfSFAsIDUwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDUwMCk7CisgICBTZXRQcm9wKFBfQk9EWSwgMTAwKTsKKyAgIFNldFByb3AoUF9TSVpFLCA2NTArcmFuZG9tKDE1MSkpOworICAgQWRkQWRqZWN0aXZlKCJhbHQiKTsKKyAgIEFkZElkKCh7ImVpY2hlIiwgImVpY2hlbiIsIFdBTERJRCgiZWljaGUiKSB9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgZWluZW0gaWhyZXIgbGFuZ2VuIEFlc3RlIiw0MDAsIERUX1dISVB9KSApOworICAgU2V0UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTLCAoW1NBX1NQRUVEOjE4MF0pKTsKKyAgIFNldFByb3AoUF9OT0NPUlBTRSwgMSk7CisgICBTZXRQcm9wKFBfWFAsIDUwMCo0MDAqNSk7CisgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCAiYmxlaWJ0IGFic29sdXQgcmVndW5nc2xvcyB1bmQgcmVhZ2llcnQgdWViZXJoYXVwdCBuaWNodC5cbiIpOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgIChbRFRfU0xBU0g6ICAgICAwLjEsCisgICAgICBEVF9NQUdJQzogICAgLTEuMCwKKyAgICAgIERUX0JMVURHRU9OOiAtMC41LAorICAgICAgRFRfUE9JU09OOiAgICAwLjI1LAorICAgICAgRFRfSE9MWTogICAgIC0xLjAsCisgICAgICBEVF9SSVA6ICAgICAgIDAuMjUsCisgICAgICBEVF9GSVJFOiAgICAgIDAuMjUsCisgICAgICBEVF9QSUVSQ0U6ICAgLTAuNSwKKyAgICAgIERUX1dISVA6ICAgICAtMS4wIF0pICk7CisgICBTZXRQcm9wKE1OUENfQVJFQSwgKHsgUk9PTSgid2VnMiIpLCBST09NKCJsaWNodHVuZyIpIH0pICk7CisgICBTZXRQcm9wKE1OUENfUkFORE9NLCAxMCk7CisgICBTZXRQcm9wKE1OUENfREVMQVksIDgpOworICAgU2V0UHJvcChNTlBDX1dBTEtfVElNRSwgNjAwKTsKKyAgIFNldFByb3AoTU5QQ19GTEFHUywgTU5QQ19XQUxLfE1OUENfTk9fV0FMS19JTl9GSUdIVHxNTlBDX09OTFlfRVhJVFMpOworfQorCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9pbmZvKCkKK3sKKyAgIGlmICghUEwgfHwgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKQorICAgICAgcmV0dXJuICJEaWUgYWx0ZSBFaWNoZSBpc3QgRGlyIHNlaHIgZnJpZWRsaWNoIGdlc29ubmVuLiBFcyBpc3QgamVkb2NoIGF1Y2ggc2ljaGVyXG4iCisgICAgICAgICAgICArImtsdWcgZGllc2VzIG5pY2h0IHp1IGFlbmRlcm4sIGRhIHNpZSBtaXQgaWhyZW4gQWVzdGVuIHdvaGwgYXVjaCBzZWhyIGtyYWVmdGlnXG4iCisgICAgICAgICAgICArInp1c2NobGFnZW4ga2Fubi5cbiI7CisgICByZXR1cm4gIkR1IGhhc3QgZGVuIFpvcm4gZGVyIGFsdGVuIEVpY2hlIGF1ZiBEaWNoIGdlem9nZW4sIGRhcyB3YXIgZ2FueiB1bmQgZ2FyIG5pY2h0XG4iCisgICAgICAgICArImtsdWcgdm9uIERpci4gSmV0enQgbGViZSBhdWNoIG1pdCBkZW4gS29uc2VxdWVuemVuLi4uLlxuIjsKK30KKworaW50IHJlbW92ZSgpCisvLyB3ZW5uIGVpbmUgRWljaGUgZ2V0b2V0ZXQgd2lyZCwgZGFubiB2ZXJsYW5nc2FtdCBkYXMgZGVuIHJlc2V0IGRlciBFaWNoZQorLy8gZGllIGF1ZiB3ZWcyIGJsb2NrdC4gSW4gZGVyIFJlZ2VsIHN0ZWh0IGphIGF1Y2ggc28gc2Nob24gaW1tZXIgZWluZSBkZXIKKy8vIHdhbmRlcmRlbiBFaWNoZW4gZG9ydC4gRGllcyBzb2xsIHZlcmhpbmRlcm4sIGRhcyBnZXJhZGUgZWluZSBFaWNoZSByZXNldGV0CisvLyB3ZW5uIG1hbiBlaW5lIHRvZCBoYXQuCit7CisgICBjYWxsX290aGVyKFJPT00oIndlZzIiKSwgImRlbGF5X3Jlc2V0Iik7CisgICBjYXRjaChjYWxsX290aGVyKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCAiZGVsYXlfcmVzZXQiLCA5MDArcmFuZG9tKDM2MDApKSk7CisgICByZXR1cm4gKGludCk6OnJlbW92ZSgpOworfQorCisvLyB3ZW5uIG1hbiBkZW4gTU5QQyBtaXQgZWluZW0gYW5kZXJlbiBzdGRucGMga29tYmluaWVydCBtdWVzc2VuIGVpbmlnZQorLy8gZnVua3Rpb25lbiBwZXIgSGFuZCB1ZWJlcnNjaHJpZWJlbiB3ZXJkZW4uLi4uCisKK3ZvaWQgcmVzZXQoKQoreworICAgc3RkbnBjOjpyZXNldCgpOworICAgbW92aW5nOjptbnBjX3Jlc2V0KCk7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICBzdGRucGM6OmluaXQoKTsKKyAgIG1vdmluZzo6bW5wY19pbml0KCk7Cit9CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGgsIHN0cmluZyBkaXIsIHN0cmluZyBvdXQsIHN0cmluZyBpbikKK3sKKyAgIGludCBpOworCisgICAvLyBleHRyYSBmdWVyIGRlbiBaYXViZXJ3YWxkIGVpbmdlYmF1dAorICAgaWYgKGVudmlyb25tZW50KCkgJiYgb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSk9PVJPT00oIndlZzIiKSkgeworICAgICAgLy8gd2VubiBlcyBkaWUgZWluemlnZSBFaWNoZSBpc3QsIGRhbm4gYmxlaWJ0IHNpZSBoaWVyIHN0ZWhuLAorICAgICAgLy8gYmV3YWNodCBkZW4gV2VnIHVuZCBiZXdlZ3Qgc2ljaCBuaWNodCBtZWhyIGhpZXIgd2VnIQorICAgICAgb2JqZWN0ICppbnY7CisKKyAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSkgLSAoeyBNRSB9KTsKKyAgICAgIGZvciAoaT1zaXplb2YoaW52KS0xOyBpPj0wOyBpLS0pCisgICAgICAgICBpZiAoQkxVRV9OQU1FKGludltpXSk9PU5QQygibGF1ZmVpY2hlIikpIGJyZWFrOworICAgICAgaWYgKGk8MCkgcmV0dXJuIE1FX0NBTlRfTEVBVkVfRU5WOworICAgfQorICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgIGk9KGludClzdGRucGM6Om1vdmUoZGVzdCwgbWV0aCwgZGlyLCBvdXQsIGluKTsKKyAgIGlmIChpIT0xKSByZXR1cm4gaTsKKyAgIG1vdmluZzo6bW5wY19tb3ZlKCk7CisgICByZXR1cm4gMTsKK30KKworaW50IFByZXZlbnRGb2xsb3cob2JqZWN0IGRlc3QpCit7ICByZXR1cm4gbW92aW5nOjptbnBjX1ByZXZlbnRGb2xsb3coZGVzdCk7ICB9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL2xhdWZlaWNoZVxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3BpeGllLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3BpeGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkOTUzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcGl4aWUuYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIGtsZWluZXIgUGl4aWUiKTsKKyAgIFNldFByb3AoUF9TSVpFLCA1NStyYW5kb20oMTEpKTsKKyAgIFNldFByb3AoUF9MT05HLCBCUygKKyAgICAgIkRlciBQaXhpZSBpc3QgZXR3YSAiK1F1ZXJ5UHJvcChQX1NJWkUpKyJjbSBncm9zcyB1bmQgc2llaHQgdmVybXV0bGljaCBlaW5lbSAiCisgICAgKyJrbGVpbmVuIHB1bWVsaWdlbiBNZW5zY2hlbmtpbmQgYW0gYWVobmxpY2hzdGVuLiBXaWUgYWxsZSBQaXhpZXMgc2NoZWludCBlciAiCisgICAgKyJzZWhyIHZlcnNwaWVsdCB6dSBzZWluIHVuZCBuaWNodHMgYWxzIFVuZnVnIGltIEtvcGYgenUgaGFiZW4sIER1IHNvbGx0ZXN0ICIKKyAgICArIkRpY2ggYWxzbyB2b3IgaWhtIGlobiBhY2h0IG5laG1lbi4gQXVjaCB3ZW5uIGVyIGF1c3NpZWh0IHdpZSBlaW4gS2luZCwgc2ljaCAiCisgICAgKyJiZW5pbW10IHdpZSBlaW4gS2luZCwgc28ga2FubiBlciBEaXIgbWl0IHNlaW5lciBNYWdpZSBzaWNoZXIgdWViZWwgenUgc3BpZWxuLiIpKTsKKyAgIFNldFByb3AoUF9JTkZPLCAvKiBrbGVpbmUgV2FybnVuZyBmdWVyIGRpZSBLYWVtcGZlciA6KSAqLworICAgICAiTWFuIHNvbGx0ZSBzaWNoIGltbWVyIHZvciBkZXIgTWFnaWUgZGVyIFBpeGllcyBpbiBhY2h0IG5laG1lbiwgc2llIGlzdCBuaWNodFxuIgorICAgICsidW5iZWRpbmd0IGdlZmFlaHJsaWNoLCBhYmVyIGVzIGtvZW5uZW4gZGllIHVuZXJ3YXJ0ZXN0ZW4gRGluZ2UgZ2VzY2hlaG4uIFNvXG4iCisgICAgKyJpc3QgZHVyY2hhdXMgdm9uIExldXRlbiBiZWthbm50IGRpZSBlaW5lbiBLYW1wZiBhbHMga2xlaW5lIFJhdHRlIGJlZW5kZXRlbixcbiIKKyAgICArIm9kZXIgZGVyZW4gU2Nod2VydCBpbSBLYW1wZiBwbG9ldHpsaWNoIHp1IFNjaGVpc3NlIHplcmZsb3NzLi4uXG4iKTsKKyAgIFNldFByb3AoUF9OQU1FX0FESiwgImtsZWluIik7CisgICBTZXRQcm9wKFBfTkFNRSwgIlBpeGllIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9SQUNFLCAicGl4aWUiKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjMwLCJjb24iOjIwLCJzdHIiOjE1LCJkZXgiOjMwXSkgKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgMjApOworICAgU2V0UHJvcChQX01BWF9IUCwgNjAwKTsKKyAgIFNldFByb3AoUF9IUCwgNjAwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDgwMCk7CisgICBTZXRQcm9wKFBfU1AsIDgwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDI1MCk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVuIGtsZWluZW4gSGFlbmRlbiIsIDE1MCwgRFRfQkxVREdFT059KSApOworICAgU2V0UHJvcChQX1hQLCA2MDAqMTUwKjUpOworICAgQWRkQWRqZWN0aXZlKCJrbGVpbiIpOworICAgQWRkSWQoInBpeGllIik7Cit9CisKKy8vIHRlbGVwb3J0ZXIgWmllbGUgaW0gR2ViaWV0LiBEZXIgUGl4aWUgd2lsbCBqYSBlaW5mYWNoIG51ciBlaW4gYmlzc2NoZW4KKy8vIEFlcmdlcm4gdW5kIG5pY2h0IGhlbGZlbiAoZWluIFBpeGlla2FtcGYgaXN0IGtlaW4gQXVzZ2FuZyA6KQorI2RlZmluZSBERVNUICh7ImxpY2h0dW5nbm8iLCAibGljaHR1bmdzbyIsICJsaWNodHVuZ24iLCAibGljaHR1bmdzIiwgXAorICAgICAgICAgICAgICAgImxpY2h0dW5nbnciLCAibGljaHR1bmdzdyIsICJsaWNodHVuZ28iLCAibGljaHR1bmd3IiwgXAorICAgICAgICAgICAgICAgIndlZzIiLCAic3RlaW4ifSkKKwordm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQoreworICAgb2JqZWN0IG9iLCB3ZWFwb247CisgICAKKyAgIG9iPVNlbGVjdEVuZW15KCk7CisgICBpZiAob2IpIHN3aXRjaChyYW5kb20oNyo4KSkgeyAvLyBqZWRlIDh0ZSBSdW5kZSBlaW4gWmF1YmVyc3BydWNoLi4uCisgICAgICBjYXNlIDA6IC8vIGluIEZyb3NjaCB2ZXJ3YW5kZWxuLi4uCisgICAgICAgIGlmICghb2ItPlF1ZXJ5UHJvcChQX0ZST0cpKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsICJEZXIgUGl4aWUgZHJlaHQgRGlyIGVpbmUgbGFuZ2UgTmFzZSB1bmQgdmVyd2FuZGVsdCBEaWNoIGluIGVpbmVuIEZyb3NjaC5cbiIpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIGRyZWh0ICIrb2ItPm5hbWUoV0VNKSsiIGVpbmUgbGFuZ2UgTmFzZSB1bmQgdmVyd2FuZGVsdCAiCisgICAgICAgICAgICAgICAgK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGluIGVpbmVuIEZyb3NjaCwiKSwgb2IpOworICAgICAgICAgIG9iLT5TZXRQcm9wKFBfRlJPRywgMSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA4Li4xMDogLy8gZWluZmFjaCBudXIgbmVydmlnZXIgVGVsZXBvcnQgaW5uZXJoYWxiIGRlcyBHZWJpZXRzIDopCisgICAgICAgIHRlbGxfb2JqZWN0KG9iLAorICAgICAgICAgICJEZXIgUGl4aWUgc2NobGllc3N0IGt1cnogc2VpbmUgQXVnZW4gdW5kIGVoIER1IERpY2ggdmVyc2llaHN0LCB2ZXJzY2h3aW1tdFxuIgorICAgICAgICAgKyJhbGxlcyB1bSBEaWNoIGhlcnVtLi4uXG4iKTsKKyAgICAgICAgc2F5KEJTKCJEZXIgUGl4aWUgc2NobGllc3N0IGt1cnogc2VpbmUgQXVnZW4gdW5kIHBsb2V0emxpY2ggbG9lc3Qgc2ljaCAiCisgICAgICAgICAgICAgICtvYi0+bmFtZShXRVIpKyIgaW4gTHVmdCBhdWYuIiksIG9iKTsKKyAgICAgICAgb2ItPm1vdmUoUk9PTShERVNUW3JhbmRvbShzaXplb2YoREVTVCkpXSksIE1fVFBPUlR8TV9OT0NIRUNLfE1fU0lMRU5UKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSAxNjogLy8gR2VzY2hsZWNodCBhZW5kZXJuLi4uIDopCisgICAgICAgIHRlbGxfb2JqZWN0KG9iLAorICAgICAgICAgICJEZXIgUGl4aWUgZ3JpbnN0IGJyZWl0IGJpcyB1ZWJlciBiZWlkZSBPaHJlbiB1bmQgc2NoYXV0IERpY2ggYW4sIER1IHdlaXNzdFxuIgorICAgICAgICAgKyJnYXIgbmljaHQgd2llIERpciBnZXNjaGllaHQsIGFiZXIgaXJnZW5kZXR3YXMgYWVuZGVydCBzaWNoIGFuIERlaW5lbSBLb2VycGVyLlxuIik7CisgICAgICAgIHNheShCUygiRGVyIFBpeGllIGdyaW5zdCAiK29iLT5uYW1lKFdFTikrIiBicmVpdCBhbi4gUGxvZXR6bGljaCAiCisgICAgICAgICArKG9iLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUKKyAgICAgICAgID8gInZlcnNjaHdpbmRlbiBpaHJlIEJydWVzdGUgdW5kIGVzIHdhZWNoc3QgaWhyIHBsb2V0emxpY2ggZWluIEJhcnQuIgorICAgICAgICAgOiAidmVyc2Nod2luZGV0IHNlaW4gQmFydCB1bmQgaWhtIHdhY2hzZW4gendlaSBuZXVlIEJydWVzdGUuIikpLCBvYik7CisgICAgICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfR0VOREVSKT09RkVNQUxFKQorICAgICAgICAgIG9iLT5TZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgICAgICAgZWxzZSBvYi0+U2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSAyNDoKKyAgICAgICAgaWYgKG9iamVjdHAod2VhcG9uPW9iLT5RdWVyeVByb3AoUF9XRUFQT04pKSkgeworICAgICAgICAgICB3ZWFwb24tPkRvVW53aWVsZCgxKTsKKyAgICAgICAgICAgLy8gdmVyZmx1Y2h0ZSBXYWZmZW4gbmljaHQgYmV0cmVmZmVuIDopKQorICAgICAgICAgICBpZiAoIW9iamVjdHAod2VhcG9uLT5RdWVyeVByb3AoUF9XSUVMREVEKSkpIHsKKyAgICAgICAgICAgICAgc3RyaW5nIHN0cjEsIHN0cjI7CisgICAgICAgICAgICAgIHN0cjE9c3RyMj0od2VhcG9uKS0+bmFtZShXRVIpOworICAgICAgICAgICAgICBpZiAoc3RyMVswLi4yXT09ImVpbiIpIHsKKyAgICAgICAgICAgICAgICBzdHIxPSJEIitzdHIxOworICAgICAgICAgICAgICAgIHN0cjI9InMiK3N0cjI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICAgIkRlciBQaXhpZSBzdGFycnQgRGlyIGluIGRpZSBBdWdlbiB1bmQgc2NobmlwcHN0IGVpbm1hbCBrdXJ6IG1pdCBzZWluZW4gIgorICAgICAgICAgICAgICArIkZpbmdlcm4uIFBsb2V0emxpY2ggemVycmludCAiK3N0cjErIiBpbiBEZWluZW4gSGFlbmRlbiB6dSBlaW5lbSBIYXVmZW4gIgorICAgICAgICAgICAgICArIlNjaGVpc3NlLiIpKTsKKyAgICAgICAgICAgICAgc2F5KEJTKCJEZXIgUGl4aWUgc3RhcnJ0ICIrd2VhcG9uLT5uYW1lKFdFTSkrIiBpbiBkaWUgQXVnZW4gdW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyJzY2huaXBwc3QgZWlubWFsIGt1cnogbWl0IGRlbiBGaW5nZXJuLiBQbG9ldHpsaWNoICIKKyAgICAgICAgICAgICAgICAgICAgKyJ6ZXJyaW50ICIrd2VhcG9uLT5uYW1lKFdFTSkrIiAiK3N0cjIKKyAgICAgICAgICAgICAgICAgICAgKyIgaW4gZWluZW4gSGF1ZmVuIFNjaGVpc3NlLiIpLCBvYik7CisgICAgICAgICAgICAgIHdlYXBvbi0+cmVtb3ZlKCk7CisgICAgICAgICAgICAgIGlmICh3ZWFwb24pIGRlc3RydWN0KHdlYXBvbik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzMjoKKyAgICAgICAgaWYgKCFvYi0+UXVlcnlQcm9wKFBfQkxJTkQpKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICJEZXIgUGl4aWUgaGFlbHQgc2ljaCBkaWUgSGFuZCB2b3IgZGllIEF1Z2VuIHVuZCBncmluc3QgYnJlaXQuIFBsb2V0emxpY2ggIgorICAgICAgICAgICAgKyJtZXJrc3QgRHUsIHdpZSBhbGxlcyBnYW56IGR1bmtlbCB1bSBEaWNoIHJ1bSB3aXJkLi4uIikpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIGhhZWx0IHNpY2ggZGllIEhhbmQgdm9yIGRpZSBBdWdlbiB1bmQgZ3JpbnN0IGJyZWl0LiAiCisgICAgICAgICAgICAgICAgK29iLT5uYW1lKFdFUikKKyAgICAgICAgICAgICAgICArIiBzY2hhdXQgZGFyYXVmaGluIHppZW1saWNoIGlycml0aWVydCBpbiBkaWUgR2VnZW5kLiIpLCBvYik7CisgICAgICAgICAgb2ItPlNldFByb3AoUF9CTElORCwgMSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9QT0lTT04pPDMgJiYgb2ItPlF1ZXJ5UHJvcChQX01BWF9QT0lTT04pPj0zKSB7CisgICAgICAgICAgdGVsbF9vYmplY3Qob2IsIEJTKAorICAgICAgICAgICAgICJEZXIgUGl4aWUgc3RyZWljaHQgc2ljaCBtaXQgZGVyIEhhbmQgenVmcmllZGVuIHVlYmVyIHNlaW5lbiBCYXVjaCB1bmQgc2NoYXV0ICIKKyAgICAgICAgICAgICsiRGljaCBkYWJlaSBhbi4gUGxvZXR6bGljaCB3aXJkIERpciByaWNodGlnIHVlYmVsLi4uIikpOworICAgICAgICAgIHNheShCUygiRGVyIFBpeGllIHN0cmVpY2h0IHNpY2ggbWl0IHNlaW5lciBIYW5kIHp1ZnJpZWRlbiB1ZWJlciBzZWluZW4gQmF1Y2ggdW5kXG4iCisgICAgICAgICAgICAgICAgKyJzY2hhdXQgIitvYi0+bmFtZShXRU0pKyIgZGFiZWkgaW4gZGllIEF1Z2VuLiBQbG9ldHpsaWNoIHdpcmQgIitvYi0+bmFtZShXRU0pCisgICAgICAgICAgICAgICAgKyIgZ2FueiB1ZWJlbC4iKSwgb2IpOworICAgICAgICAgIG9iLT5TZXRQcm9wKFBfUE9JU09OLCAzKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ4OgorICAgICAgICBpZiAoIW9iLT5RdWVyeVByb3AoUF9ERUFGKSkgeworICAgICAgICAgIHRlbGxfb2JqZWN0KG9iLCAiRGVyIFBpeGllIGhhZWx0IHNpY2ggZGllIE9ocmVuIHp1IHVuZCBncmluc3QgYnJlaXQuXG4iKTsKKyAgICAgICAgICBzYXkoQlMoIkRlciBQaXhpZSBoYWVsdCBzaWNoIGRpZSBPaHJlbiB6dSB1bmQgZ3JpbnN0IGRhYmVpICIKKyAgICAgICAgICAgICAgICArb2ItPm5hbWUoV0VOKSsiIGFuLiIpLCBvYik7CisgICAgICAgICAgb2ItPlNldFByb3AoUF9ERUFGLCAxKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgfQorICAgaWYgKGVuZW15ICYmIHByZXNlbnQoZW5lbXksIGVudmlyb25tZW50KCkpKSA6OkF0dGFjayhlbmVteSk7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL3BpeGllXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcmllc2UuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvcmllc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhhM2UyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9yaWVzZS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8vIChjKSAyMDAzIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2luaGVyaXQgTlBDKCJzdGRucGMiKTsKKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIGNyZWF0ZV9kZWZhdWx0X25wYygzMCwgMjUwMCk7CisgICBTZXRQcm9wKFBfQVJUSUNMRSwgMCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJHcmltbWJhcnQgRmVsc2Vuc2NoaWViZXIiKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiVm9yIERpciBzaXR6dCBkZXIgUmllc2UgR3JpbW1iYXJ0IEZlbHNlbnNjaGllYmVyLiBFaWdlbnRsaWNoIHNjaGVpbnQgZXJcbiIKKyAgICArImVpbiBzZWhyIGd1dG11ZXRpZ2VyIHVuZCBmcmV1bmRsaWNoZXIgUmllc2UgenUgc2Vpbi4gQWJlciBpcmdlbmR3aWUgd2lya3RcbiIKKyAgICArImVyIGRlcnplaXQgc2VociB0cmF1cmlnLlxuIik7CisKKyAgIFNldFByb3AoUF9OQU1FLCAiR3JpbW1iYXJ0IEZlbHNlbnNjaGllYmVyIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9TSVpFLCAyOTcpOworICAgU2V0UHJvcChQX0FMSUdOLCAyMDApOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgICAoW0RUX0hPTFk6LTEuMCwKKyAgICAgICBEVF9VTkhPTFk6MC41LAorICAgICAgIERUX01BR0lDOjAuMjUsCisgICAgICAgRFRfUE9JU09OOi0wLjI1LAorICAgICAgIERUX1dISVA6LTAuNiwKKyAgICAgICBEVF9CTFVER0VPTjotMC4zLAorICAgICAgIERUX1BJRVJDRTotMC4xLAorICAgICAgIERUX1NMQVNIOi0wLjEKKyAgICAgXSkpOworCisgICBBZGRJbmZvKCh7ImZlbHNlbiIsICJmZWxzIn0pLAorICAgICAiSWNoIGxpZWJlIGVzIG1laW5lIE11c2tlbG4gYW56dXNwYW5uZW4gdW5kIEZlbHNlbiB6dSBzY2hpZWJlbi4iLAorICAgICAiYW50d29ydGV0OiAiKTsKKyAgIEFkZEluZm8oInNjaGllYmVuIiwKKyAgICAgIkljaCBoYWJlIGRvY2gga2VpbmUgRmVsc2VuIG1laHIgZGllIGljaCBzY2hpZWJlbiBrb2VubnRlLiIpOworICAgQWRkSW5mbygoeyJ0cmF1ZXIiLCAidHJhdXJpZ2tlaXQifSksCisgICAgICJGcnVlaGVyIGRhIGhhYmUgaWNoIGRlbiBnYW56ZW4gVGFnIGhpZXIgbWVpbmUgRmVsc2VuIGhpbi0gdW5kICIKKyAgICArImhlcmdlc2Nob2JlbiwgYWJlciBudW4gaGF0IFVsaW5pYSBtaXIgdmVyYm90ZW4gaGllciBpbSBXYWxkIG1pdCAiCisgICAgKyJkZW4gRmVsc2VuIHp1IHNwaWVsZW4gdW5kIGljaCBtdXNzdGUgc2llIGFsbGUgd2VndHJhZ2VuIDpvKCIsCisgICAgICJqYW1tZXJ0OiAiKTsKKyAgIEFkZEluZm8oInRhZyIsICJKYSBzbyBlaW4gVGFnIGlzdCBnYW56IHNjaG9lbiBsYW5nIG9obmUgRmVsc2VuIiwKKyAgICAgInNhZ3Q6ICIpOworICAgQWRkSW5mbygidWxpbmlhIiwKKyAgICAgICJFaW5lIHJpY2h0aWcgYmxvZWRlIEZlZSB1bmQgaGFldHRlIHNpZSBpaHJlIGRvb2ZlbiBaYXViZXJrcmFlZnRlIG5pY2h0LCIKKyAgICAgKyJrb2VubnRlIHNpZSB1bnMgaGllciBhdWNoIG5pY2h0IGFsbGUgc28gcnVta29tbWFuZGllcmVuICptb3BwZXIqLiIsCisgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oImdydW5kIiwKKyAgICAgICJOdXIgd2VpbCBtaXIgZWlubWFsIGF1c3ZlcnNlaGVuIGVpbiBrbGl0emVrbGVpbmVyIEZlbHMgaW4gZGVuIFR1ZW1wZWwgIgorICAgICArImdlZmFsbGVuIGlzdCwgbXVzc3RlIGljaCBhbGwgbWVpbmUgc2Nob2VuZW4gRmVsc2VuIGF1cyBkZW0gV2FsZCBicmluZ2VuLiIsCisgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oInR1ZW1wZWwiLAorICAgICAgIkJsb2VkZXIgVHVlbXBlbCwgd2VyIGJyYXVjaHQgZGVuIHNjaG9uISIsICJhbnR3b3J0ZXQgZ2VyZWl6dDogIik7CisgICBBZGRJbmZvKCJ6YXViZXJrcmFlZnRlIiwKKyAgICAgICJJY2ggZnJldSBtaWNoIHNjaG9uIHJpY2h0aWcgYXVmIGRlbiBUYWcsIGFuIGRlbSBVbGluaWFzIFphdWJlcmtyYWVmdGUgIgorICAgICArIm5hY2hsYXNzZW4hIiwKKyAgICAgICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLAorICAgICAgIldlbm4gZXMgaGllciB3aWVkZXIgZ2FueiB2aWVsZSBzY2hvZW5lIEZlbHNlbiBnYWViZSwgd2FlciBlciB3aWVkZXIgZGFzICIKKyAgICAgKyJyZWluc3RlIFBhcmFkaWVzLiIsICJhbnR3b3J0ZXQ6ICIpOworICAgQWRkSW5mbygicGFyYWRpZXMiLAorICAgICAgIkphIGZydWVoZXIgd2FyIGRlciBXYWxkIGhpZXIgZWlubWFsIGRhcyByZWluc3RlIFBhcmFkaWVzLiIsICJhbnR3b3J0ZXQ6ICIpOworCisgICBTZXRDaGF0cygzLAorICAgICAoe05hbWUoV0VSKSsiIHNhZ3Q6IEljaCBiaW4gc28gdHJhdXJpZy5cbiIsCisgICAgICAgTmFtZShXRVIpKyIgc2NobHVjaHp0OiBtZWluZSBzY2hvZW5lbiBGZWxzZW4uLiB3dWFhYWhoaGhoXG4iLAorICAgICAgIE5hbWUoV0VSKSsiIHNhZ3Q6IG5pZSB3aWVkZXIgd2VyZGUgaWNoIEZlbHNlbiBzY2hpZWJlbiBrb2VubmVuLlxuIiwKKyAgICAgICBOYW1lKFdFUikrIiBzYWd0OiBGIEUgTCBTIEUgTiAhXG4iLAorICAgICAgIE5hbWUoV0VSKSsiIGphbW1lcnQ6IERpZSBXZWx0IGlzdCBzbyBmdXJjaHRiYXIgdW5nZXJlY2h0IVxuIiwKKyAgICAgICBOYW1lKFdFUikrIiBmcmFndDogV2llIHNvbGwgaWNoIHNvIGJsb3NzIHdlaXRlcmxlYmVuP1xuIgorICAgICB9KSk7CisgICAKKyAgIEFkZElkKCJyaWVzZSIpOworICAgQWRkSWQoImdyaW1tYmFydCIpOworICAgQWRkSWQoImZlbHNlbnNjaGllYmVyIik7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpCisgICAgKyJnZXRvZXRldCB2b24gL3phdWJlcndhbGQvcmllc2VcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgR3JpbW1iYXJ0IHd1cmRlIHZvbiAgIitnZXRfa2lsbGVyKCkKKyAgICArIiBnZXRvZXRldC5cbiIpOworICA6OmRpZSgpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL25wYy9zdGRucGMuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvc3RkbnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiM2QyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvc3RkbnBjLmMKQEAgLTAsMCArMSwzOSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCAiL3N0ZC9ucGMiOworaW5oZXJpdCAiL3Avc2VydmljZS9tdXBmZWwvZ2V0a2lsbCI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFpBVUJFUldBTEROUEMsIDEpOworICAgU2V0UHJvcChQX0FHR1JFU1NJVkUsIChbUF9SQUNFOihbIkR1bmtlbGVsZiI6MSwgMDowLjBdKSBdKSk7Cit9CisKK2ludCBBdXRvQXR0YWNrKG9iamVjdCBvYikKK3sKKyAgIGlmIChvYiAmJiBvYi0+UXVlcnlQcm9wKFpBVUJFUldBTEQpPnRpbWUoKSkgcmV0dXJuIDE7CisgICByZXR1cm4gOjpBdXRvQXR0YWNrKG9iKTsKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBvYikKK3sKKyAgIGludCByZXQsIGlzX2VuZW15OworICAgaXNfZW5lbXk9SXNFbmVteShvYik7CisgICByZXQ9KGludCk6Okluc2VydEVuZW15KG9iKTsKKyAgIGlmICghaXNfZW5lbXkpIHsgLy8gYWxsZSBhbmRlcmVuIFphdWJlcndhbGQtTlBDcyBpbSBSYXVtIHZlcnN0YWVuZGlnZW4KKyAgICAgIGZpbHRlcl9vYmplY3RzKAorICAgICAgICBmaWx0ZXJfb2JqZWN0cyhhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLXVzZXJzKCksICJRdWVyeVByb3AiLCBaQVVCRVJXQUxETlBDKSwKKyAgICAgICAgIkluc2VydEVuZW15Iiwgb2IKKyAgICAgICk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorCitpbnQgRGVmZW5kKGludCBkYW0sIG1peGVkIGR0cywgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgIGlmIChlbmVteSkgZW5lbXktPlNldFByb3AoWkFVQkVSV0FMRCwgdGltZSgpK0FHR1JFU1NJVkVfVElNRSk7CisgICByZXR1cm4gKGludCk6OkRlZmVuZChkYW0sIGR0cywgc3BlbGwsIGVuZW15KTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvdGl0aW5hLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3RpdGluYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2UwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3RpdGluYS5jCkBAIC0wLDAgKzEsMTE0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJUaXRpbmEgZGllIFdhbGRmZWUiKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAgQlMoIlZvciBEaXIgc3RlaHQgVGl0aW5hIGRpZSBXYWxkZmVlLiBJaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIgd2VodCAiCisgICAgICsibGVpY2h0IGltIFdpbmQgdW5kIGRhcyBlaW56aWdlIHdhcyBzaWUgYmVkZWNrdCwgaXN0IGVpbiBsZWljaHRlcyBCbGFldHRlcmtsZWlkICIKKyAgICAgKyJkYXMgaWhyZSB3ZWlibGljaGVuIFJ1bmR1bmdlbiBhdXNzZXJvcmRlbnRsaWNoIGd1dCB6dXIgR2VsdHVuZyBicmluZ3QuICIKKyAgICAgKyJJaHJlIHNjaG9lbmVuIGJsYXVlbiBBdWdlbiwgdHVuIGVpbiB1ZWJyaWdlcyB1bSBEaWNoIGdhbnogd2FobnNpbm5pZyB6dSBtYWNoZW4uIikpOworICAgU2V0UHJvcChQX05BTUUsICJUaXRpbmEiKTsKKyAgIFNldFByb3AoUF9BUlRJQ0xFLCAwKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDgwKTsKKyAgIFNldFByb3AoUF9BVFRSSUJVVEVTLCAoWyJpbnQiOjYwLCJjb24iOjQwLCJzdHIiOjE2LCJkZXgiOjUwXSkgKTsKKyAgIFNldFByb3AoUF9ESVNBQkxFX0FUVEFDSywgLTEwMDAwKTsgLy8gaXMgbmljaCA6KQorICAgU2V0UHJvcChQX0JPRFksIDgwKTsKKyAgIFNldFByb3AoUF9NQVhfU1AsIDIwMDApOworICAgU2V0UHJvcChQX1NQLCAyMDAwKTsKKyAgIFNldFByb3AoUF9NQVhfSFAsIDYwMCk7CisgICBTZXRQcm9wKFBfSFAsIDYwMCk7CisgICBTZXRQcm9wKFBfQUxJR04sIDQwMCk7CisgICBTZXRQcm9wKFBfUkFDRSwgIkZlZSIpOworICAgU2V0UHJvcChQX1NJWkUsIDE2MCtyYW5kb20oMTYpKTsKKyAgIFNldFByb3AoUF9BTENPSE9MLCAwKTsKKyAgIFNldFByb3AoUF9DT1JQU0UsIE9CSigiZmVlbmxlaWNoZSIpKTsKKyAgIFNldFByb3AoUF9NQVhfQUxDT0hPTCwgMCk7IC8vIGtlaW4gcmF1c2NoZW4gOikKKyAgIEFkZEFkamVjdGl2ZSgid3VuZGVyc2Nob2VuIik7CisgICBBZGRJZCgoeyJ0aXRpbmEiLCAiZmVlIiwgIndhbGRmZWUiLCBXQUxESUQoImZlZSIpfSkpOworICAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IGlocmVuIHphcnRlbiBIYWVuZGVuIiwgMTUwLCBEVF9CTFVER0VPTn0pICk7CisgICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsIChbU0FfU1BFTExfUEVORVRSQVRJT046IDEwMF0pKTsKKyAgIFNldFByb3AoUF9YUCwgODAwKjIwMCo1KjIpOworICAgU2V0UHJvcChQX0dVSUxELCAiemF1YmVyZXIiKTsKKyAgIFNldFByb3AoUF9aX05PX01BVEVSSUFMLCAxKTsKKyAgIFNldFByb3AoUF9ERUZBVUxUX0lORk8sICJzY2h3ZWlndCB1bmQgbGFlY2hlbHQgRGljaCBlaW5mYWNoIG51ciBmcmV1bmRsaWNoIGFuLlxuIik7CisgICBNb2RpZnlTa2lsbCgidmVybGV0emUiLAorICAgICAgKFtTSV9TS0lMTEFCSUxJVFk6ODAwMCwgU0lfU1BFTExDT1NUOjAsCisgICAgICAgIFNJX1NQRUxMRkFUSUdVRTowLCBTSV9OT19DT05TRVFVRU5DRVM6MTAwMDAsCisgICAgICAgIFNJX1NLSUxMUkVTVFJfVVNFOihbUF9HVUlMRF9MRVZFTDowLFNSX0ZSRUVfSEFORFM6MF0pLAorICAgICAgICBTSV9BUk1PVVJfUkVTVFI6MF0pLDAsInphdWJlcmVyIik7CisgICBTZXRQcm9wKFBfR1VJTEQsIDApOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgICAgKFtEVF9VTkhPTFk6IDAuMjUsCisgICAgICAgIERUX0FJUjogICAgMC4zLAorICAgICAgICBEVF9QT0lTT046IDAuMTVdKSApOyAvLyBzb25zdCBzZWx0ZW4gaW4gYmVudXR6dW5nIDopCisKKyAgIEFkZEl0ZW0oT0JKKCJrYW1tIiksIENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJrbGVpZCIpLCBDTE9ORV9XRUFSKTsKKyAgIGlmIChmaWxlX3NpemUoU0FFQ0tDSEVOKT4wKSBBZGRJdGVtKFNBRUNLQ0hFTiwgQ0xPTkVfTkVXKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbG9uZygpCit7CisgICBpZiAoIVBMIHx8IFBMLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEUpCisgICAgICByZXR1cm4gUXVlcnkoUF9MT05HKQorICAgICAgICArIklociB1ZWJlcmhlYmxpY2hlcyBsYWVjaGVsbiBicmluZ3QgRGljaCBqZWRvY2ggdG90YWwgenVyIFdlaXNzZ2x1dCwgc28gZWluZVxuIgorICAgICAgICArIlppY2tlIGhpZXIgZGVuIGdhbnplbiBUYWcgcnVtenVzaXR6ZW4gdW5kIHNpY2ggbnVyIGRpZSBIYWFyZSB6dSBrYWVtbWVuLlxuIjsKKyAgIHJldHVybiBRdWVyeShQX0xPTkcpCisgICAgICsiTWl0IGlocmVtIGNoYXJtYW50ZW4gbGFlY2hlbG4sIHppZWh0IHNpZSBEaWNoIHNvZm9ydCBpbiBpaHJlbiBCYW5uIHVuZCBEdVxuIgorICAgICArInd1ZXJkZXN0IGlociBqZWRlbiBXdW5zY2ggZXJmdWVsbGVuLCBzbyBzaWUgZGVubiBlaW5lbiBhZXVzc2VybiB3dWVyZGUuXG4iOworfQorCit2b2lkIEF0dGFjayhvYmplY3QgZW5lbXkpCit7CisgICBpbnQgbm9ybWFsX3NwZWVkOworICAgbm9ybWFsX3NwZWVkPShlbmVteS0+UXVlcnlQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMpfHwoW10pKVtTQV9TUEVFRF18fDEwMDsKKyAgIGlmIChlbmVteSAmJiBlbmVteS0+UXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCkgPiBub3JtYWxfc3BlZWQpIHsKKyAgICAgIHdyaXRlKCJEaWUgRmVlIG1hY2h0IGVpbmUgYmVydWhpZ2VuZGUgSGFuZGJld2VndW5nIHVuZCBwbG9ldHpsaWNoIGZ1ZWhsc3QgRHUgRGljaFxuIgorICAgICAgICAgICArInJ1aGlnIHVuZCBEdSBtZXJrc3Qgd2llIER1IGFsbG1hZWhsaWNoIHdpZWRlciBsYW5nc2FtZXIgd2lyc3QuLi5cbiIpOworICAgICAgZW5lbXktPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtMjAsIDE4MCk7CisgICB9CisgICBpZiAoZW5lbXkpIDo6QXR0YWNrKGVuZW15KTsKKyAgIFNldFByb3AoUF9HVUlMRCwgInphdWJlcmVyIik7CisgICBjb21tYW5kKCJ2ZXJsZXR6ZSBtaXQgIisoeyJmZXVlciIsICJtYWdpZSIsICJlaXMiLCAid2Fzc2VyIiwgImdpZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2luZCIsICJzYWV1cmUiLCAibGFlcm0ifSlbcmFuZG9tKDgpXSApOworICAgU2V0UHJvcChQX0dVSUxELCAwKTsKK30KKworaW50IERlZmVuZChpbnQgZGFtLCBtaXhlZCBkdHMsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICBpbnQgbm9ybWFsX3NwZWVkOworICAgbm9ybWFsX3NwZWVkPShlbmVteS0+UXVlcnlQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMpfHwoW10pKVtTQV9TUEVFRF18fDEwMDsKKyAgIGlmIChlbmVteSAmJiBlbmVteS0+UXVlcnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCkgPiBub3JtYWxfc3BlZWQpIHsKKyAgICAgIHdyaXRlKE5hbWUoV0VSKSsiIG1hY2h0IGVpbmUgYmVydWhpZ2VuZGUgSGFuZGJld2VndW5nIHVuZCBwbG9ldHpsaWNoIGZ1ZWhsc3QgRHUgRGljaFxuIgorICAgICAgICAgICArInJ1aGlnIHVuZCBEdSBtZXJrc3Qgd2llIER1IGFsbG1hZWhsaWNoIHdpZWRlciBsYW5nc2FtZXIgd2lyc3QuLi5cbiIpOworICAgICAgZW5lbXktPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtMjAsIDE4MCk7CisgICB9CisKKyAgIGlmICgoIXNwZWxsIHx8IChtYXBwaW5ncChzcGVsbCkgJiYgc3BlbGxbU1BfUEhZU0lDQUxfQVRUQUNLXSkpICYmICFyYW5kb20oNCkpIHsKKyAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBOYW1lKFdFUikrIiB3ZWljaHQgc2NobmVsbCBlaW5lbiBTY2hyaXR0IHp1cnVlY2sgdW5kIHdlaWNodCBEZWluZW0gQW5ncmlmZiBhdXMuXG4iKTsKKyAgICAgIGRhbT0wOworICAgfQorICAgcmV0dXJuIChpbnQpOjpEZWZlbmQoZGFtLCBkdHMsIHNwZWxsLCBlbmVteSk7Cit9CisKK3ZvaWQgTm90aWZ5UGxheWVyRGVhdGgob2JqZWN0IHdobywgb2JqZWN0IGtpbGxlciwgb2JqZWN0IGxvc3RfZXhwKQoreworICBpZiAoIXdobyB8fCBraWxsZXIhPU1FKSByZXR1cm47IC8vIHVuaW50ZXJlc3NhbnQKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0dWlkKHdobykpKyIgZ2V0b2V0ZXQgdm9uIC96YXViZXJ3YWxkL3RpdGluYVxuIik7Cit9CisKK3ZvaWQgZGllKCkKK3sKKyAgbG9nX2ZpbGUoInBhZHJlaWMva2lsbCIsIGN0aW1lKHRpbWUoKSkrIiBUaXRpbmEgd3VyZGUgdm9uICIrZ2V0X2tpbGxlcigpKyIgZ2V0b2V0ZXQuXG4iKTsKKyAgOjpkaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvdWxpbmlhLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3VsaW5pYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTU5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3VsaW5pYS5jCkBAIC0wLDAgKzEsMTYwIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlICIvcC96YXViZXJlci96YXViZXJlci5oIgorCitpbmhlcml0IE5QQygic3RkbnBjIik7CisKK3N0cmluZyBpbmZvX3Rhcm56YXViZXIoKQoreworICAgb2JqZWN0IG9iOworICAgaWYgKHByZXNlbnQoIlxudGFybnphdWJlciIsIFBMKSkKKyAgICAgIHJldHVybiAic2FndDogSWNoIGhhYmUgRGljaCBkb2NoIGJlcmVpc3QgdmVyemF1YmVydC5cbiI7CisgICBvYj1jbG9uZV9vYmplY3QoT0JKKCJ0YXJuemF1YmVyIikpOworICAgb2ItPm1vdmUoUEwsIE1fTk9DSEVDSyk7CisgICBvYi0+SW5pdGlhbGl6ZShQTCk7CisgICByZXR1cm4gInNhZ3Q6IE51biBndXQsIHNvIHNlaSBlcy4uLlxuIgorICAgICAgICAgKyJtYWNodCBlaW5lIHdlaXRlIEhhbmRiZXdlZ3VuZyB1bmQgRHUgZnVlaGxzdCB3aWUgRHUgRGljaCB2ZXJ3YW5kZWxzdC5cbiIKKyAgICAgICAgICsic2FndDogVmllbCBHbHVlY2shIjsKK30KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIlVsaW5pYSBkaWUgV2FsZGZlZSIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICBCUygiVWViZXIgZGVtIFRlaWNoIHNjaHdlYnQgVWxpbmlhIGRpZSBXYWxkZmVlLiBJaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIgd2VodCAiCisgICAgICsibGVpY2h0IGltIFdpbmQgdW5kIGRhcyBlaW56aWdlIHdhcyBzaWUgYmVkZWNrdCwgaXN0IGVpbiBsZWljaHRlcyBCbGFldHRlcmtsZWlkICIKKyAgICAgKyJkYXMgaWhyZSB3ZWlibGljaGVuIFJ1bmR1bmdlbiBhdXNzZXJvcmRlbnRsaWNoIGd1dCB6dXIgR2VsdHVuZyBicmluZ3QuICIKKyAgICAgKyJJbiBkZXIgSGFuZCBoYWVsdCBzaWUgZWluZW4ga2xlaW5lbiBaYXViZXJzdGFiLCBtaXQgZGVtIHNpZSBob2NoIHVlYmVyIGFsbGVtIHRocm9udC4iKSk7CisgICBTZXRQcm9wKFBfTkFNRSwgIlVsaW5pYSIpOworICAgU2V0UHJvcChQX0FSVElDTEUsIDApOworICAgU2V0UHJvcChQX0dFTkRFUiwgRkVNQUxFKTsKKyAgIFNldFByb3AoUF9MRVZFTCwgODApOworICAgU2V0UHJvcChQX0FUVFJJQlVURVMsIChbImludCI6ODAsImNvbiI6NDAsInN0ciI6MTYsImRleCI6NTBdKSApOworICAgU2V0UHJvcChQX0RJU0FCTEVfQVRUQUNLLCAtMTAwMDApOyAvLyBpcyBuaWNoIDopCisgICBTZXRQcm9wKFBfQk9EWSwgODApOworICAgU2V0UHJvcChQX01BWF9TUCwgMjAwMCk7CisgICBTZXRQcm9wKFBfU1AsIDIwMDApOworICAgU2V0UHJvcChQX01BWF9IUCwgODAwKTsKKyAgIFNldFByb3AoUF9IUCwgODAwKTsKKyAgIFNldFByb3AoUF9BTElHTiwgNDAwKTsKKyAgIFNldFByb3AoUF9SQUNFLCAiRmVlIik7CisgICBTZXRQcm9wKFBfU0laRSwgMTYwK3JhbmRvbSgxNikpOworICAgU2V0UHJvcChQX0FMQ09IT0wsIDApOworICAgU2V0UHJvcChQX0NPUlBTRSwgT0JKKCJmZWVubGVpY2hlIikpOworICAgU2V0UHJvcChQX01BWF9BTENPSE9MLCAwKTsgLy8ga2VpbiByYXVzY2hlbiA6KQorICAgQWRkQWRqZWN0aXZlKCJ3dW5kZXJzY2hvZW4iKTsKKyAgIEFkZElkKCh7ImZlZSIsICJ3YWxkZmVlIiwgInVsaW5pYSIsIFdBTERJRCgiZmVlIil9KSk7CisgICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgaWhyZW4gemFydGVuIEhhZW5kZW4iLCAxNTAsIERUX0JMVURHRU9OfSkgKTsKKyAgIFNldFByb3AoUF9TS0lMTF9BVFRSSUJVVEVfT0ZGU0VUUywgKFtTQV9TUEVMTF9QRU5FVFJBVElPTjogMjUwXSkpOworICAgU2V0UHJvcChQX1hQLCA4MDAqMjAwKjUqMik7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX1pfTk9fTUFURVJJQUwsIDEpOworICAgU2V0UHJvcChQX0RFRkFVTFRfSU5GTywgInNjaHdlaWd0IHVuZCBsYWVjaGVsdCBEaWNoIGVpbmZhY2ggbnVyIGZyZXVuZGxpY2ggYW4uXG4iKTsKKyAgIEFkZEluZm8oKHsicXVlc3QiLCAiaGlsZmUiLCAiYXVmZ2FiZSIsICJkdW5rZWxlbGZlbmFtdWxldHQiLCAiZGVsZmVuYW11bGV0dCJ9KSwKKyAgICAgIk9oaCBpbiBkZXIgVGF0IGhhZXR0ZSBpY2ggZGEgZWluZSBBdWZnYWJlIGZ1ZXIgRGljaCwgYWJlciBpY2ggbXVzcyBEaWNoICIKKyAgICArIndhcm5lbiwgZGFzIHNpZSBuaWNodCBnYW56IHVuZ2VmYWVocmxpY2ggaXN0LlxuIgorICAgICsiRWluIGJlZnJldW5kZXRlciBLb2JvbGQgYmVyaWNodGV0ZSBtaXIgdm9uIGVpbmVtIGxhbmdlIHZlcnNjaG9sbGVuZW4gQnVjaCwgIgorICAgICsiZGFzcyBpbiBkZXIgQmlibGlvdGhlayBkZXIgRHVua2VsZWxmZW4gd2llZGVyIGF1ZmdldGF1Y2h0IGlzdC4gSW4gZGllc2VtICIKKyAgICArIkJ1Y2ggaXN0IHVudGVyIGFuZGVyZW0gdm9uIGVpbmVtIGFsdGVuIEFtdWxldHQgZGllIFJlZGUsIG1pdCBkZXNzZW4gSGlsZmUgIgorICAgICsiZGllIER1bmtlbGVsZmVuIGlocmUgYWx0ZSBNYWNodCB3aWVkZXJlcmxhbmdlbiB1bmQgZXJuZXV0IEZ1cmNodCB1bmQgIgorICAgICsiU2NocmVja2VuIHVlYmVyIGRhcyBnZXNhbXRlIE1vcmdlbmdyYXVlbiBicmluZ2VuIGtvZW5udGVuLiAiCisgICAgKyJXZW5uIER1IGRpZSBHZWZhaHIgbmljaHQgc2NoZXVzdCwgd2FlcmUgZXMgYXVzc2Vyb3JkZW50bGljaCBuZXR0IHdlbm4gRHUgIgorICAgICsiRGljaCBuYWNoIFp6ZXJlbnp6ZW4gYmVnZWJlbiB3dWVyZGVzdCB1bmQgZG9ydCBuYWNoIGRlbSBBbXVsZXR0IHN1Y2hzdC5cbiIKKyAgICArIlNvbGx0ZXN0IER1IGRhcyBBbXVsZXR0IHRhdHNhZWNobGljaCBmaW5kZW4sIHNvIGlzdCBlcyB3aWNodGlnIGRhcyBlcyAiCisgICAgKyJhdWYga2VpbmVuIEZhbGwgaW4gZGllIEhhbmQgZGVyIER1bmtlbGVsZmVuIGdlcmFldCB1bmQgemVyc3RvZXJ0IHdpcmQuIiwKKyAgICAiYW50d29ydGV0OiAiKTsKKyAgIEFkZEluZm8oImdlZmFociIsCisgICAgICJOdW4gRHUgd2lyc3QgRGljaCBtaXR0ZW4gdW50ZXIgZGllIER1bmtlbGVsZmVuIGJlZ2ViZW4gbXVlc3NlbiB1bSAiCisgICAgKyJ6dSBpaHJlciBCaWJsaW90aGVrIGdlbGFuZ2VuIHp1IGtvZW5uZW4uIEluIFp6ZXJlbnp6ZW4gd2lyc3QgRHUgIgorICAgICsiaGllcmJlaSB2b2VsbGlnIGF1ZiBEaWNoIGFsbGVpbiBnZXN0ZWxsdCBzZWluLlxuIgorICAgICsiQWxsZXMgd2FzIGljaCBoaWVyYmVpIGZ1ZXIgRGljaCB0dW4ga2FubiwgaXN0IGVpbmVuIFRhcm56YXViZXIgenUgIgorICAgICsic3ByZWNoZW4gZGVyIERpY2ggYWV1c3NlcmxpY2ggaW4gZWluZW4gRHVua2VsZWxmZW4gdmVyd2FuZGVsdC4gIgorICAgICsiQWJlciB2b3JzaWNodCwgc3BhZXRlc3RlbnMgd2VubiBEdSBEaWNoIGluIGVpbmVuIEthbXBmIHZlcndpY2tlbHN0LCAiCisgICAgKyJ3aXJkIHNpY2ggZGVyIFphdWJlciBsb2VzZW4uIiwgInNhZ3Q6ICIpOworICAgQWRkSW5mbygidGFybnphdWJlciIsICMnaW5mb190YXJuemF1YmVyLCAiIik7CisgICBBZGRJbmZvKCh7ImZ1cmNodCIsICJzY2hyZWNrZW4iLCAibWFjaHQifSksCisgICAgICJKYSBmcnVlaGVyIHdhcmVuIGRpZSBEdW5rZWxlbGZlbiBzZWhyIHNlaHIgbWFlY2h0aWcgdW5kIGFsbGUgIgorICAgICsiZnJpZWRsaWViZW5kZW4gR2VzY2hvZXBmZSBkaWVzZXIgV2VsdCBzb2xsdGVuIGhvZmZlbiBkYXMgc2llICIKKyAgICArIm5pZSB3aWVkZXIgaWhyZSBhbHRlIE1hY2h0IGVybGFuZ2VuIHdlcmRlbi4iLCAiYW50d29ydGV0OiAiKTsgIAorICAgQWRkSW5mbygiYW11bGV0dCIsCisgICAgICJOdW4gbGVpZGVyIHdlaXNzIGljaCBhdWNoIG5pY2h0cyBnZW5hdWVzIHVlYmVyIGRhcyBBbXVsZXR0LiBJY2ggYmluICIKKyAgICArIm5pY2h0IG1hbCBzaWNoZXIgb2IgZXMgZXhpc3RpZXJ0IG9kZXIgamUgZXhpc3RpZXJ0IGhhdC4gQWJlciBzb2xsdGUgIgorICAgICsiZXMgbm9jaCBleGlzdGllcmVuLCBtdXNzIGVzIGF1ZiBqZWRlbiBGYWxsIHplcnN0b2VydCB3ZXJkZW4hIiwgInNhZ3Q6ICIpOworICAgQWRkSW5mbygia29ib2xkIiwKKyAgICAgIkljaCBoYWJlIHZlcnNwcm9jaGVuIGlobiBuaWNodCB6dSB2ZXJyYXRlbiB1bmQgc28ga2FubiBpY2ggRGlyIG5pY2h0cyAiCisgICAgKyJ3ZWl0ZXIgdWViZXIgaWhuIHNhZ2VuLiIsICJhbnR3b3J0ZXQ6ICIpOworICAgQWRkSW5mbygoeyJidWNoIiwgImJpYmxpb3RoZWsifSksCisgICAgICJJY2ggZGVua2UgYW0gYmVzdGVuIGJlZ2lic3QgRHUgRGljaCBpbiBkaWUgSG9laGxlIGRlcyBMb2V3ZW4gdW5kIHZlcnN1Y2hzdCAiCisgICAgKyJpbiBkZXIgQmlibGlvdGhlayBkZXIgRHVua2VsZWxmZW4gc2VsYnN0IGVpbiBCbGljayBpbiBkaWVzIEJ1Y2ggenUgd2VyZmVuLlxuIgorICAgICsiV2VubiBpY2ggZGFzIG5vY2ggcmVjaHQgaW4gRXJpbm5lcnVuZyBoYWJlLCBoYW5kZWx0IGVzIHNpY2ggaGllcmJlaSB1bSAiCisgICAgKyJkYXMgQnVjaCBlaW5lcyBEdW5rZWxlbGZlbiBuYW1lcyBUZXlyaW9uLiIsICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oImxvZXdlbiIsICJEYXMgaXN0IGRvY2ggYmxvc3MgZWluZSBSZWRld2VuZHVuZy4iLCAic2FndDogIik7CisgICBBZGRJbmZvKCJyZWRld2VuZHVuZyIsICJOYSBkYXMgc2FndCBtYW4gaGFsdCBzby4uLiIsICJzYWd0OiAiKTsKKyAgIEFkZEluZm8oKHsiaG9laGxlIiwgInp6ZXJlbnp6ZW4ifSksCisgICAgICJEZXIgRWluZ2FuZyBuYWNoIFp6ZXJlbnp6ZW4gbGllZ3QgaW4gZGVyIG5hZWhlIHZvbiBXaWxoZWxtc2J1cmcgZ3V0IGhpbnRlciAiCisgICAgKyJlaW5lbSBXYXNzZXJmYWxsIHZlcnN0ZWNrdC4iLCAic2FndDogIik7CisgICBNb2RpZnlTa2lsbCgidmVybGV0emUiLAorICAgICAgKFtTSV9TS0lMTEFCSUxJVFk6MTAwMDAsIFNJX1NQRUxMQ09TVDowLAorICAgICAgICBTSV9TUEVMTEZBVElHVUU6MCwgU0lfTk9fQ09OU0VRVUVOQ0VTOjEwMDAwLAorICAgICAgICBTSV9TS0lMTFJFU1RSX1VTRTooW1BfR1VJTERfTEVWRUw6MCxTUl9GUkVFX0hBTkRTOjBdKSwKKyAgICAgICAgU0lfQVJNT1VSX1JFU1RSOjBdKSwwLCJ6YXViZXJlciIpOworICAgU2V0UHJvcChQX0dVSUxELCAwKTsKKyAgIFNldFByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUywKKyAgICAgIChbRFRfVU5IT0xZOiAwLjI1LAorICAgICAgICBEVF9QT0lTT046IDAuMTUsIAorICAgICAgICBEVF9NQUdJQzogLTAuM10pICk7CisKKyAgIEFkZEl0ZW0oT0JKKCJ6YXViZXJzdGFiIiksIENMT05FX1dJRUxEKTsKKyAgIEFkZEl0ZW0oT0JKKCJrbGVpZCIpLCBDTE9ORV9XRUFSKTsKKyAgIGlmIChmaWxlX3NpemUoU0FFQ0tDSEVOKT4wKSBBZGRJdGVtKFNBRUNLQ0hFTiwgQ0xPTkVfTkVXKTsKK30KKwordm9pZCBBdHRhY2sob2JqZWN0IGVuZW15KQoreworICAgaW50IG5vcm1hbF9zcGVlZDsKKyAgIG5vcm1hbF9zcGVlZD0oZW5lbXktPlF1ZXJ5UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKXx8KFtdKSlbU0FfU1BFRURdfHwxMDA7CisgICBpZiAoZW5lbXkgJiYgZW5lbXktPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQpID4gbm9ybWFsX3NwZWVkKSB7CisgICAgICB3cml0ZSgiRGllIEZlZSBtYWNodCBlaW5lIGJlcnVoaWdlbmRlIEhhbmRiZXdlZ3VuZyB1bmQgcGxvZXR6bGljaCBmdWVobHN0IER1IERpY2hcbiIKKyAgICAgICAgICAgKyJydWhpZyB1bmQgRHUgbWVya3N0IHdpZSBEdSBhbGxtYWVobGljaCB3aWVkZXIgbGFuZ3NhbWVyIHdpcnN0Li4uXG4iKTsKKyAgICAgIGVuZW15LT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgLTIwLCAxODApOworICAgfQorICAgaWYgKGVuZW15KSA6OkF0dGFjayhlbmVteSk7CisgICBTZXRQcm9wKFBfR1VJTEQsICJ6YXViZXJlciIpOworICAgY29tbWFuZCgidmVybGV0emUgbWl0ICIrKHsiZmV1ZXIiLCAibWFnaWUiLCAiZWlzIiwgIndhc3NlciIsICJnaWZ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbmQiLCAic2FldXJlIiwgImxhZXJtIn0pW3JhbmRvbSg4KV0gKTsKKyAgIFNldFByb3AoUF9HVUlMRCwgMCk7Cit9CisKK2ludCBEZWZlbmQoaW50IGRhbSwgbWl4ZWQgZHRzLCBtaXhlZCBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICAgaW50IG5vcm1hbF9zcGVlZDsKKyAgIG5vcm1hbF9zcGVlZD0oZW5lbXktPlF1ZXJ5UHJvcChQX1NLSUxMX0FUVFJJQlVURV9PRkZTRVRTKXx8KFtdKSlbU0FfU1BFRURdfHwxMDA7CisgICBpZiAoZW5lbXkgJiYgZW5lbXktPlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQpID4gbm9ybWFsX3NwZWVkKSB7CisgICAgICB3cml0ZShOYW1lKFdFUikrIiBtYWNodCBlaW5lIGJlcnVoaWdlbmRlIEhhbmRiZXdlZ3VuZyB1bmQgcGxvZXR6bGljaCBmdWVobHN0IER1IERpY2hcbiIKKyAgICAgICAgICAgKyJydWhpZyB1bmQgRHUgbWVya3N0IHdpZSBEdSBhbGxtYWVobGljaCB3aWVkZXIgbGFuZ3NhbWVyIHdpcnN0Li4uXG4iKTsKKyAgICAgIGVuZW15LT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgLTIwLCAxODApOworICAgfQorCisgICBpZiAoKCFzcGVsbCB8fCAobWFwcGluZ3Aoc3BlbGwpICYmIHNwZWxsW1NQX1BIWVNJQ0FMX0FUVEFDS10pKSAmJiAhcmFuZG9tKDMpKSB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgTmFtZShXRVIpKyIgd2VpY2h0IHNjaG5lbGwgZWluZW4gU2Nocml0dCB6dXJ1ZWNrIHVuZCB3ZWljaHQgRGVpbmVtIEFuZ3JpZmYgYXVzLlxuIik7CisgICAgICBkYW09MDsKKyAgIH0KKyAgIHJldHVybiAoaW50KTo6RGVmZW5kKGRhbSwgZHRzLCBzcGVsbCwgZW5lbXkpOworfQorCit2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCB3aG8sIG9iamVjdCBraWxsZXIsIG9iamVjdCBsb3N0X2V4cCkKK3sKKyAgaWYgKCF3aG8gfHwga2lsbGVyIT1NRSkgcmV0dXJuOyAvLyB1bmludGVyZXNzYW50CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgIitjYXBpdGFsaXplKGdldHVpZCh3aG8pKSsiIGdldG9ldGV0IHZvbiAvemF1YmVyd2FsZC91bGluaWFcbiIpOworfQorCit2b2lkIGRpZSgpCit7CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgVWxpbmlhIHd1cmRlIHZvbiAiK2dldF9raWxsZXIoKSsiIGdldG9ldGV0LlxuIik7CisgIDo6ZGllKCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3dhZWNodGVyLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvbnBjL3dhZWNodGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjMWExMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9ucGMvd2FlY2h0ZXIuYwpAQCAtMCwwICsxLDg3IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCBOUEMoInN0ZG5wYyIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX05BTUUsICJXYWVjaHRlciBkZXMgV2FsZGVzIik7CisgICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgV2FlY2h0ZXIgZGVzIFdhbGRlcyIpOworICAgU2V0UHJvcChQX0xPTkcsCisgICAgICJWb3IgRGlyIHN0ZWh0IGVpbmUgc2VociBzZWhyIGFsdGUgRWljaGUuIERvY2ggZGllc2UgRWljaGUgaXN0IGtlaW5lXG4iCisgICAgKyJnZXdvZWhubGljaGUgRWljaGUsIHdpZSBEdSBzaWUgYmVyZWl0cyBhbiB2aWVsZW4gYW5kZXJlbiBTdGVsbGVuIGdlc2VobiBoYXN0LlxuIgorICAgICsiRGllc2UgRWljaGUgbGVidCEgRHUga2FubnN0IGRldXRsaWNoIGVpbmVuIE11bmQsIGVpbmUgTmFzZSB1bmQgc29nYXIgendlaVxuIgorICAgICsiT2hyZW4gZXJrZW5uZW4uIFNpZSBpc3QgZWlnZW50bGljaCBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbiwga2FubiBhYmVyIGF1Y2hcbiIKKyAgICArInNlaHIgc2VociBib2VzZSB3ZXJkZW4sIHdlbm4gZXMgamVtYW5kIHdhZ3QgZGllIFJ1aGUgZGVzIFdhbGRlcyB6dSBzdG9lcmVuLlxuIik7CisgICBTZXRQcm9wKFBfUkFDRSwgImVpY2hlIik7CisgICBTZXRQcm9wKFBfQUdHUkVTU0lWRSwgMCk7CisgICBTZXRQcm9wKFBfTEVWRUwsIDEwMCk7CisgICBTZXRQcm9wKFBfQVRUUklCVVRFUywgKFsiaW50Ijo4MCwiY29uIjoxMDAsInN0ciI6MTAwLCJkZXgiOjIwXSkgKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICAgU2V0UHJvcChQX01BWF9IUCwgMTAwMCk7CisgICBTZXRQcm9wKFBfSFAsIDEwMDApOworICAgU2V0UHJvcChQX0FMSUdOLCA1MDApOworICAgU2V0UHJvcChQX0JPRFksIDEwMCk7CisgICBTZXRQcm9wKFBfU0laRSwgMTUwMCk7CisgICBTZXRQcm9wKFBfRElTQUJMRV9BVFRBQ0ssIC0xMDAwMCk7IC8vIGlzIG5pY2ggOikKKyAgIEFkZElkKCh7ImVpY2hlIiwgIndhZWNodGVyIiwid2FlY2h0ZXIgZGVzIHdhbGRlcyIsIFdBTERJRCgid2FlY2h0ZXJlaWNoZSIpIH0pKTsKKyAgIFNldFByb3AoUF9IQU5EUywgKHsiIG1pdCBlaW5lbSBzZWluZXIgbGFuZ2VuIEFlc3RlIiw1NTAsRFRfV0hJUH0pICk7CisgICBTZXRQcm9wKFBfU0tJTExfQVRUUklCVVRFX09GRlNFVFMsIChbU0FfU1BFRUQ6MjEwXSkpOworICAgU2V0UHJvcChQX05PQ09SUFNFLCAxKTsKKyAgIFNldFByb3AoUF9YUCwgMTAwMCo1NTAqNSk7CisgICBTZXRQcm9wKFBfREVGQVVMVF9JTkZPLCAiYmxlaWJ0IGFic29sdXQgcmVndW5nc2xvcyB1bmQgcmVhZ2llcnQgdWViZXJoYXVwdCBuaWNodC5cbiIpOworICAgU2V0UHJvcChQX1JFU0lTVEFOQ0VfU1RSRU5HVEhTLAorICAgIChbRFRfU0xBU0g6ICAgICAwLjEsCisgICAgICBEVF9NQUdJQzogICAgLTEuMCwKKyAgICAgIERUX0JMVURHRU9OOiAtMC41LAorICAgICAgRFRfUE9JU09OOiAgICAwLjI1LAorICAgICAgRFRfSE9MWTogICAgIC0xLjAsCisgICAgICBEVF9SSVA6ICAgICAgIDAuMjUsCisgICAgICBEVF9GSVJFOiAgICAgIDAuMjUsCisgICAgICBEVF9QSUVSQ0U6ICAgLTAuNSwKKyAgICAgIERUX1dISVA6ICAgICAtMS4wIF0pICk7CisgICBBZGRDbWQoKHsib3N0ZW4iLCAid2VzdGVuIn0pLCAiY21kX2Jsb2NrZW4iKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfaW5mbygpCit7CisgICBpZiAoIVBMIHx8IFBMLT5RdWVyeVByb3AoWkFVQkVSV0FMRCk8PXRpbWUoKSkKKyAgICAgIHJldHVybiAiRGllIGFsdGUgRWljaGUgaXN0IERpciBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbi4gRXMgaXN0IGplZG9jaCBhdWNoIHNpY2hlclxuIgorICAgICAgICAgICAgKyJrbHVnIGRpZXNlcyBuaWNodCB6dSBhZW5kZXJuLCBkYSBzaWUgbWl0IGlocmVuIEFlc3RlbiB3b2hsIGF1Y2ggc2VociBrcmFlZnRpZ1xuIgorICAgICAgICAgICAgKyJ6dXNjaGxhZ2VuIGthbm4uXG4iOworICAgcmV0dXJuICJEdSBoYXN0IGRlbiBab3JuIGRlciBhbHRlbiBXYWVjaHRlcmVpY2hlIGF1ZiBEaWNoIGdlem9nZW4sIGRhcyB3YXIgZ2FueiB1bmRcbiIKKyAgICAgICAgICsiZ2FyIG5pY2h0IGtsdWcgdm9uIERpci4gSmV0enQgbGViZSBhdWNoIG1pdCBkZW4gS29uc2VxdWVuemVuLi4uLlxuIjsKK30KKworc3RhdGljIGludCBjbWRfYmxvY2tlbigpCit7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChQX1JBQ0UpPT0iRHVua2VsZWxmIiAmJgorICAgICAgIFBMLT5RdWVyeVByb3AoQVVTR0FORyk9PXF1ZXJ5X3ZlcmIoKSkgeworICAgICAgd3JpdGUoQlMoTmFtZShXRVIsIDEpKyIgbGFlc3N0IERpY2ggbmljaHQgdm9yYmVpLiIpCisgICAgICAgICAgICticmVha19zdHJpbmcoIkR1IHNvbGx0ZXN0IGhpZXIgYmVzc2VyIHZlcnNjaHdpbmRlbiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyJzbyBUeXBlbiB3aWUgRHUgc2luZCBoaWVyIG5pY2h0IGdlcm4gZ2VzZWhuISIsCisgICAgICAgICAgICAgICAgICAgICAgICA3OCwgTmFtZShXRVIsIDEpKyIgc2FndDogIikpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBpZiAoUEwgJiYgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKSAmJgorICAgICAgIFBMLT5RdWVyeVByb3AoQVVTR0FORyk9PXF1ZXJ5X3ZlcmIoKSkgeworICAgICAgd3JpdGUoQlMoTmFtZShXRVIsIDEpKyIgc3RlaHQgRGlyIGRhIGxlaWRlciBpbSBXZWcgdW5kIGxhZXNzdCBEaWNoIG5pY2h0IHZvcmJlaS4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KK30KKworaW50IHJlbW92ZSgpCit7CisgICBjYWxsX290aGVyKFJPT00oIndlZzEiKSwgImRlbGF5X3Jlc2V0Iik7CisgICByZXR1cm4gKGludCk6OnJlbW92ZSgpOworfQorCit2b2lkIE5vdGlmeVBsYXllckRlYXRoKG9iamVjdCB3aG8sIG9iamVjdCBraWxsZXIsIG9iamVjdCBsb3N0X2V4cCkKK3sKKyAgaWYgKCF3aG8gfHwga2lsbGVyIT1NRSkgcmV0dXJuOyAvLyB1bmludGVyZXNzYW50CisgIGxvZ19maWxlKCJwYWRyZWljL2tpbGwiLCBjdGltZSh0aW1lKCkpKyIgIitjYXBpdGFsaXplKGdldHVpZCh3aG8pKSsiIGdldG9ldGV0IHZvbiAvemF1YmVyd2FsZC93YWVjaHRlclxuIik7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2ZlZW5sZWljaGUuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovZmVlbmxlaWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlN2UwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2ZlZW5sZWljaGUuYwpAQCAtMCwwICsxLDI0IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0ICJzdGQvY29ycHNlIjsKKworaW50IG1hbXBmKCBzdHJpbmcgc3RyICkKK3sKKyAgIG9iamVjdCBvYjsKKyAgIGlmIChRdWVyeURlY2F5KCk8MykgcmV0dXJuIChpbnQpOjptYW1wZihzdHIpOworICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZXNzZW4/XG4iKTsKKyAgIGlmICghc3RyIHx8ICFpZChzdHIpKSByZXR1cm4gMDsKKyAgIGlmICghUEwtPmVhdF9mb29kKDgpKSByZXR1cm4gMTsgLy8gZmVobGVybWVsZHVuZyBnaWJ0IGVhdF9mb29kIGF1cworICAgaWYgKCFvYmplY3RwKG9iPXByZXNlbnQoV0FMRElEKCJsZWljaGVubXAiKSwgUEwpKSkgeworICAgICAgb2I9Y2xvbmVfb2JqZWN0KE9CSigibGVpY2hlbm1wIikpOworICAgICAgb2ItPm1vdmUoUEwsIE1fTk9DSEVDS3xNX0dFVCk7CisgICB9CisgICBvYi0+bmV3X2NvcnBzZSgpOworICAgUEwtPnJlc3RvcmVfc3BlbGxfcG9pbnRzKDUwK3JhbmRvbSgxMDApKTsKKyAgIHdyaXRlKCJEdSBtZXJrc3Qgd2llIGRpZSBub2NoIGltIEtvZXJwZXIgdmVyYmxpZWJlbmUgRW5lcmdpZSBpbiBEaWNoIHVlYmVyZmxpZXNzdC5cbiIpOworICAgcmVtb3ZlKCk7CisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovaGFobmVuZnVzcy5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai9oYWhuZW5mdXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5MmU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovaGFobmVuZnVzcy5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlcmxpc3RlLmg+CisjaW5jbHVkZSA8aXRlbXMva3JhZXV0ZXIva3JhZXV0ZXIuaD4KKyNpbmNsdWRlICIuLi9maWxlcy5oIgorCitpbmhlcml0IFNURFBMQU5UOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgY3VzdG9taXplTWUoV0FTU0VSX0hBSE5FTkZVU1NfV0VJU1MpOworfQorCisvKnZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCkKK3sKKyAgIC8vIGRpZSBFaW53b2huZXIgZGVzIFphdWJlcndhbGRzIHNlaGVuIGVzIG5pY2h0IGdlcm5lLCB3ZW5uIGplbWFuZCBpaHJlCisgICAvLyBtYWdpc2NoZW4gUGZsYW56ZW4gcGZsdWVja3QuLi4KKyAgIGludCByZXM7CisgICByZXM9KGludCk6Om1vdmUoZGVzdCwgbWV0aG9kKTsKKyAgIGlmIChyZXMhPTEpIHJldHVybiByZXM7CisgICBpZiAoZW52aXJvbm1lbnQoKSkgCisgICAgIGVudmlyb25tZW50KCktPlNldFByb3AoWkFVQkVSV0FMRCwgdGltZSgpK0FHR1JFU1NJVkVfVElNRSk7CisgICByZXR1cm4gMTsKK30qLworCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIGlmICggIW9sZGVudiAmJiBvYmplY3RwKGRlc3QpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZGVzdCkgJiYKKyAgICAgICBzdHJzdHIob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZGVzdCkpLCJ6YXViZXJ3YWxkIik+LTEpIHsKKyAgICBkZXN0LT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICB9CisgIHJldHVybiA6Ok5vdGlmeU1vdmUoZGVzdCwgb2xkZW52LCBtZXRob2QpOworfQorCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2thbW0uYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmova2FtbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmQ2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2thbW0uYwpAQCAtMCwwICsxLDM5IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC93ZWFwb24iOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBsYW5nZXIgS2FtbSIpOworICAgU2V0UHJvcChQX05BTUUsICJLYW1tIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiRGllc2VyIHNjaG9lbmUgS2FtbSBnZWhvZXJ0ZSBlaW5tYWwgZWluZXIgV2FsZGZlZSBkaWUgZGFtaXQgaW1tZXIgaWhyIHNjaG9lbmVzXG4iCisgICAgKyJsYW5nZXMgSGFhciBrYWVtbXRlLi4uXG4iKTsKKyAgIEFkZEFkamVjdGl2ZSgia2FtbSIpOworICAgQWRkSWQoImthbW0iKTsKKyAgIFNldFByb3AoUF9XRUFQT05fVFlQRSwgV1RfQ0xVQik7CisgICBTZXRQcm9wKFBfREFNX1RZUEUsIERUX1BJRVJDRSk7CisgICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICAgU2V0UHJvcChQX1dDLCAxMDApOworICAgU2V0UHJvcChQX1ZBTFVFLCAxMDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgKHsgTUFUX01JU0NfTUFHSUMsIE1BVF9IT1JOIH0pICk7CisgICBBZGRDbWQoImthZW1tZSIsICJjbWRfa2FlbW1lbiIpOworfQorCitzdGF0aWMgaW50IGNtZF9rYWVtbWVuKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBkZW5uIGthZW1tZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJoYWFyZSIpIHJldHVybiAwOworICAgd3JpdGUoIkVpdGVsIHdpZSBEdSBiaXN0LCB2ZXJzdWNoc3QgRHUgRGlyIG1pdCBkZW0gS2FtbSBkaWUgSGFhcmUgenUga2FlbW1lbiwgZG9jaFxuIgorICAgICAgICArImlyZ2VuZHdpZSBpc3QgZXIgZWluIGJpc3NjaGVuIHp1IGdyb3NzIGZ1ZXIgRGVpbmUgSGFhcmUuXG4iKTsKKyAgIHNheShCUygiRWl0ZWwgd2llICIrUEwtPlF1ZXJ5UHJvbm91bigpKyIgaXN0LCBrYWVtbXQgc2ljaCAiK1BMLT5uYW1lKFdFUikKKyAgICAgICAgICsiIGRpZSBIYWFyZS4gRG9jaCBpcmdlbmR3aWUgaXN0IGRlciBLYW1tIGVpbiBiaXNzY2hlbiB6dSBncm9zcyBmdWVyICIKKyAgICAgICAgICtQTC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIFdFTiwgMSkrIiBrdXJ6ZW4gSGFhcmUuIikpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2tsZWlkLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL2tsZWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyZTE1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmova2xlaWQuYwpAQCAtMCwwICsxLDM4IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC9hcm1vdXIiOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiQmxhZXR0ZXJrbGVpZCIpOworICAgU2V0UHJvcChQX1NIT1JULCAiRWluIEJsYWV0dGVya2xlaWQiKTsKKyAgIFNldFByb3AoUF9HRU5ERVIsIE5FVVRFUik7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIkRhcyBCbGFldHRlcmtsZWlkIHN0YW1tdCB2b24gZWluZXIgV2FsZGZlZSB1bmQgd2FyIGdlbmF1IGF1ZiBpaHJlIFJ1bmR1bmdlblxuIgorICAgICsidW5kIGlocmUgR3JvZXNzZSBhYmdlcGFzc3QuIER1IGhhc3QgbGVpZGVyIG5pY2h0IGRpZSBnZXJpbmdzdGUgQ2hhbmNlLCBkaWVzZXNcbiIKKyAgICArIktsZWlkIGplbWFscyB0cmFnZW4genUga29lbm5lbi5cbiIpOworICAgQWRkSWQoKHsia2xlaWQiLCAiYmxhZXR0ZXJrbGVpZCJ9KSk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsIE1BVF9NSVNDX1dPT0QpOworICAgU2V0UHJvcChQX0FSTU9VUl9UWVBFLCBBVF9BUk1PVVIpOworICAgU2V0UHJvcChQX1ZBTFVFLCA1MDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9BQywgMTApOworICAgU2V0UHJvcChQX1dFQVJfRlVOQywgTUUpOworfQorCitpbnQgV2VhckZ1bmMob2JqZWN0IG1lLCBpbnQgc2lsZW50KQoreworICAgaWYgKCFQTCB8fCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKFBMKSB8fCBnZXR1aWQoUEwpIT1nZXR1aWQoKSB8fAorICAgICAgIFBMLT5RdWVyeVByb3AoUF9SQUNFKSE9IkZlZSIpIHsKKyAgICAgIGlmICghc2lsZW50KQorICAgICAgICB3cml0ZSgiRGllc2VzIEtsZWlkIHdhciBnZW5hdSBhdWYgZGllIFJ1bmR1bmdlbiB1bmQgZGllIEdyb2Vzc2UgZGVyIFdhbGRmZWVcbiIKKyAgICAgICAgICAgICArImFuZ2VwYXNzdCB2b24gZGVyIGVzIHN0YW1tdC4gRHUgaGFzdCBsZWlkZXIgbmljaHQgZGllIGdlcmluZ3N0ZSBDaGFuY2UsXG4iCisgICAgICAgICAgICAgKyJkaWVzZXMgS2xlaWQgamVtYWxzIHRyYWdlbiB6dSBrb2VubmVuLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai9sZWljaGVubXAuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovbGVpY2hlbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhN2MxMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovbGVpY2hlbm1wLmMKQEAgLTAsMCArMSw4MSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorLyogQ2hhbmdlbG9nOgorICAgKiAwOS4xMS4wNiBaZXNzdHJhCisgICAgIG9iamVjdF9pbmZvKClbMTFdIGR1cmNoIHF1ZXJ5X25leHRfcmVzZXQoKSBlcnNldHp0LgorICAgICAqLworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCitzdGF0aWMgaW50IGxlaWNoZW47CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBsZWljaGVuPTA7CisgICAgaWYgKCFjbG9uZXAoTUUpKQorICAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKKyAgICBlbHNlIHsKKyAgICAgICA6OmNyZWF0ZSgpOworICAgICAgIFNldFByb3AoUF9JTlZJUywgMSk7CisgICAgICAgU2V0UHJvcChQX05PRFJPUCwgMSk7CisgICAgICAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgICAgICAgQWRkSWQoV0FMRElEKCJsZWljaGVubXAiKSk7CisgICAgICAgc2V0X25leHRfcmVzZXQoMzYwMCozKTsgLy8gZXJzdGVyIHJlc2V0IG5hY2ggM2gKKyAgICB9Cit9CisKK2ludCByZW1vdmUoKQoreworICAgIGNsb3N1cmUgY2xvOworICAgIGlmIChlbnZpcm9ubWVudCgpKSB7CisgICAgICBjbG89ZW52aXJvbm1lbnQoKS0+UXVlcnkoUF9NQVhfU1AsIEZfUVVFUllfTUVUSE9EKTsKKyAgICAgIGlmIChjbG8gJiYgdG9fb2JqZWN0KGNsbyk9PU1FKQorICAgICAgICAgIGVudmlyb25tZW50KCktPlNldChQX01BWF9TUCwgMCwgRl9RVUVSWV9NRVRIT0QpOworICAgIH0KKyAgICBkZXN0cnVjdChNRSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBjYWxjdWxhdGVfbXAoKQoreworICAgIGludCBtcDsKKyAgICBzd2l0Y2gobGVpY2hlbikgeworICAgICAgIGNhc2UgMTogIG1wID0gNTsgIGJyZWFrOworICAgICAgIGNhc2UgMjogIG1wID0gOTsgIGJyZWFrOworICAgICAgIGNhc2UgMzogIG1wID0gMTI7IGJyZWFrOworICAgICAgIGNhc2UgNDogIG1wID0gMTQ7IGJyZWFrOworICAgICAgIGNhc2UgNTogIG1wID0gMTU7IGJyZWFrOworICAgICAgIGRlZmF1bHQ6IG1wID0gMDsKKyAgICB9CisgICAgU2V0UHJvcChQX1hfSEVBTFRIX01PRCwgKFtQX1NQOm1wXSkgKTsKK30KKwordm9pZCBuZXdfY29ycHNlKCkKK3sKKyAgICBjbG9zdXJlIGNsbzsKKyAgICBjbG89UEwtPlF1ZXJ5KFBfTUFYX1NQLCBGX1FVRVJZX01FVEhPRCk7CisgICAgaWYgKGNsbyAmJiB0b19vYmplY3QoY2xvKSE9TUUpIHsKKyAgICAgICBjYWxsX291dCgicmVtb3ZlIiwgMCk7CisgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGVpY2hlbjw1KSB7CisgICAgICAgbGVpY2hlbisrOworICAgICAgIHNldF9uZXh0X3Jlc2V0KDM2MDArMyk7CisgICAgfQorICAgIGVsc2Ugc2V0X25leHRfcmVzZXQoIChxdWVyeV9uZXh0X3Jlc2V0KE1FKS10aW1lKCkpKzM2MDAgKTsKKyAgICBjYWxjdWxhdGVfbXAoKTsKK30KKwordm9pZCByZXNldCgpCit7CisgICBsZWljaGVuLS07CisgICBpZiAoZW52aXJvbm1lbnQoKSkgeworICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoKSwgIkR1IHNwdWVyc3Qgd2llIERlaW5lIG1lbnRhbGVuIEtyYWVmdGUgc2Nod2FlY2hlciB3ZXJkZW4uLi5cbiIpOworICAgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX1NQKSA+IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX01BWF9TUCkpCisgICAgICAgICAgZW52aXJvbm1lbnQoKS0+U2V0UHJvcChQX1NQLCBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9NQVhfU1ApKTsKKyAgIH0KKyAgIGNhbGN1bGF0ZV9tcCgpOworICAgaWYgKGxlaWNoZW48PTApCisgICAgICByZW1vdmUoKTsKKyAgIGVsc2Ugc2V0X25leHRfcmVzZXQoMzYwMCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3N0b2NrLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3N0b2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5ZDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovc3RvY2suYwpAQCAtMCwwICsxLDI2IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC93ZWFwb24iOworCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKyNpbmNsdWRlIDxjb21iYXQuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBrbGVpbmVyIFplaWdlc3RvY2siKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiWmVpZ2VzdG9jayIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICBTZXRQcm9wKFBfTE9ORywKKyAgICAgIkVpbiBrbGVpbmVyIFN0b2NrLCBtaXQgZGVtIG1hbiBndXQgRGluZ2UgemVpZ2VuIG9kZXIgaW4gZGVuIFNhbmQgbWFsZW4ga2Fubi5cbiIpOworICAgQWRkQWRqZWN0aXZlKCJrbGVpbiIpOworICAgQWRkSWQoKHsic3RvY2siLCAiemVpZ2VzdG9jayJ9KSk7CisgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX1NUQUZGKTsKKyAgIFNldFByb3AoUF9TSVpFLCAxMjApOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCBEVF9CTFVER0VPTik7CisgICBTZXRQcm9wKFBfTlJfSEFORFMsIDEpOworICAgU2V0UHJvcChQX1dDLCAxMjApOworICAgU2V0UHJvcChQX1ZBTFVFLCAzMDApOworICAgU2V0UHJvcChQX05PQlVZLCAxKTsKKyAgIFNldFByb3AoUF9NQVRFUklBTCwgTUFUX01JU0NfV09PRCk7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3Rhcm56YXViZXIuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9vYmovdGFybnphdWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjY0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3Rhcm56YXViZXIuYwpAQCAtMCwwICsxLDc4IEBACisvLyAoYykgMjAwMyBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKy8vIERhcyBPYmpla3QgcmVhbGlzaWVydCBlaW5lbiBUYXJuemF1YmVyLCBhZWhubGljaAorLy8gZGVtIFRhcm5oZWxtLiBKZWRvY2ggb2huZSBTaGFkb3cgdW5kIG51ciBhdWYgZGllCisvLyBSYXNzZSBiZXNjaHJhZW5rdC4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK3N0YXRpYyBzdHJpbmcgcmFjZTsKKworY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCAwKTsKKyAgU2V0UHJvcChQX0xPTkcsICJUYXJuemF1YmVyIik7CisgIFNldFByb3AoUF9OQU1FLCAiVGFybnphdWJlciIpOworICBTZXRQcm9wKFBfSU5WSVMsIDEpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1ZBTFVFLCAgMCk7CisgIFNldFByb3AoUF9OT0dFVCwgMSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDApOworICBTZXQoUF9ERUZFTkRfRlVOQywgTUUpOworICBBZGRJZCgiXG50YXJuemF1YmVyIik7Cit9CisKKy8vIGRpZSBOUENzIGltIFphdWJlcndhbGQgZHVyY2hzY2hhdWVuIGRlbiBaYXViZXIuLi4gOm8pCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreworICAgaWYgKHByZXZpb3VzX29iamVjdCgxKSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KDEpKT09Z2V0dWlkKCkpCisgICAgICByZXR1cm4gcHJldmlvdXNfb2JqZWN0KCktPl9xdWVyeV9yYWNlKCl8fHJhY2U7CisgICByZXR1cm4gIkR1bmtlbGVsZiI7Cit9CisKK3ZvaWQgSW5pdGlhbGl6ZShvYmplY3QgcGwpCit7CisgICBvYmplY3QgKmFybW91cnM7CisgICBwbC0+U2V0KFBfUkFDRSwgIydfcXVlcnlfcmFjZSwgRl9RVUVSWV9NRVRIT0QpOworICAgYXJtb3Vycz0ocGwtPlF1ZXJ5UHJvcChQX0FSTU9VUlMpKTsKKyAgIGlmIChtZW1iZXIoYXJtb3VycywgTUUpPj0wKSByZXR1cm4gMDsKKyAgIHBsLT5TZXRQcm9wKFBfQVJNT1VSUywgYXJtb3VycysoeyBNRSB9KSk7CisgICByYWNlPXBsLT5RdWVyeShQX1JBQ0UpOworfQorCitpbnQgUXVlcnlEZWZlbmQoc3RyaW5nICpkdHlwLCBtaXhlZCBzcGVsbCwgb2JqZWN0IGVuZW15KQoreworICBtaXhlZCBhbTsKKyAgLy8gbm9jaCBlaW4gcGFhciBwYXJhbm9pZGUgU2ljaGVyaGVpdHNhYmZyYWdlbi4uLiA6bykKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgIXBvaW50ZXJwKGFtPXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9BUk1PVVJTKSkgfHwKKyAgICAgIG1lbWJlcihhbSwgTUUpPT0tMSkgcmV0dXJuIDA7CisgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRGVpbiBUYXJuemF1YmVyIGxvZXN0IHNpY2ggYXVmLlxuIik7CisgIHJlbW92ZSgpOworfQorCitpbnQgRGVmZW5kRnVuYyhzdHJpbmcgKmR0eXAsIG1peGVkIHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgICByZXR1cm4gUXVlcnlEZWZlbmQoZHR5cCwgc3BlbGwsIGVuZW15KTsKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kKQorLy8gYmVpbSBUb2Qgc29sbCBzaWNoIGRlciBaYXViZXIgZW50ZmVybmVuIHVuZCBhdWNoIG5pcmdlbmRzIHJ1bWZsaWVnZW4KK3sKKyAgIGludCByZXM7CisgICByZXM9KGludCk6Om1vdmUoZGVzdCwgbWV0aG9kKTsKKyAgIGlmICghbGl2aW5nKGVudmlyb25tZW50KCkpKSByZW1vdmUoKTsKKyAgIHJldHVybiByZXM7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KQoreworICBpZiAobGl2aW5nKGVudmlyb25tZW50KCkpKSBlbnZpcm9ubWVudCgpLT5TZXQoUF9SQUNFLDAsRl9RVUVSWV9NRVRIT0QpOworICByZXR1cm4gKGludCk6OnJlbW92ZShzaWxlbnQpOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai96YXViZXJzdGFiLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvb2JqL3phdWJlcnN0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAxZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL29iai96YXViZXJzdGFiLmMKQEAgLTAsMCArMSwzNiBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCitpbmhlcml0ICJzdGQvd2VhcG9uIjsKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gWmF1YmVyc3RhYiIpOworICAgU2V0UHJvcChQX05BTUUsICJaYXViZXJzdGFiIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgIFNldFByb3AoUF9MT05HLAorICAgICAiRGllcyB3YXIgZWlubWFsIGRlciBaYXViZXJzdGFiIGVpbmVyIFdhbGRmZWUgYXVzIGRlbSBaYXViZXJ3YWxkLiBJbiBkZW0gU3RhYlxuIgorICAgICsibGllZ3Qgc2ljaGVybGljaCBub2NoIGVpbmUgZ3Jvc3NlIE1hZ2llIHZlcmJvcmdlbiwgZG9jaCBudXR6ZW4ga2FubnN0IER1IHNpZVxuIgorICAgICsibmljaHQuXG4iKTsKKyAgIEFkZElkKCh7InN0YWIiLCAiemF1YmVyc3RhYiJ9KSk7CisgICBTZXRQcm9wKFBfV0VBUE9OX1RZUEUsIFdUX0NMVUIpOworICAgU2V0UHJvcChQX0RBTV9UWVBFLCAoeyBEVF9NQUdJQywgRFRfQkxVREdFT04gfSkgKTsKKyAgIFNldFByb3AoUF9OUl9IQU5EUywgMSk7CisgICBTZXRQcm9wKFBfV0MsIDE0MCk7CisgICBTZXRQcm9wKFBfVkFMVUUsIDgwMCk7CisgICBTZXRQcm9wKFBfTk9CVVksIDEpOworICAgU2V0UHJvcChQX0hJVF9GVU5DLCBNRSk7CisgICBTZXRQcm9wKFBfTUFURVJJQUwsICh7IE1BVF9NSVNDX01BR0lDLCBNQVRfTUlTQ19XT09EIH0pICk7Cit9CisKK2ludCBIaXRGdW5jKG9iamVjdCBlbmVteSkKK3sKKyAgICBvYmplY3Qgb2I7CisgICAgb2I9UXVlcnlQcm9wKFBfV0lFTERFRCk7CisgICAgaWYgKG9iICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBnZXR1aWQob2IpPT1nZXR1aWQoKSAmJgorICAgICAgICBvYi0+UXVlcnlQcm9wKFBfUkFDRSk9PSJGZWUiKSByZXR1cm4gMTAwK3JhbmRvbSgzMDApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vZWluZ2FuZy5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vZWluZ2FuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OGEwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9laW5nYW5nLmMKQEAgLTAsMCArMSw0OCBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lbSBrbGVpbmVuIFdhbGR3ZWciKTsKKyAgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAgIkR1IHN0ZWhzdCBhdWYgZWluZW0ga2xlaW5lbiBXYWxkd2VnIGRlciBuYWNoIFdlc3RlbiBoaW4gdGllZmVyIGluIGRlbiBXYWxkXG4iCisgICAgKyJoaW5laW4gZnVlaHJ0LiBOYWNoIE9zdGVuIGthbm5zdCBEdSBqZWRvY2ggYXVjaCB3aWVkZXIgenVydWVjayB6dXIgS3JldXp1bmdcbiIKKyAgICArImdlbGFuZ2VuLiBBbGxlcyBpc3QgaGllciByZWNodCBkdWVzdGVyLCBkZW5uIGRhcyBad2VpZ2RhY2ggZGVyIEJhZXVtZSBsYWVzc3RcbiIKKyAgICArImthdW0gbm9jaCBTb25uZW5saWNodCBoaW5kdXJjaC5cbiIpOworICAgQWRkRGV0YWlsKCJ3YWxkIiwgUXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgIEFkZERldGFpbCgoeyJib2RlbiIsICJ3ZWciLCAiZXJkZSIsICJ3YWxkd2VnIn0pLAorICAgICAiRGVyIFdlZyB3dXJkZSBuaWNodCByaWNodGlnIGFuZ2VsZWd0IHVuZCBlcyBzY2hlaW50IGF1Y2ggbmljaHQgc28sIGFscyB3dWVyZGVcbiIKKyAgICArImlobiBqZW1hbmQgcGZsZWdlbi4gRGVubm9jaCB3YWNoc2VuIGtlaW5lcmxlaSBQZmxhbnplbiBhdWYgZGVtIFdlZyB1bmQgRHVcbiIKKyAgICArImdlaHN0IGF1ZiBkZXIgYmxvc3NlbiBFcmRlLlxuIik7CisgICBBZGREZXRhaWwoKHsid2VncmFuZCIsICJ3ZWdlc3JhbmQiLCAiZ2VzdHJ1ZXBwIn0pLAorICAgICAiQW0gV2VnZXNyYW5kIHdhY2hzZW4gZWluaWdlIGFsdGUgQmFldW1lIHVuZCBhbmRlcmUgUGZsYW56ZW4gZGllIHp1c2FtbWVuIGVpblxuIgorICAgICsidW5kdXJjaGRyaW5nbGljaGVzIEdlc3RydWVwcCBlcmdlYmVuLiBEaXIgYmxlaWJ0IGFsc28gbmljaHRzIHdlaXRlciB1ZWJyaWcsIGFsc1xuIgorICAgICsibnVyIGRlbiBXZWcgbmFjaCBXZXN0ZW4gb2RlciBuYWNoIE9zdGVuIHp1IGZvbGdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImJhZXVtZSIsICJhbHRlciJ9KSwKKyAgICAgIkRhcyBBbHRlciBkZXIgQmFldW1lIGxhZXNzdCBzaWNoIG5pY2h0IGdlbmF1IGJlc3RpbW1lbiwgc2llIHNjaGVpbmVuIGplZG9jaFxuIgorICAgICsic2VociBzZWhyIGFsdCB6dSBzZWluLiBJbiBlaW5lbSBkZXIgQmFldW1lIHNpZWhzdCBEdSBlaW4ga2xlaW5lcyBCYXVtaGF1cy5cbiIpOworICAgQWRkRGV0YWlsKCh7InBmbGFuemVuIiwgImZhcm5lIiwgInN0cmFldWNoZXIifSksCisgICAgICJWZXJzY2hpZWRlbmUgU3RyYWV1Y2hlciwgRmFybmUgdW5kIHphaGxyZWljaGUgQmFldW1lIHppZXJlbiBkZW4gV2VnZXNyYW5kLlxuIgorICAgICsiRHUgZW50ZGVja3N0IGRhYmVpIGFiZXIgbmljaHRzIHdlaXRlciBhdWZmYWVsbGlnZXMuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJvc3RlbiIsICJrcmV1enVuZyJ9KSwKKyAgICAgIldlbm4gRHUgZGVtIFdlZyBuYWNoIE9zdGVuIGhpbiBmb2xnc3QsIGthbm5zdCBEdSB6dXJ1ZWNrIHp1ciBLcmV1enVuZyBnZWxhbmdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7Inp3ZWlnZSIsICJ6d2VpZ2RhY2giLCAic29ubmVubGljaHQiLCAibGljaHQiLCAiZGFjaCIsICJ3ZXN0ZW4ifSksCisgICAgICJEYXMgWndlaWdkYWNoIGRlciBCYWV1bWUgbGFlc3N0IGhpZXIgc28gd2VuaWcgU29ubmVubGljaHQgaGluZHVyY2gsIGRhcyBEdSBlaW5cbiIKKyAgICArIlN0dWVjayB3ZWl0ZXIgaW0gV2VzdGVuIGthdW0gbm9jaCBvaG5lIGVpZ2VuZSBMaWNodHF1ZWxsZSB3ZWl0ZXJrb21tZW4ga2FubnN0LlxuIgorICAgICsiRHUgc29sbHRlc3QgRGljaCBhbHNvIGJlc3NlciBuaWNodCBvaG5lIGVpZ2VuZSBMaWNodHF1ZWxsZSB0aWVmZXIgaW4gZGVuIFdhbGRcbiIKKyAgICArImhpbmVpbiB3YWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImZhY2tlbCIsICJsYW1wZSIsICJsaWNodCIsICJsaWNodHF1ZWxsZSIsICJsaWNodHNwcnVjaCJ9KSwKKyAgICAgIldlbm4gRHUgYmVhYnNpY2h0aWdzdCB3ZWl0ZXIgbmFjaCBXZXN0ZW4genUgZ2Vobiwgc29sbHRlc3QgRHUgZWluZSBGYWNrZWwsXG4iCisgICAgKyJlaW5lIExhbXBlIG9kZXIgc29uc3QgaXJnZW5kZWluZSBMaWNodHF1ZWxsZSBtaXRuZWhlbW4uIFp1bWluZGVzdCBpc3QgZXMgZG9ydFxuIgorICAgICsic2VociBkdW5rZWwuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ3b2xrZSIsICJ3b2xrZW4iLCAic29ubmUiLCAiaGltbWVsIn0pLAorICAgICAiRGVyIEhpbW1lbCBpc3QgZHVyY2ggZGFzIGRpY2h0ZSBEYWNoIGRlciBad2VpZ2UsIG5pY2h0IG1laHIgenUgc2Vobi5cbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCAiL2QvdW50ZXJ3ZWx0L3JhZXVtZS93YWxkNCIpOworICAgQWRkRXhpdCgid2VzdGVuIiwgUk9PTSgid2VnMSIpKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL2h1ZXR0ZS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vaHVldHRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5YTI3MgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL2h1ZXR0ZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKy8vIEVpbiBSYXVtIHp1bSBzY2hvZW5lbiBlaW5iaW5kZW4gZWluZXMgU2VoZXJoYXVzZXMgaW4gZGVuIFdhbGQKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJNaXR0ZW4gaW0gV2FsZCIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgICAiRHUgc3RlaHN0IG51biBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMgZ2VuYXUgdm9yIGVpbmVyIHJpZXNpZ2VuIEJ1Y2hlIHVudGVyXG4iCisgICAgKyJkZXIgamVtYW5kIGVpbmUga2xlaW5lIEh1ZXR0ZSBnZWJhdXQgaGF0LiBSaW5nc3VtaGVyIHN0ZWhlbiB3ZWl0ZXJlIEJ1ZXNjaGVcbiIKKyAgICArInVuZCBCYWV1bWUgdW5kIGJpbGRlbiBlaW5lIGRpY2h0ZSBWZWdldGF0aW9uLCBkb2NoIGltIFZlcmdsZWljaCB6dSBkaWVzZXJcbiIKKyAgICArInJpZXNpZ2VuIEJ1Y2hlIHdpcmt0IGFsbGVzIGFuZGVyZSB3aXJrbGljaCBtaWNrcmlnLiBEdXJjaCBkYXMgZGljaHRlXG4iCisgICAgKyJCbGFldHRlcmRhY2ggZHJpbmd0IG51ciB3ZW5pZyBMaWNodCB1bmQgc28gd3VuZGVydCBlcyBhdWNoIG5pY2h0IGRhcyBkZXJcbiIKKyAgICArIkJvZGVuIGhpZXIgcmVsYXRpdiBmZXVjaHQgaXN0IHVuZCBkaWUgUGZsYW56ZW4gc28gZ3V0IGdlZGVpaGVuIGtvZW5uZW4uIE5hY2hcbiIKKyAgICArIk5vcmRlbiBmdWVocnQgYWxzIGVpbnppZ2VyIEF1c2dhbmcgZWluIGtsZWluZXIgVHJhbXBlbHBmYWQgenVyIExpY2h0dW5nLlxuIik7CisgICBBZGREZXRhaWwoKHsibmF0dXIiLCAid2FsZCIsICJ6YXViZXJ3YWxkIn0pLCBRdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgQWRkRGV0YWlsKCh7ImJ1ZXNjaGUiLCAiYmFldW1lIiwgInZlZ2V0YXRpb24iLCAicGZsYW56ZW4iLCAiZmFybmUifSksCisgICAgICJSaW5ncyB1bSBkaWUgSHVldHRlIGhlcnNjaHQgZWluZSB3aWxkZSBWZWdldGF0aW9uLiBFcyB3YWNoc2VuIHZlcnNjaGllZGVuc3RlXG4iCisgICAgKyJGYXJuZSB1bmQgQnVlc2NoZSB1bmQgZWluZSB2aWVsZmFsdCB2ZXJzY2hpZWRlbnN0ZXIgQmFldW1lLiBBbGxlcyB6dXNhbW1lblxuIgorICAgICsiYmlsZGV0IGVpbmUgZmFzdCB1bmR1cmNoZHJpbmdsaWNoZSBWZWdldGF0aW9uLlxuIik7CisgICBBZGREZXRhaWwoKHsibGljaHQiLCAiYmxhZXR0ZXJkYWNoIn0pLAorICAgICAiRHVyY2ggZGFzIHJlbGF0aXYgZGljaHRlIEJsYWV0dGVyZGFjaCBkZXIgaG9oZW4gQmFldW1lLCBmYWVsbHQgZWlnZW50bGljaCBudXJcbiIKKyAgICArInNlaHIgd2VuaWcgTGljaHQgZHVyY2ggdW5kIHNvIGlzdCBlcyBoaWVyIGRvY2ggc2Nob24gcmVsYXRpdiBkdWVzdGVyLCBhdWNoXG4iCisgICAgKyJ3ZW5uIG1hbiBub2NoIG5pY2h0IHVuYmVkaW5ndCBlaW5lIGVpZ2VuZSBMaWNodHF1ZWxsZSBicmF1Y2h0IHVtIGV0d2FzIHNlaGVuXG4iCisgICAgKyJ6dSBrb2VubmVuLlxuIik7CisgICBBZGREZXRhaWwoImxpY2h0cXVlbGxlIiwKKyAgICAgIkVpbmUgZWlnZW5lIExpY2h0cXVlbGxlIGlzdCBoaWVyIG5pY2h0IHVuYmVkaW5ndCBlcmZvcmRlcmxpY2gsIGRhIGRhbm4gZG9jaFxuIgorICAgICsibm9jaCBnZW51ZWdlbmQgTGljaHQgZHVyY2ggZGFzIEJsYWV0dGVyZGFjaCBkdXJjaGRyaW5ndC5cbiIpOworICAgQWRkRGV0YWlsKCJoaW1tZWwiLAorICAgICAiRXMgc2NoZWludCBEaXIgYWxzIHd1ZXJkZSBkaWUgU29ubmUgZ2VyYWRlIHNjaGVpbmVuLCBhdWNoIHdlbiBkYXMgZGljaHRlXG4iCisgICAgKyJCbGFldHRlcmRhY2ggZGllIG1laXN0ZW4gU29ubmVuc3RyYWhsZW4gbmljaHQgaGluZHVyY2ggbGFlc3N0LlxuIik7CisgICBBZGREZXRhaWwoImJvZGVuIiwKKyAgICAgIkRlciBCb2RlbiBpc3QgaGllciBlaWdlbnRsaWNoLCBtaXQgQXVzbmFobWUgZGVzIFRyYW1wZWxwZmFkcyBuYXR1ZXJsaWNoLFxuIgorICAgICsiemllbWxpY2ggenVnZXdhY2hzZW4gdW5kIHZvbiB6YWhscmVpY2hlbiBQZmxhbnplbiB1ZWJlcnd1Y2hlcnQuXG4iKTsKKyAgIEFkZERldGFpbCgiZXJkZSIsCisgICAgICJEaWUgRXJkZSBpc3QgaGllciB1ZWJlcmFsbCBlaW4gd2VuaWcgbGVobWlnLCBhYmVyIHdpcmtsaWNoIGJlc29uZGVyZXMga2FubnN0XG4iCisgICAgKyJEdSBhbiBkZXIgRXJkZSBuaWNodCBlbnRkZWNrZW4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ0cmFtcGVscGZhZCIsICJhdXNnYW5nIiwgInBmYWQifSksCisgICAgICJEZXIgVHJhbXBlbHBmYWQgc2NoZWludCBkb2NoIHJlbGF0aXYgb2Z0IGJlbnV0enQgenUgd2VyZGVuLCBkZW5uIGRpZSBFcmRlIGlzdFxuIgorICAgICsiZmFzdCB2b2VsbGlnIGJsb3NzIGdlbGVndCB1bmQgZGllIHdlbmlnZW4gUGZsYW56ZW4gZGllIGRhbm4gZG9jaCB2ZXJzdWNoZW4gaWhuXG4iCisgICAgKyJ6dSBiZXdhY2hzZW4gc2luZCBmYXN0IGFsbGUgbmllZGVyZ2V0cmFtcGVsdC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpY2h0dW5nIiwgIm5vcmRlbiJ9KSwKKyAgICAgIlZpZWxsZWljaHQgc29sbHRlc3QgRHUgZWluZmFjaCBkZW0gVHJhbXBlbHBmYWQgbmFjaCBOb3JkZW4gZm9sZ2VuIHVuZCBEaXIgZGllXG4iCisgICAgKyJMaWNodHVuZyBlaW5mYWNoIGF1cyBkZXIgTmFlaGUgYW5zY2hhdWVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiYnVjaGUiLCAicmllc2lnZSBidWNoZSJ9KSwKKyAgICAgIkVpY2hlbiBzb2xsc3QgRHUgd2VpY2hlbiwgQnVjaGVuIHNvbGxzdCBEdSBzdWNoZW4hXG4iKTsKKyAgIEFkZERldGFpbCgoeyJlaWNoZSIsICJlaWNoZW4ifSksCisgICAgICJEdSBzaWVoc3QgendhciBhbGxlcyBtb2VnbGljaGUgYW4gQmFldW1lbiBoaWVyLCBhYmVyIEVpY2hlbiBiZWZpbmRlbiBzaWNoIHp1bVxuIgorICAgICsiR2x1ZWNrIG5pY2h0IGRhZHJ1bnRlci5cbiIpOworICAgQWRkRGV0YWlsKCh7ImdsdWVjayIsICJmcmFnZSJ9KSwKKyAgICAgIk9iIGVzIHNvZXR3YXMgd2llIEdsdWVjayB1ZWJlcmhhdXB0IGdpYnQsIGlzdCB3b2hsIGVoZXIgZWluZSBwaGlsb3NvcGhpc2NoZVxuIgorICAgICsiRnJhZ2UgdW5kIGV0d2FzIHdvIG1hbiBzdHVuZGVubGFuZyBkcnVlYmVyIGRpc2t1dGllcmVuIGtvZW5udGUuIEZ1ZXIgZGVuXG4iCisgICAgKyJNb21lbnQgYmVzY2hsaWVzc3QgRHUgamVkZW5mYWxscyBsaWViZXIgZGllIHNjaG9lbmUgTmF0dXIgenUgZ2VuaWVzc2VuIHVuZFxuIgorICAgICsiZGVtIHp3aXRzY2hlcm4gZGVyIFZvZWdlbCB6dSBsYXVzY2hlbiwgYWxzIERpY2ggbWl0IHNvZXR3YXMgenUgYmVzY2hhZWZ0aWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7InZvZWdlbCIsICJ6aXBmZWwiLCAiYmF1bXppcGZlbCIsICJ6aXBmZWwgZGVyIGJhZXVtZSJ9KSwKKyAgICAgIk9iZW4gaW4gZGVuIFppcGZlbG4gZGVyIEJhZXVtZSBrYW5uc3QgRHUgd2FnZSBlaW5pZ2UgVm9lZ2VsIGVya2VubmVuLCBkb2NoIHVtXG4iCisgICAgKyJkaWVzZSBuYWVoZXIgc3BlemlmaXppZXJlbiB6dSBrb2VubmVuLCBzaW5kIGRpZXNlIGRhbm4gZG9jaCB6dSB3ZWl0IHdlZy5cbiIpOworICAgQWRkRGV0YWlsKCJtb21lbnQiLAorICAgICAiR2VuaWVzc2UgZGVuIE1vbWVudCB1bmQgbGViZSBEZWluIExlYmVuIVxuIik7CisgICBBZGREZXRhaWwoInJ1aGUiLAorICAgICAiRGllIFJ1aGUgd2lyZCBoaWVyIHVuZCBkYSBsZWRpZ2xpY2ggdm9tIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWwgdW50ZXJicm9jaGVuLlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCh7Imh1ZXR0ZSJ9KSwgImRldF9odWV0dGUiKTsKKyAgIEFkZFNvdW5kcyhTRU5TRV9ERUZBVUxULAorICAgICAiRXMgaXN0IGhpZXIgd2lya2xpY2ggaGVycmxpY2ggcnVoaWcgdW5kIG51ciBoaWVyIHVuZCBkYSBob2Vyc3QgRHUgZGFzXG4iCisgICAgKyJ6d2l0c2NoZXJuIGVpbmlnZXIgVm9lZ2VsLiBOYXR1ciBwdXIuXG4iKTsKKyAgIEFkZFNvdW5kcygoeyJ2b2VnZWwiLCAiendpdHNjaGVybiIsICJ2b2VnZWwgendpdHNjaGVybiJ9KSwKKyAgICAgIkR1IGxhdXNjaHN0IGRlbSB6d2l0c2NoZXJuIGRlciBWb2VnZWwgdW5kIGdlbmllc3N0IGRpZSBoaW1tbGlzY2hlIFJ1aGUuXG4iKTsKKyAgIEFkZENtZCgoeyJzdWNoIiwgInN1Y2hlIn0pLCAiY21kX3N1Y2hlbiIpOworICAgQWRkQ21kKCh7Imdlbmllc3MiLCAiZ2VuaWVzc2UifSksICJjbWRfZ2VuaWVzc2VuIik7CisgICBBZGRDbWQoKHsibGViIiwgImxlYmUifSksICJjbWRfbGViZW4iKTsKKyAgIEFkZENtZCgoeyJrbGV0dGVyIiwgImtsZXR0ZXJlIn0pLCAiY21kX2tsZXR0ZXJuIik7CisgICBBZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ3MiKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X2h1ZXR0ZSgpCisvLyBMYW5nYmVzY2hyZWlidW5nIG5pY2h0IGZlc3Qgc2V0emVuLCBkYW1pdCBkZXIgU3BpZWxlciBzaWUgc2VsYnN0CisvLyBhZW5kZXJuIGthbm4uCit7CisgICBvYmplY3Qgb2I7CisgICBpZiAob2I9cHJlc2VudCgiXG5tb3JnZW5lc2hhdXMiLCBNRSkpCisgICAgICByZXR1cm4gb2ItPmxvbmcoKTsKK30KKworc3RhdGljIGludCBjbWRfc3VjaGVuKHN0cmluZyBzdHIpCit7CisgICBub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBzdWNoZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJidWNoZW4iICYmIHN0ciE9ImJ1Y2hlIikgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgYnJhdWNoc3QgbmljaHQgbGFuZ2Ugc3VjaGVuIHVuZCBzY2hvbiBlbnRkZWNrdCBEdSBlaW5lIHJpZXNpZ2UgQnVjaGUgdm9yXG4iCisgICAgICAgICsiRGlyLCBhYmVyIGVpZ2VudGxpY2ggd2FlcmUgZXMgd29obCBhdWNoIGVoZXIgZXJzdGF1bmxpY2gsIHdlbm4gRHUgZGllc2VcbiIKKyAgICAgICAgKyJyaWVzaWdlIEJ1Y2hlIGRpcmVrdCB2b3IgRGVpbmVyIE5hc2UgdWViZXJzZWhlbiB3dWVyZGVzdCA6KS5cbiIpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX2dlbmllc3NlbihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgZ2VuaWVzc2VuP1xuIik7CisgICBpZiAoc3RyIT0ibW9tZW50IiAmJiBzdHIhPSJkZW4gbW9tZW50IiAmJiBzdHIhPSJydWhlIikgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgaGFlbHRzdCBlaW5lbiBNb21lbnQgaW5uZSB1bmQgZ2VuaWVzc3QgZGllIGhpbW1saXNjaGUgUnVoZSwgZGllIG51ciBkdXJjaFxuIgorICAgICAgICArImRhcyB6d2l0c2NoZXJuIGVpbmlnZXIgVm9lZ2VsIGR1cmNoYnJvY2hlbiBhYmVyIG5pY2h0IGdlc3RvZXJ0IHdpcmQuXG4iKTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9sZWJlbihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldBUyBtb2VjaHRlc3QgRHUgbGViZW4/XG4iKTsKKyAgIGlmIChzdHIhPSJsZWJlbiIgJiYgc3RyIT0ibWVpbiBsZWJlbiIgJiYgc3RyIT0iZGVpbiBsZWJlbiIpIHJldHVybiAwOworICAgd3JpdGUoIk51biwgd2VubiBkaWUgV2VsdCBzbyBlaW5mYWNoIHdhZXJlIGRhcyBEdSBtaXQgZWluZW0gc2ltcGxlbiBLb21tYW5kbyBEZWluXG4iCisgICAgICAgICsiZ2FuemVzIExlYmVuIHN0ZXVlcm4ga29lbm50ZXN0LCBkYW5uIHdhZXIgZGllIFdlbHQgZG9jaCB3aXJrbGljaCBsYW5nd2VpbGlnLFxuIgorICAgICAgICArIm9kZXI/IEljaCB3aWxsIGRvY2ggc3RhcmsgaG9mZmVuLCBkYXMgZXMgc29vbyB3ZWl0IG5vY2ggbmljaHQgYmVpIERpciBpc3QgOikuXG4iKTsKKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9rbGV0dGVybihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldPSElOIG9kZXIgV09SQVVGIG1vZWNodGVzdCBEdSBrbGV0dGVybj9cbiIpOworICAgaWYgKG1lbWJlcigoeyJhdWYgYmF1bSIsICJhdWYgYmF1bXppcGZlbCIsICJiYXVtIGhvY2giLAorICAgICAgICAgICAgICAgICJidWNoZSBob2NoIiwgImF1ZiBidWNoZSJ9KSwgc3RyKT09LTEpIHJldHVybiAwOworICAgd3JpdGUoIkR1IHZlcnN1Y2hzdCB2ZXJnZWJsaWNoIGRpZSByaWVzaWdlIEJ1Y2hlIGhvY2h6dWtsZXR0ZXJuLCBkb2NoIGRpZSB1bnRlcmVuXG4iCisgICAgICAgICsiQWVzdGUgaGFlbmdlbiBsZWlkZXIgYmVyZWl0cyB2aWVsIHp1IGhvY2gsIHVtIGRpZXNlIGVya2xpbW1lbiB6dSBrb2VubmVuLlxuIik7CisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3NjaHVsZS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc2NodWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3YWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3NjaHVsZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8vIChjKSBieSBQYWRyZWljIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDApOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsicGl4aWVzY2h1bGUiLCAic2NodWxlIiwgInNhbmRwbGF0eiIsICJ3YWxkc2NodWxlIn0pLCAiX3F1ZXJ5X2ludF9sb25nIik7CisgICBBZGREZXRhaWwoKHsic3B1cmVuIiwgImthbXBmcGxhdHoiLCAic2FuZCJ9KSwKKyAgICAgIkRpZSBTcHVyZW4gaW0gU2FuZCBkZXV0ZW4gYXVmIGVpbmVuIGxhZW5nZXJlbiBLYW1wZiBoaW4sIGRlciBoaWVyIGdldG9idFxuIgorICAgICsiaGFiZW4gbXVzcy4gV2VyIGF1Y2ggaW1tZXIgaWhuIHZlcmxvcmVuIGhhdCwgZXIgaGF0IHNpY2ggd2Fja2VyIGdld2VocnQuXG4iKTsKKyAgIEFkZERldGFpbCgid2FsZCIsCisgICAgICJXYXMgbWVpbnN0IER1IGVpZ2VudGxpY2gsIHdvIER1IGdlcmFkIGRpZSBnYW56ZSBaZWl0IHJ1bWxhZXVmc3Q/IE1hY2ggZWluZmFjaFxuIgorICAgICsiZGllIEF1Z2VuIGF1ZiB1bmQgc2NoYXUgRGlyIGFsbGVzIGluIFJ1aGUgYW4uXG4iKTsKKyAgIEFkZERldGFpbCgicnVoZSIsICJJbiBkZXIgUnVoZSBsaWVndCBkaWUgS3JhZnQuLi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImF1Z2VuIiwgImRldGFpbHMiLCAia2FtcGZ6YXViZXIiLCAia29wZiIsICJmcmV1bmQifSksCisgICAgICJOdSB1ZWJlcnRyZWliIG1hbCBuaWNoLCBuaWNodCBqZWRlcyBTdWJzdGFudGl2IHZlcmJpcmd0IHdpcmtsaWNoIGVpblxuIgorICAgICsic2lubnZvbGxlcyBEZXRhaWwuXG4iKTsKKyAgIEFkZERldGFpbCgia3JhZnQiLAorICAgICAiV293ISBEZWluZSBLcmFmdCBpc3QgcGxvZXR6bGljaCBhdWYgMzIgYW5nZXN0aWVnZW4uLi5cbiIKKyAgICArIkRhcyBoYXN0IER1IGpldHp0IGFiZXIgbmljaHQgd2lya2xpY2ggZ2VnbGF1YnQsIG9kZXI/XG4iCisgICAgKyJXaWVzbyB1bnRlcnN1Y2hzdCBEdSBzb2xjaGUgRGV0YWlscyBlaWdlbnRsaWNoP1xuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJ6ZWl0IiwgImRldF96ZWl0Iik7CisgICBBZGREZXRhaWwoKHsicGl4aWVzIiwgImJsb2Vkc2lubiIsICJ1bmZ1ZyIsICJ6YXViZXJ3ZXNlbiIsICJzdHJlaWNoIn0pLCAKKyAgICAgIlBpeGllcyBzaW5kIGtsZWluZSBaYXViZXJ3ZXNlbiwgZGllIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZiBoYWJlbi4gV2llXG4iCisgICAgKyJuaWVtYW5kIHNvbnN0IG51dHplbiBzaWUgaWhyZSBtYWdpc2NoZW4gRmFlaGlna2VpdGVuIG5pY2h0IHVtIGplbWFuZGVuIHp1XG4iCisgICAgKyJoZWlsZW4gb2RlciBmdWVyIEthbXBmemF1YmVyLiBOZWluIHNpZSBudXR6ZW4gc2llIHVtIGplbWFuZGVuIHp1IEFlcmdlcm5cbiIKKyAgICArIm9kZXIgaWhtIGVpbmVuIFN0cmVpY2ggenUgc3BpZWxlbi4gRWluZW4gUGl4aWUgenVtIEZyZXVuZCB6dSBoYWJlbiwga2FublxuIgorICAgICsic2ljaGVyIHNlaHIgdW50ZXJoYWx0c2FtIHNlaW4sIGF1ZiBkaWUgRGF1ZXIgYWJlciB3b2hsIGF1Y2ggemllbWxpY2hcbiIKKyAgICArImFuc3RyZW5nZW5kLlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJib2RlbiIsICJkZXRfYm9kZW4iKTsKKyAgIEFkZERldGFpbCgiaGFsYmtyZWlzIiwKKyAgICAgIkVpbmlnZSBQaXhpZXMgc2l0emVuIGltIEhhbGJrcmVpcyB1bSBBcmluYSBoZXJ1bSB1bmQgaG9lcmVuIGdlc3Bhbm50IHp1LCB3aWVcbiIKKyAgICArInNpZSBpaG5lbiBlaW5lbiBzcGFubmVuZGUgR2VzY2hpY2h0ZSBlcnphZWhsdC5cbiIpOworICAgQWRkRGV0YWlsKCh7Imdlc2NoaWNodGVuIiwgInNwcmFjaGUifSksCisgICAgICJXZW5uIEFyaW5hIGRvY2ggYmxvc3MgaW4gZWluZXIgU3ByYWNoZSBzcHJlY2hlbiB3dWVyZGUsIERpZSBEdSB2ZXJzdGVoc3QuLi5cbiIKKyAgICArIklocmUgR2VzY2hpY2h0ZW4gaG9lcmVuIHNpY2ggamVkZW5mYWxscyBhdXNzZXJvcmRlbnRsaWNoIHNwYW5uZW5kIGFuLiAqc2V1ZnoqXG4iKTsKKyAgIEFkZERldGFpbCgiaGltbWVsIiwgIkRlciBIaW1tZWwgaXN0IGtsYXIgdW5kIG5haGV6dSB3b2xrZW5mcmVpLlxuIik7CisgICBBZGREZXRhaWwoKHsib3N0ZW4iLCAiYXVzZ2FuZyIsICJsaWNodHVuZyIsICJ3ZWciLCAid2FsZHdlZyJ9KSwKKyAgICAgIkRlciBlaW56aWdlIEF1c2dhbmcgdm9uIGhpZXIsIGlzdCBkZXIga2xlaW5lIFdhbGR3ZWcgaW0gT3N0ZW4gZGVyIHp1cnVlY2tcbiIKKyAgICArInp1ciBncm9zc2VuIExpY2h0dW5nIGZ1ZWhydC5cbiIpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkRpZSBQaXhpZXNjaHVsZSIpOworICAgQWRkRXhpdCgib3N0ZW4iLCBST09NKCJsaWNodHVuZ253IikpOworICAgQWRkSXRlbShOUEMoInBpeGllIiksIFJFRlJFU0hfTU9WRV9IT01FKTsKKyAgIEFkZEl0ZW0oTlBDKCJwaXhpZSIpLCBSRUZSRVNIX01PVkVfSE9NRSk7CisgICBBZGRJdGVtKE5QQygicGl4aWUiKSwgUkVGUkVTSF9NT1ZFX0hPTUUpOworICAgQWRkSXRlbShOUEMoImFyaW5hIiksIFJFRlJFU0hfUkVNT1ZFLCAxKTsKK30KKworc3RhdGljIHN0cmluZyBkZXRfYm9kZW4oKQoreworICAgaWYgKHByZXNlbnQoV0FMRElEKCJmZWUiKSwgTUUpKQorICAgICAgcmV0dXJuIEdldERldGFpbCgiaGFsYmtyZWlzIik7CisgICByZXR1cm4gR2V0RGV0YWlsKCJzYW5kIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X3plaXQoKQoreyAgcmV0dXJuICJXaXIgaGFiZW4gZ2VuYXUgIitkdGltZSh0aW1lKCkpWzw4Li5dKyIuXG4iOyB9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybiAiRHUgYmVmaW5kZXN0IERpY2ggaW4gZGVyIFdhbGRzY2h1bGUgZGVyIFBpeGllcy4gRWluaWdlIFBpeGllcyBzaXR6ZW4gaW1cbiIKKyAgICAgICAgICAgICsiSGFsYmtyZWlzIHVtIGRpZSBXYWxkZmVlIEFyaW5hIHJ1bSB1bmQgaG9lcmVuIGdlc3Bhbm50IGlocmVuIEdlc2NoaWNodGVuIHp1LlxuIgorICAgICAgICAgICAgKyJHZWxlZ2VudGxpY2ggZXJoZWJ0IHNpY2ggQXJpbmEgdW0gbWl0IGVpbmVtIFN0b2NrIGV0d2FzIGluIGRlbiBTYW5kIHp1XG4iCisgICAgICAgICAgICArInplaWNobmVuLCBvZGVyIHVtIGVpbmVuIGRlciBQaXhpZXMgenUgZXJtYWhuZW4gd2VpbCBlciB3aWVkZXIgaXJnZW5kZWluZW5cbiIKKyAgICAgICAgICAgICsidmVycnVlY2t0ZW4gQmxvZWRzaW5uIGdlbWFjaHQgaGF0LiBEYSBzaWNoIHJpbmdzaGVydW0gZGVyIGRpY2h0ZSBXYWxkXG4iCisgICAgICAgICAgICArImFuc2NobGllc3N0LCBpc3QgZGVyIGVpbnppZ2UgQXVzZ2FuZywgZGVyIFdlZyB6dXJ1ZWNrIG5hY2ggT3N0ZW4gYXVmIGRpZVxuIgorICAgICAgICAgICAgKyJncm9zc2UgTGljaHR1bmcuXG4iOworICAgcmV0dXJuICJEdSBzdGVoc3QgYXVmIGVpbmVtIGtsZWluZW4gU2FuZHBsYXR6IG1pdHRlbiBpbSBXYWxkLiBIaWVyIHVuZCBkYSBzaWVoc3QgRHVcbiIKKyAgICAgICAgICsiaW0gU2FuZCBub2NoIGRldXRsaWNoIGRpZSBTcHVyZW4gZWluZXMgS2FtcGZlcy4gVW1nZWJlbiB3aXJkIGRpZXNlciBQbGF0elxuIgorICAgICAgICAgKyJ2b24gZWluZW0gZGljaHRlbiBXYWxkLCBzbyBkYXNzIGRlciBlaW56aWdlIEF1c2dhbmcgZGVyIFdlZyB6dXJ1ZWNrIG5hY2hcbiIKKyAgICAgICAgICsiT3N0ZW4genVyIGdyb3NzZW4gTGljaHR1bmcgaXN0LlxuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3N0ZGxpY2h0dW5nLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRsaWNodHVuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWVlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRsaWNodHVuZy5jCkBAIC0wLDAgKzEsMTU3IEBACisvLyAoYykgYnkgVGhvbWFzIFdpbmhlbGxlciAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlICIuLi9maWxlcy5oIgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0IFJPT00oInN0ZHJvb20iKTsKK2luaGVyaXQgIi9zdGQvcm9vbS9rcmFldXRlciI7CisKK3ZvaWQgbWF5YmVfcmVwbGFjZV9wcm9ncmFtKCkKKy8vIGRpZXNlciBTdGFuZGFyZHJhdW0sIGRhcmYgX25pY2h0XyByZXBsYWNlZCB3ZXJkZW4uLi4KK3sgfQorCitpbnQgdHVlbXBlbF9leChzdHJpbmcgZXhpdCwgbWFwcGluZyBtYXBfbGRmaWVkKQoreyAgIHJldHVybiBtYXBfbGRmaWVkW2V4aXRdPT1ST09NKCJ0dWVtcGVsIik7ICB9CisKK3N0YXRpYyBpbnQgcGxhbnQ7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIGludCBpOworICAgc3RyaW5nIHR1ZW1wZWwsIGRpcjsKKyAgIG1peGVkIHRtcDsKKworICAgaWYgKCFjbG9uZXAoTUUpKSByZXR1cm47CisgICA6OmNyZWF0ZSgpOworICAgcGxhbnQ9MDsKKyAgIFNldFByb3AoUF9JTkRPT1JTLCAwKTsKKyAgIFNldFByb3AoUF9MSUdIVCwgMSk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQW0gUmFuZGUgZGVyIFphdWJlcmxpY2h0dW5nIik7CisgICBTZXRQcm9wKEVYVFJBX0xPTkcsICIiKTsKKyAgIGlmIChQTykgZGlyPShQTy0+Q3VzdG9taXplT2JqZWN0KCkpOworICAgaWYgKCFkaXIpIHJldHVybjsKKyAgIGRpcj0oWyJvIjoib3N0IiwgInciOiJ3ZXN0IiwgIm4iOiJub3JkIiwgInMiOiJzdWVkIiwKKyAgICAgICAgICJubyI6Im5vcmRvc3QiLCAibnciOiJub3Jkd2VzdCIsCisgICAgICAgICAic28iOiJzdWVkb3N0IiwgInN3Ijoic3VlZHdlc3QiXSlbZGlyWzguLl1dOworICAgdHVlbXBlbD1maWx0ZXIobV9pbmRpY2VzKFF1ZXJ5UHJvcChQX0VYSVRTKXx8KFtdKSksICJ0dWVtcGVsX2V4IiwgTUUsIFF1ZXJ5UHJvcChQX0VYSVRTKXx8KFtdKSlbMF1bMC4uPDNdOworICAgZGlyPWNhcGl0YWxpemUoZGlyKTsgdHVlbXBlbD1jYXBpdGFsaXplKHR1ZW1wZWwpOworICAgU2V0UHJvcChQX0lOVF9MT05HLCBCUygKKyAgICAgIkR1IHN0ZWhzdCBhbSAiK2RpcisicmFuZCBkZXIgZ3Jvc3NlbiBMaWNodHVuZyBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuICIKKyAgICArdHVlbXBlbCsibGljaCB2b24gaGllciwgYmVmaW5kZXQgc2ljaCBnZW5hdSBpbiBkZXIgTWl0dGUgZGVyICIKKyAgICArIkxpY2h0dW5nIGVpbiBrbGVpbmVyIFR1ZW1wZWwgaW4gZGVzc2VuIFdhc3NlciBzaWNoIGRhcyBTb25uZW5saWNodCBpbiAiCisgICAgKyJhbGxlbiBGYXJiZW4gZGVzIFJlZ2VuYm9nZW5zIHNwaWVnZWx0LiBIaWVyIHVuZCBkYSBzdGVoZW4gdW0gZGVuIFRlaWNoICIKKyAgICArImhlcnVtIHZlcmVpbnplbHQgZWluaWdlIEVpY2hlbiBkaWUgc2ljaCBpcmdlbmR3aWUgenUgYmV3ZWdlbiAiCisgICAgKyJzY2hlaW5lbiB1bmQgYWIgdW5kIHp1IHNpZWhzdCBEdSB3aWUgc2ljaCBlaW5pZ2Uga2xlaW5lIFBpeGllcyBhdXMgIgorICAgICsiZGVtIFdhbGQgaGVyYXVzIGFucyBXYXNzZXIgdHJhdWVuLiBEaWUgRWljaGVuIGplZG9jaCwgaGFsdGVuIGltbWVyICIKKyAgICArImVpbmVuIGRldXRsaWNoZW4gQWJzdGFuZCB6dW0gV2Fzc2VyLiIrUXVlcnlQcm9wKEVYVFJBX0xPTkcpKSk7CisgICBBZGREZXRhaWwoKHsicmF1bSIsIGxvd2VyX2Nhc2UoZGlyKSsicmFuZCIsICJ6YXViZXJ3YWxkIn0pLCBRdWVyeVByb3AoUF9JTlRfTE9ORykpOworICAgQWRkRGV0YWlsKCh7InBpeGllcyIsICJ6YXViZXJ3ZXNlbiIsICJ1bmZ1ZyJ9KSwKKyAgICAgIlBpeGllcyBzaW5kIGtsZWluZSB2ZXJzcGllbHRlIFphdWJlcndlc2VuLCBkaWUgaGllciBpbSBaYXViZXJ3YWxkIHdvaG5lbi4gVW1cbiIKKyAgICArImVpbmVtIHZvbiBpaG5lbiB6dSBiZWdlZ25lbiB3aXJzdCBEdSBoaWVyIGltIFdhbGQgc2ljaGVyIG5pY2ggbGFuZ2Ugc3VjaGVuXG4iIAorICAgICsibXVlc3NlbiwgZG9jaCB2b3JzaWNodCwgc2llIGhhYmVuIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsiZmFyYmVuIiwgInJlZ2VuYm9nZW4iLCAiY29tcHV0ZXIifSksCisgICAgICJOb2NoIG5pZSBlaW5lbiBSZWdlbmJvZ2VuIGdlc2Vobj8gSG1tLi4gZGFubiBzaXR6dCBEdSB3aXJrbGljaCBlaW5kZXV0aWdcbiIKKyAgICArInp1dmllbCB2b3IgRGVpbmVtIENvbXB1dGVyLi4uXG4iKTsKKyAgIEFkZERldGFpbCgiYWJzdGFuZCIsCisgICAgICJXaWVzbyBzaWUgZGllc2VuIEFic3RhbmQgaGFsdGVuIGthbm5zdCBEdSBuaWNodCBuYWNodm9sbHppZWhuLCBhYmVyIG1laHIgYWxzXG4iCisgICAgKyJlaW4gcGFhciBNZXRlciBnZWhlbiBzaWUgbmllIGFuIGRlbiBhbHRlbiBXZWloZXIgZHJhbi5cbiIpOworICAgQWRkRGV0YWlsKCh7InNvbm5lIiwgInNvbm5lbnN0cmFobGVuIiwgInNvbm5lbmxpY2h0IiwgImhpbW1lbCIsICJoZXJ6In0pLAorICAgICAiWmFobHJlaWNoZSB3YXJtZSBTb25uZW5zdHJhaGxlbiBlcndhZXJtZW4gRGVpbiBIZXJ6IHVuZCBEdSBiaXN0IHJpY2h0aWdcbiIKKyAgICArImdsdWVja2xpY2guIFNvbGNoIGVpbiBJZHlsbGlzY2hlcyBQbGFldHpjaGVuIHdpbGxzdCBEdSBhbSBsaWVic3RlbiBuaWVcbiIKKyAgICArIndpZWRlciB2ZXJsYXNzZW4uIEZlaGx0IGVpZ2VudGxpY2ggbnVyIG5vY2ggZWluIFBhcnRuZXIsIG1pdCBkZW0gbWFuXG4iCisgICAgKyJoaWVyIGdlbWVpbnNhbSBpbiBkZXIgU29ubmUgbGllZ2VuIHVuZCBkYXMgcmF1c2NoZW4gZGVzIFdhc3NlcnMgZ2VuaWVzc2VuXG4iCisgICAgKyJrYW5uLlxuIik7CisgICBBZGREZXRhaWwoInBhcnRuZXIiLCAiRGVuIG11c3N0IER1IERpciBzY2hvbiBzZWxic3QgbWl0YnJpbmdlbi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLAorICAgICAiRHUgYmVmaW5kZXN0IERpY2ggcXVhc2kgbWl0dGVtIGlobiBpaG0uIFJ1bmQgaGVydW0gdW0gZGllIExpY2h0dW5nIHNjaGxpZXNzdFxuIgorICAgICsic2ljaCBlaW4gZGljaHRlciBXYWxkIGFuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZWljaGUiLCAiZWljaGVuIn0pLAorICAgICAiSGllciBiZWZpbmRldCBzaWNoIGdlcmFkZSBrZWluZSwgc28gZGFzcyBEdSBzaWUgbmljaCBuYWVoZXIgYW5zZWhuIGthbm5zdC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpY2h0dW5nIiwgInJhbmQiLCAicGxhZXR6Y2hlbiJ9KSwgUXVlcnlQcm9wKFBfSU5UX0xPTkcpKTsKKyAgIEFkZERldGFpbCgoeyJ3YXNzZXIiLCAidHVlbXBlbCIsICJ0ZWljaCIsIGxvd2VyX2Nhc2UodHVlbXBlbCkrImVuIiwgIm1pdHRlIn0pLAorICAgICAiV2VubiBEdSBEaXIgZGVuIFR1ZW1wZWwgaW4gZGVyIE1pdHRlIGRlciBMaWNodHVuZyBldHdhcyBuYWVoZXIgYW5zZWhlblxuIgorICAgICsibW9lY2h0ZXN0LCBzb2xsdGVzdCBEdSB2aWVsbGVpY2h0IGVpbmZhY2ggbm9jaCBlaW4gYmlzc2NoZW4gbmFlaGVyIHJhbmdlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJ3YWxkd2VnIiwgIndlZyJ9KSwKKyAgICAgIlVlYmVyIGRlbiBXYWxkd2VnIGthbm5zdCBEdSBkZW4gV2FsZCB3aWVkZXIgdmVybGFzc2VuIHdlbm4gRHUgbW9lY2h0ZXN0LlxuIik7CisgICBBZGREZXRhaWwoKHsiYm9kZW4ifSksCisgICAgICJEZXIgQm9kZW4gaXN0IGhpZXIgbmlyZ2VuZHMgbmFja3Qgc2ljaHRiYXIsIHNvbmRlcm4gaXN0IG1pdCBlaW5lbSBzY2hvZW5lblxuIgorICAgICsiZ3J1ZW5lbiBSYXNlbnRlcHBpY2ggYmVkZWNrdC4gTmljaHQgenUgaG9jaCB1bmQgbmljaHQgenUgdGllZiwgb2ZmZW5zaWNodGxpY2hcbiIKKyAgICArImJlZGFyZiBkaWVzZSBHcmFzYXJ0IGtlaW5lcmxlaSBQZmxlZ2Ugb2RlciBhYmVyIGlyZ2VuZGplbWFuZCBwZmxlZ3QgZGllc2VuXG4iCisgICAgKyJSYXNlbiBoaWVyIHNlZWVoaGhocnJyIGdydWVuZGxpY2guXG4iKTsKKyAgIEFkZERldGFpbCgoeyJncmFzYXJ0IiwgInJhc2VuIiwgImFydCIsICJncmFzIiwgInJhc2VudGVwcGljaCIsICJoYWxtZSJ9KSwKKyAgICAgIkR1IHNjaGF1c3QgRGlyIGRlbiBSYXNlbiBub2NoIGVpbm1hbCBncnVlbmRsaWNoIGFuIHVuZCBzdHJlaWNoc3QgbWl0IERlaW5lclxuIgorICAgICsiSGFuZCBkdXJjaCBkaWUgSGFsbWUuIFdhcyBhdWNoIGltbWVyIGRhcyBmdWVyIGVpbmUgQXJ0IGlzdCwgc29sY2ggZWluZW4gUmFzZW5cbiIKKyAgICArImhhc3QgRHUgbm9jaCBuaWNodCBnZXNlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgiaGFuZCIsCisgICAgICJTZWkgbGllYmVyIHZvcnNpY2h0aWcsIHNvbnN0IGlzdCBkaWUgSGFuZCBzY2huZWxsZXIgYWIgYWxzIER1IGRlbmtzdC4uLlxuIik7CisgICBBZGREZXRhaWwoInBmbGVnZSIsCisgICAgICJPYiBqZW1hbmQgZGllc2VuIFJhc2VuIHBmbGVndCwgYnp3LiBfd2VyXyBrYW5uc3QgRHUgbmljaHQgZW50ZGVja2VuLi4uXG4iKTsKKyAgIEFkZFNvdW5kcygoeyJyYXVzY2hlbiIsICJ3YXNzZXIifSksICJMZWlzZSBob2Vyc3QgRHUgZGFzIHJhdXNjaGVuIGRlcyBXYXNzZXJzLi4uLlxuIik7Cit9CisKKyNkZWZpbmUgVkVSQiAoWyJpc3MiOiAiZXNzZW4iLCAiZXNzZSI6ICJlc3NlbiIsICJwZmx1ZWNrIjogInBmbHVlY2tlbiIsICJwZmx1ZWNrZSI6ICJwZmx1ZWNrZW4iXSkKKworc3RhdGljIGludCBjbWRfcGlsemUoc3RyaW5nIHN0cikKK3sKKyAgIG5vdGlmeV9mYWlsKCJXYXMgbW9lY2h0ZXN0IER1ICIrVkVSQltxdWVyeV92ZXJiKCldKyI/XG4iKTsKKyAgIGlmIChzdHIhPSJwaWx6IiAmJiBzdHIhPSJwaWx6ZSIpIHJldHVybiAwOworICAgaWYgKHBsYW50PnRpbWUoKSkgeworICAgICAgd3JpdGUoIkR1IHNvbGx0ZXN0IGRpZSBQaWx6ZSBlcnN0bWFsIGluIFJ1aGUgd2llZGVyIGV0d2FzIG5hY2h3YWNoc2VuIGxhc3Nlbi5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKSB7CisgICAgICB3cml0ZSgiRHUgYmlzdCBudXIgR2FzdCBoaWVyIHVuZCBkaWUgQmV3b2huZXIgZGVzIFphdWJlcndhbGRzLCBzZWhlbiBlcyBuaWNodCBnZXJuZVxuIgorICAgICAgICAgICArIndlbm4gbWFuIGhpZXIgZWluZmFjaCBzbyBkaWUgUGlsemUgcGZsdWVja3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgcGxhbnQ9dGltZSgpKzMwMDsKKyAgIHdyaXRlKCJEdSBwZmx1ZWNrc3QgRGlyIGVpbmlnZSBQaWx6ZSB1bmQgaXNzdCBzaWUuIEFuc2NobGllc3NlbmQgZ2VodCBlcyBEaXJcbiIKKyAgICAgICAgKyJiZWRldXRlbmQgYmVzc2VyLlxuIik7CisgICBQTC0+cmVkdWNlX2hpdF9wb2ludHMoIG5lZ2F0ZSgxMDArcmFuZG9tKDEwMCkpICk7CisgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfZmFybmUoc3RyaW5nIHN0cikKK3sKKyAgIGludCBmb29kOworICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgIitWRVJCW3F1ZXJ5X3ZlcmIoKV0rIj9cbiIpOworICAgaWYgKHN0ciE9ImZhcm4iICYmIHN0ciE9ImZhcm5lIikgcmV0dXJuIDA7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKSB7CisgICAgICB3cml0ZSgiRHUgYmlzdCBudXIgR2FzdCBoaWVyIHVuZCBkaWUgQmV3b2huZXIgZGVzIFphdWJlcndhbGRzLCBzZWhlbiBlcyBuaWNodCBnZXJuZVxuIgorICAgICAgICAgICArIndlbm4gbWFuIGhpZXIgZWluZmFjaCBzbyBkZW4gRmFybiBhYnJlaXNzdC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICAvLyBkYXMgdGFua2VuIGFtIFdhc3NlciBpc3QgdW1zb25zdCwgZXMgaGVpbHQgZGFiZWkgd2llIGVpbgorICAgLy8gbWl0dGxlcmVzIEtuZWlwZW5lc3NlbiBkYXMgZ2VuYXUgMSBNdWVuemUga29zdGV0LiBHZWhlaWx0IHdlcmRlbiBudXIgSFAKKyAgIC8vIEVpbiBNaXNzYnJhdWNoIGlzdCBpbSBXYWxkIGF1c2dlc2NobG9zc2VuLCBiencuIG1hbiBtdWVzc3RlIGRlbgorICAgLy8gZ2VzYW10ZW4gV2FsZCBsZWVybWV0emVsbiB1bmQga2FubiBkYW5uIGhpZXIgdGFua2VuIGJpcyB6dW0gbmFlY2hzdGVuCisgICAvLyByZXNldC4gQmVpIEtvc3RlbiB2b24gZWluZXIgTXVlbnplIHBybyBIZWlsdW5nIGlzdCBlcyBzZWhyIGZyYWdsaWNoCisgICAvLyBvYiBzaWNoIGRhcyBsb2hudC4uLi4gOikKKyAgIGZvb2Q9KFBMLT5RdWVyeVByb3AoUF9NQVhfRk9PRCkpIC0gKFBMLT5RdWVyeVByb3AoUF9GT09EKSk7CisgICBpZiAoZm9vZD4xMCkgZm9vZD0xMDsgLy8gbmllIG1laHIgYWxzIGZ1ZXIgMTAgZm9vZCB0YW5rZW4uLi4KKyAgIGlmIChmb29kIDw9IDAgfHwgIVBMLT5lYXRfZm9vZChmb29kLCAxKSkgeworICAgICAgd3JpdGUoIkR1IGJpc3Qgc28gdm9sbCwgRHUga2FubnN0IGxlaWRlciB3aXJrbGljaCBuaWNodHMgbWVociBlc3Nlbi4uLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHdyaXRlKCJEdSBwZmx1ZWNrc3QgZWluIHdlbmlnIHZvbiBkZW0gRmFybiB1bmQgaXNzdCBpaG4uIFNvZ2xlaWNoIHNwdWVyc3QgRHUsIHdpZSBlc1xuIgorICAgICAgICArIkRpciBhbGxtYWVobGljaCB3aWVkZXIgYmVzc2VyIGdlaHQuLi5cbiIpOworICAgaWYgKFBMLT5lYXRfZm9vZChmb29kKSkgeyAvLyBmb29kIGd1dHNjaHJlaWJlbiBlcmZvbGdyZWljaD8KKyAgICAgIFBMLT5idWZmZXJfaHAoZm9vZCo2LCA4KTsKKyAgICAgIFBMLT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3N1ZWRlbigpCit7CisgICBpZiAoUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKT50aW1lKCkpIHsKKyAgICAgIHdyaXRlKCJEdSB2ZXJzdWNoc3QgaW4gZGVuIFdhbGQgenUgZmx1ZWNodGVuLCBkb2NoIGRpZSBGYXJuZSB1bmQgQnVlc2NoZSBiaWxkZW5cbiIKKyAgICAgICAgICAgKyJlaW5lIHBmbGFuemxpY2hlIEJhcnJpZXJlIHVuZCBsYXNzZW4gRGljaCBuaWNodCBoaW5kdXJjaC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICB3cml0ZSgiRHUgbWFjaHN0IGVpbmVuIFNjaHJpdHQgaGluIG5hY2ggU3VlZGVuIHVuZCBzb2ZvcnQgYmllZ2VuIHNpY2ggYXVmIG1hZ2lzY2hlXG4iCisgICAgICAgICsiV2Vpc2UgZGllIEZhcm5lIHVuZCBCdWVzY2hlIHp1ciBTZWl0ZSB1bmQgZ2ViZW4gZWluZW4gVHJhbXBlbHBmYWQgbmFjaCBTdWVkZW5cbiIKKyAgICAgICAgKyJmcmVpLlxuIik7CisgICBQTC0+bW92ZShST09NKCJodWV0dGUiKSwgTV9HTywgImR1cmNoIGRpZSBCdWVzY2hlIG5hY2ggU3VlZGVuIiwgInp3YWVuZ3Qgc2ljaCIpOworICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRyb29tLmMgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGRyb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyOTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3N0ZHJvb20uYwpAQCAtMCwwICsxLDUyIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKK2luaGVyaXQgInN0ZC9yb29tIjsKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3N0YXRpYyBzdHJpbmcgc291bmRzKCk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfTk9fVFBPUlQsIE5PX1RQT1JUKTsKKyAgIEFkZFNtZWxscyhTRU5TRV9ERUZBVUxULAorICAgICAiRGVyIER1ZnQgdm9tIEhhcnogZGVyIEJhZXVtZSB1bmQgZWluaWdlciBzb25zdGlnZXIgUGZsYW56ZW4gbGllZ3QgaW4gZGVyIEx1ZnQuXG4iCisgICAgKyJNYW4gbWVya3Qgc29mb3J0LCBEdSBzdGVoc3QgbWl0dGVtIGltIFdhbGQuXG4iKTsKKyAgIEFkZFNvdW5kcyhTRU5TRV9ERUZBVUxULCAjJ3NvdW5kcyk7CisgICBBZGRTb3VuZHMoKHsidm9lZ2VsIiwgInZvZWdlbG4iLCAiendpdHNjaGVybiJ9KSwKKyAgICAgIkRhcyBoZXJybGljaGUgendpdHNjaGVybiBkZXIgVm9lZ2VsLCBpc3QgZGFzIGVpbnppZ2UgZGFzIGRpZSBSdWhlIGltIFdhbGRcbiIKKyAgICArImR1cmNoYnJpY2h0LlxuIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgc291bmRzKCkKK3sKKyAgIGlmIChzaXplb2YoZmlsdGVyX29iamVjdHMoYWxsX2ludmVudG9yeSgpLCAiSW5GaWdodCIpKSkKKyAgICAgIHJldHVybiAiRGVyIExhZXJtIGRlcyBLYW1wZmVzIHN0b2VydCBkaWUgUnVoZSBkZXMgV2FsZGVzIHVuZCB1ZWJlcnRvZW50IGFsbGVzLlxuIjsKKyAgIGlmIChzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlKSk+MSkKKyAgICAgIHJldHVybiAiRXMgaXN0IHVuaGVpbWxpY2ggc3RpbGwgaGllciBpbSBXYWxkIHVuZCBudXIgZGFzIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWxcbiIKKyAgICAgICAgICAgICsiaXN0IHp1IGhvZXJlbi5cbiI7CisgICByZXR1cm4gIkR1IGhhc3QgZGFzIEdlZnVlaGwsIGFscyB3YWVyc3QgRHUgZ2FueiBhbGxlaW4gaGllciBpbSBXYWxkLiBBbGxlcyBpc3QgcnVoaWdcbiIKKyAgICAgICAgICsidW5kIG51ciBoaWVyIHVuZCBkYSB2ZXJuaW1tc3QgRHUgZGFzIHp3aXRzY2hlcm4gZWluaWdlciBWb2VnZWwuXG4iOworfQorCit2YXJhcmdzIHZvaWQgZGVsYXlfcmVzZXQoaW50IHRpbWUpCisvLyBOUENzIGtvZW5uZW4gYm9pbmcgcmVzZXRzIHZlcmhpbmRlcm4KK3sKKyAgIGlmICh0aW1lKQorICAgICAgc2V0X25leHRfcmVzZXQodGltZSk7CisgICBlbHNlIHNldF9uZXh0X3Jlc2V0KDM2MDApOworfQorCitpbnQgX25vcm1hbGZ1bmN0aW9uKCkKK3sKKyAgbWl4ZWQgejsKKyAgaW50IGk7CisgIHo9dGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKEFVU0dBTkcpOworICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKEFVU0dBTkcsIHF1ZXJ5X3ZlcmIoKSk7CisgIGk9KGludCk6Ol9ub3JtYWxmdW5jdGlvbigpOworICBpZiAoIWkpIHRoaXNfcGxheWVyKCktPlNldFByb3AoQVVTR0FORywgeik7CisgIHJldHVybiBpOworfQorICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS9zdGVpbi5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc3RlaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0YjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vc3RlaW4uYwpAQCAtMCwwICsxLDExMiBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkJlaSBlaW5lbSBTdGVpbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgoeyJvcnQiLCAid2FsZCIsICJwbGF0eiJ9KSwgIl9xdWVyeV9pbnRfbG9uZyIpOworICAgQWRkRGV0YWlsKCJzdGVpbiIsCisgICAgICJEZXIgU3RlaW4gaXN0LCBkdXJjaCBkaWUgU29ubmVuc3RyYWhsZW4gb3JkZW50bGljaCBhdWZnZWhlaXp0LCBhbmdlbmVobSB3YXJtXG4iCisgICAgKyJ1bmQgYmlldGV0IGVpZ2VudGxpY2ggZGVuIGlkZWFsZW4gUGxhdHogdW0gZXMgc2ljaCBndXQgZ2VobiB6dSBsYXNzZW4gdW5kIGluXG4iCisgICAgKyJkZXIgU29ubmUgenUgbGllZ2VuLlxuIik7CisgICBBZGREZXRhaWwoKHsic29ubmUiLCAiaGltbWVsIiwgInNvbm5lbnN0cmFobGVuIiwgInN0cmFobGVuIn0pLAorICAgICAiRGVyIGJsYXVlIEhpbW1lbCBpc3QgbmFoZXp1IHdvbGtlbmZyZWkgdW5kIHNvIHN0cmFobHQgZGllIFNvbm5lIGluIHZvbGxlclxuIgorICAgICsiUHJhY2h0IG9iZW4gYW0gSGltbWVsIHVuZCBpaHJlIFN0cmFobGVuIHByYXNzZWxuIGF1ZiBEZWluZSBIYXV0LlxuIik7CisgICBBZGREZXRhaWwoKHsiYm9kZW4iLCAid2VnIiwgIndhbGR3ZWciLCAiZXJkZSJ9KSwKKyAgICAgIkVpbiBnYW56IG5vcm1hbGVyIFdhbGR3ZWcgaGFsdCwgZWluIGJpc3NjaGVuIHNhbmRpZywgZWluaWdlIGtsZWluZSBBZXN0Y2hlblxuIgorICAgICsiZ2FueiBub3JtYWwgaGFsdC5cbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgiemVpdCIsICJkZXRfemVpdCIpOworICAgQWRkRGV0YWlsKCh7ImFlc3RjaGVuIiwgInN0b2Vja2NoZW4ifSksCisgICAgICJHYW56IGtsZWluZSBoZXJ1bnRlcmdlZmFsbGVuZSBTdG9lY2tjaGVuLCBkdXJjaCByZWdlcyBkcnVlYmVyIGxhdWZlblxuIgorICAgICsiaW0gTGF1ZmUgZGVyIFplaXQga2xlaW5nZW1hbGVuIHVuZCB2b20gV2V0dGVyIGF1ZmdlbG9lc3QuLi5cbiIpOworICAgQWRkRGV0YWlsKCJ3ZXR0ZXIiLAorICAgICAiQXVjaCB3ZW5uIGhpZXIgaGV1dGUgZGllIFNvbm5lIHNjaGVpbnQsIGdpYnQgZXMgbmF0dWVybGljaCBhdWNoIGhpZXJcbiIKKyAgICArImdlbGVnZW50bGljaCB2ZXJyZWduZXRlIFRhZ2UuXG4iKTsKKyAgIEFkZERldGFpbCgidGFnZSIsICJOYWphLi4uIGFsbHp1dmllbGUgc2luZCBlcyBqZWRvY2ggbmljaHQuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJub3Jkb3N0ZW4iLCAibGljaHR1bmciLCAiYXVzZ2FuZyIsICJ3ZWloZXIifSksCisgICAgICJJbSBOb3Jkb3N0ZW4ga2FubnN0IER1IGltbWVyIG5vY2ggZGllIGdyb3NzZSBMaWNodHVuZyBtaXQgZGVuIHdhbmRlcm5kZW4gRWljaGVuXG4iCisgICAgKyJ1bmQgZGVtIHZlcnd1bnNjaGVuZW4gV2VpaGVyIGVya2VubmVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZWljaGVuIiwgIndhbmRlcm5kZSBlaWNoZW4ifSksCisgICAgICJJbSBOb3Jkb3N0ZW4gYXVmIGRlciBMaWNodHVuZyBoYXN0IER1IHZvcmhpbiB3YW5kZXJuZGUgRWljaGVuIGdlc2VobixcbiIKKyAgICArInZpZWxsZWljaHQgc29sbHRlc3QgRHUgZWluZmFjaCBub2NobWFsIHp1cnVlY2sgZ2VobiB1bmQgc2llIERpciBuYWVoZXJcbiIKKyAgICArImFuc2NoYXVuLlxuIik7CisgICBBZGREZXRhaWwoKHsid29sa2UiLCAid29sa2VuIiwgInNjaGFlZmNoZW53b2xrZSJ9KSwKKyAgICAgIkRlciBIaW1tZWwgaXN0IGVpZ2VudGxpY2ggd29sa2VuZnJlaSBudXIgaGllciB1bmQgZGEgemllaHQgbWFsIGVpbmUga2xlaW5lXG4iCisgICAgKyJTY2hhZWZjaGVud29sa2Ugdm9yYmVpLlxuIik7CisgICBBZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJsaWNodHVuZ3N3IikpOworICAgQWRkSXRlbShOUEMoInRpdGluYSIpLCBSRUZSRVNIX1JFTU9WRSwgMSk7CisgICBBZGRDbWQoKHsic2V0eiIsICJzZXR6ZSIsICJsZWciLCAibGVnZSIsICJrbGV0dGVyIiwgImtsZXR0ZXJlIn0pLCAiY21kX3NldHplbiIpOworICAgQWRkQ21kKCh7InN0ZWgiLCAic3RlaGUifSksICJjbWRfYXVmc3RlaG4iKTsKK30KKworI2RlZmluZSBTVEVJTiBXQUxESUQoInN0ZWluIikKKwordm9pZCBpbml0KCkKK3sKKyAgaWYgKFBMKSBQTC0+U2V0UHJvcChTVEVJTiwgMCk7CisgIDo6aW5pdCgpOworfQorCitzdGF0aWMgaW50IGNtZF9hdWZzdGVobihzdHJpbmcgc3RyKQoreworICAgIGlmICghUEwtPlF1ZXJ5UHJvcChTVEVJTikpIHJldHVybiAwOworICAgIGlmIChzdHIhPSJhdWYiICYmIHN0ciE9InZvbiBzdGVpbiBhdWYiKSB7CisgICAgICAgbm90aWZ5X2ZhaWwoIlZvbiB3YXMgbW9lY2h0ZXN0IER1IGF1ZnN0ZWhuP1xuIik7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFBMLT5TZXRQcm9wKFNURUlOLCAwKTsKKyAgICB3cml0ZSgiRHUga2xldHRlcnN0IGFsc28gdm9tIFN0ZWluIHdpZWRlciBydW50ZXIgdW5kIHN0ZWhzdCBhdWYuXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBWRVJCKHgpIChbInNldHoiOiAic2V0enQiLCAibGVnIjogImxlZ3N0IiwgImtsZXR0ZXIiOiAia2xldHRlcnN0Il0pW3hdCisKK3N0YXRpYyBpbnQgY21kX3NldHplbihzdHJpbmcgc3RyKQoreworICAgc3RyaW5nIHZlcmI7CisgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgIGlmICh2ZXJiICYmIHZlcmJbPDFdPT0nZScpIHZlcmI9dmVyYlswLi48Ml07CisgICBpZiAoc3RyIT0iYXVmIHN0ZWluIiAmJiBzdHIhPSJzdGVpbiIgJiYgc3RyIT0idm9uIHN0ZWluIikgeworICAgICAgbm90aWZ5X2ZhaWwoQlMoIldvaGluIG1vZWNodGVzdCBEdSAiCisgICAgICAgICAgICAgICAgICsodmVyYiE9ImtsZXR0ZXIiID8gIkRpY2ggIiA6ICIiKSt2ZXJiKyJlbj8iKSk7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIGlmIChQTC0+UXVlcnlQcm9wKFNURUlOKSkgeworICAgICAgaWYgKHZlcmIhPSJrbGV0dGVyIiB8fCBzdHI9PSJhdWYgc3RlaW4iKSB7CisgICAgICAgICB3cml0ZSgiRHUgc2l0enQgZG9jaCBiZXJlaXRzIGF1ZiBkZW0gU3RlaW4hXG4iKTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgUEwtPlNldFByb3AoU1RFSU4sIDApOworICAgICAgd3JpdGUoIkR1IGtsZXR0ZXJzdCBhbHNvIHZvbSBTdGVpbiB3aWVkZXIgcnVudGVyIHVuZCBzdGVoc3QgYXVmLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgd3JpdGUoQlMoIkVudHNwYW5udCAiK1ZFUkIodmVyYikrIiBEdSAiKyh2ZXJiIT0ia2xldHRlciIgPyAiRGljaCAiIDogIiIpCisgICAgICAgICsiYXVmIGRlbiBTdGVpbiB1bmQgZ2VuaWVzc3QgZGllIFNvbm5lLiIpKTsKKyAgIFBMLT5TZXRQcm9wKFNURUlOLCB0aW1lKCkpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgZGV0X3plaXQoKQoreyAgcmV0dXJuICJXaXIgaGFiZW4gZ2VuYXUgIitkdGltZSh0aW1lKCkpWzw4Li5dKyIuXG4iOyB9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybgorICAgICAgICAiSGllciBtaXR0ZW4gaW0gV2FsZCBzdGVodCBlaW4gZ3Jvc3NlciBTdGVpbiwgYXVmIGRlbSBUaXRpbmEgZGllIHd1bmRlcnNjaG9lbmVcbiIKKyAgICAgICArIldhbGRmZWUgc2l0enQgdW5kIHNpY2ggaW4gYWxsZXIgUnVoZSBpaHIgbGFuZ2VzIGdvbGRlbmVzIEhhYXIga2FlbW10LiBEaWVcbiIKKyAgICAgICArIlNvbm5lIHN0cmFobHQgZ2VuYXUgYXVmIGRlbiBTdGVpbiB1bmQgZXMgaXN0IHdvaGwgd2lya2xpY2ggZGVyIGdlbXVldGxpY2hzdGVcbiIKKyAgICAgICArIk9ydCBhdWYgRXJkZW4uIExpbmtzIHVuZCByZWNodHMgdm9tIFdlZyBzY2hsaWVzc3QgZGVyIGRpY2h0ZSBXYWxkIGFuIHVuZCBzb1xuIgorICAgICAgICsiaXN0IGRlciBlaW56aWdlIEF1c2dhbmcgUmljaHR1bmcgTm9yZG9zdGVuIHp1cnVlY2sgenVyIExpY2h0dW5nLlxuIjsKKyAgIHJldHVybiAiSGllciBtaXR0ZW4gaW0gV2FsZCBzdGVodCBlaW4gZ3Jvc3NlciBTdGVpbiwgZGVyIHZvbiBkZXIgU29ubmUgb3JkZW50bGljaFxuIgorICAgICAgICAgKyJhdWZnZWhlaXp0IHdpcmQgdW5kIGlobiB6dSBlaW5lbSB0cmF1bWhhZnRlbiBPcnQgZnVlciBhbGxlIFNvbm5lbmxpZWJoYWJlclxuIgorICAgICAgICAgKyJtYWNodC4gTGlua3MgdW5kIHJlY2h0cyB2b20gV2VnIHNjaGxpZXNzdCBkaXJla3QgZGVyIGRpY2h0ZSBXYWxkIGFuIHVuZCBzb1xuIgorICAgICAgICAgKyJpc3QgZGVyIGVpbnppZ2UgQXVzZ2FuZyBSaWNodHVuZyBOb3Jkb3N0ZW4genVydWVjayB6dXIgTGljaHR1bmcuXG4iOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdHVlbXBlbC5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdHVlbXBlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjJkODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS90dWVtcGVsLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIChjKSBieSBUaG9tYXMgV2luaGVsbGVyIChQYWRyZWljQG1nLm11ZC5kZSkKKworI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSA8bW92aW5nLmg+CisKK2luaGVyaXQgUk9PTSgic3Rkcm9vbSIpOworaW5oZXJpdCAiL3N0ZC9yb29tL2tyYWV1dGVyIjsKKwordm9pZCBjcmVhdGUoKQoreworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9MSUdIVCwgMik7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQW4gZWluZW0gdmVyd3Vuc2NoZW5kZW4gV2VpaGVyIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCh7Im9ydCIsICJ3ZWloZXIifSksICJfcXVlcnlfaW50X2xvbmciKTsKKyAgIEFkZERldGFpbCgoeyJzZWVyb3NlbiIsICJmYXJiZW4iLCAiZmFyYmVudmllbGZhbHQifSksCisgICAgICJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBhbGxlbiBGYXJiZW4gZGVzIFJlZ2VuYm9nZW5zXG4iCisgICAgKyJlaW5lIHNvbGNoZSBGYXJiZW52aWVsZmFsdCB3aWUgaGllciwgaGFzdCBEdSBiaXNoZXIgbm9jaCBuaXJnZW5kd28gc29uc3RcbiIKKyAgICArImdlc2Vobi5cbiIpOworICAgQWRkRGV0YWlsKCJyZWdlbmJvZ2VuIiwgIkRlcnplaXQgc3RlaHQga2VpbmVyIGFtIEhpbW1lbC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImxpYmVsbGUiLCAibGliZWxsZW4iLCAiYXRtb3NwaGFlcmUiLCAic3VtbWVuIn0pLAorICAgICAiSGllciB1bmQgZGEgc2Nod2lycmVuIHVlYmVyIGRlbSBXZWloZXIgZWluaWdlIExpYmVsbGVuIGhlcnVtLiBJaHIgU3VtbWVuXG4iCisgICAgKyJ2ZXJicmVpdGV0IGVpbmUgcmljaHRpZyBpZHlsbGlzY2hlIEF0bW9zcGhhZXJlIGFuIGRpZXNlbSBPcnQuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJwaXhpZXMiLCAiemF1YmVyd2VzZW4ifSksCisgICAgICJQaXhpZXMgc2luZCBrbGVpbmUgdmVyc3BpZWx0ZSBaYXViZXJ3ZXNlbiwgZGllIGhpZXIgaW0gWmF1YmVyd2FsZCB3b2huZW4uIFVtXG4iCisgICAgKyJlaW5lbSB2b24gaWhuZW4genUgYmVnZWduZW4gd2lyc3QgRHUgaGllciBpbSBXYWxkIHNpY2hlciBuaWNoIGxhbmdlIHN1Y2hlblxuIgorICAgICsibXVlc3NlbiwgZG9jaCB2b3JzaWNodCwgc2llIGhhYmVuIG5pY2h0cyBhbHMgVW5mdWcgaW0gS29wZi4uLlxuIik7CisgICBBZGREZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIiwgInB1bmt0In0pLAorICAgICAiRGVyIHZlcnd1bnNjaGVuZSBXZWloZXIgaXN0IG1laHIgb2RlciB3ZW5pZ2VyIGRlciB6ZW50cmFsZSBQdW5rdCBoaWVyIGltXG4iCisgICAgKyJaYXViZXJ3YWxkLiBFciBsaWVndCBtaXR0ZW4gYXVmIGVpbmVyIGdyb3NzZW4gTGljaHR1bmcgdW1nZWJlbiB2b20gZGljaHRlblxuIgorICAgICsiV2FsZCBkZXIgUGl4aWVzXG4iKTsKKyAgIEFkZERldGFpbCgoeyJsaWNodHVuZyIsICJtaXR0ZSJ9KSwKKyAgICAgIkRlciBXZWloZXIgYmVmaW5kZXQgc2ljaCBnZW5hdSBpbiBkZXIgTWl0dGUgZGVyIExpY2h0dW5nLCBzaWVoIERpY2ggaGFsdFxuIgorICAgICsiZWluZmFjaCBtYWwgdW0uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJib2RlbiIsICJ1ZmVyIn0pLAorICAgICAiRGFzIFVmZXIgZGVzIFdlaWhlcnMgYmVzdGVodCBhdXMgemFobHJlaWNoZW4gU3RlaW5lbiBkaWUgYmlzIGluIGRlbiBXZWloZXJcbiIKKyAgICArImhpbmVpbnJlaWNoZW4uIEF1ZiB1bmQgendpc2NoZW4gZGllc2VuIFN0ZWluZW4gc2luZCBqZWRvY2ggdWViZXJhbGwgemFobHJlaWNoZVxuIgorICAgICsia2xlaW5lIHVuZCBtaXR0bGVyZSBQZmxhbnplbiBnZXdhY2hzZW4uXG4iKTsKKyAgIEFkZERldGFpbCgoeyJzdGVpbiIsICJzdGVpbmUifSksICJFaW4gU3RlaW4gaXN0IGVpbiBTdGVpbiBpc3QgZWluIFN0ZWluIGlzdCBlaW4gU3RlaW4gaXN0IGVpbiBTdGVpbi5cbiIpOworICAgQWRkRGV0YWlsKCJwZmxhbnplbiIsCisgICAgICJEaWUgdmVyc2NoaWVkZW5zdGVuIFBmbGFuemVuIHdhY2hzZW4gendpc2NoZW4gZGVuIFN0ZWluZW4gZW1wb3IgdW5kIGJlZ3J1ZW5lblxuIgorICAgICsiZGFzIFVmZXIuIEFuIGVpbmVyIFN0ZWxsZSBrYW5uc3QgRHUgc29nYXIgd2Vpc3NlbiBXYXNzZXItSGFobmVuZnVzcyB3YWNoc2VuXG4iCisgICAgKyJzZWhlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7Indhc3NlciIsICJzY2hpbW1lciIsICJzY2hpbW1lcm4ifSksCisgICAgICJEYXMgV2Fzc2VyIGlzdCBpcmdlbmR3aWUgcmVjaHQgdHJ1ZWIgdW5kIGVzIGdlaHQgZWluIHNlaHIgc2VsdHNhbWVzIFNjaGltbWVyblxuIgorICAgICsidm9uIGlobSBhdXMuIElyZ2VuZGV0d2FzIGJlc29uZGVyZXMgaGF0IGVzIG1pdCBkaWVzZW0gV2Fzc2VyIGF1ZiBzaWNoLCBkYXNcbiIKKyAgICArInNwdWVyc3QgRHUgZ2VuYXUuIER1IHdlaXNzdCBqZWRvY2ggbmljaHQsIG9iIGVzIGV0d2FzIGd1dGVzIG9kZXIgZXR3YXMgYm9lc2VzXG4iCisgICAgKyJpc3QuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJoaW1tZWwiLCAibHVmdCIsICJzb25uZSIsICJ3YWVybWUiLCAic3RyYWhsZW4iLCAic29ubmVuc3RyYWhsZW4ifSksCisgICAgICJEaWUgU29ubmUgc3RlaHQgaG9jaCBhbSBIaW1tZWwgdW5kIGZ1ZWxsdCBkaWVzZW4gT3J0IG1pdCBlaW5lciBoZXJybGljaGVuXG4iCisgICAgKyJXYWVybWUgdW5kIGlocmUgU3RyYWhsZW4gcmVmbGVrdGllcmVuIGltIFdhc3NlciBpbiBhbGxlbiBlcmRlbmtsaWNoZW4gRmFyYmVuLlxuIik7CisgICBBZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ24iKSk7CisgICBBZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJsaWNodHVuZ25vIikpOworICAgQWRkRXhpdCgibm9yZHdlc3RlbiIsIFJPT00oImxpY2h0dW5nbnciKSk7CisgICBBZGRFeGl0KCJvc3RlbiIsIFJPT00oImxpY2h0dW5nbyIpKTsKKyAgIEFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5ndyIpKTsKKyAgIEFkZEV4aXQoInN1ZWRlbiIsIFJPT00oImxpY2h0dW5ncyIpKTsKKyAgIEFkZEV4aXQoInN1ZWR3ZXN0ZW4iLCBST09NKCJsaWNodHVuZ3N3IikpOworICAgQWRkRXhpdCgic3VlZG9zdGVuIiwgUk9PTSgibGljaHR1bmdzbyIpKTsKKyAgIEFkZEl0ZW0oTlBDKCJ1bGluaWEiKSwgUkVGUkVTSF9SRU1PVkUsIDEpOworICAgQWRkQ21kKCh7ImJhZCIsICJiYWRlIiwgInNjaHdpbW0iLCAic2Nod2ltbWUiLCAidGF1Y2giLCAidGF1Y2hlIn0pLCAiY21kX3NjaHdpbW1lbiIpOworICAgQWRkQ21kKCh7InRyaW5rIiwgInRyaW5rZSJ9KSwgImNtZF90cmlua2VuIik7CisgICBBZGRDbWQoKHsicGZsdWVjayIsICJwZmx1ZWNrZSJ9KSwgImNtZF9wZmx1ZWNrZW4iKTsKKyAgIC8vIERldGFpbCBwZXIgSGFuZCBoaW56dWZ1ZWdlbiwgZGEgR2V0UGxhbnQgYW5zdGVsbGUgdm9uIEFkZFBsYW50CisgICAvLyB2ZXJ3ZW5kZXQgd2lyZC4KKyAgIEFkZFBsYW50RGV0YWlsKE9CSigiaGFobmVuZnVzcyIpKTsKK30KKworc3RhdGljIGludCBjbWRfdHJpbmtlbihzdHJpbmcgc3RyKQoreworICAgaW50IGRyaW5rOworICAgb2JqZWN0IG9iOworICAgaWYgKG1lbWJlcigoeyJ3YXNzZXIiLCAid2Fzc2VyIGF1cyB0ZWljaCIsICJ3YXNzZXIgYXVzIHR1ZW1wZWwiLAorICAgICAgICAgICAgICAgICJ3YXNzZXIgYXVzIHNlZSIsICJhdXMgdGVpY2giLCAiYXVzIHR1ZW1wZWwiLCAiYXVzIHdhc3NlciIsCisgICAgICAgICAgICAgICAgImF1cyBzZWUifSksIHN0cik9PS0xKSB7CisgICAgICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSB0cmlua2VuP1xuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIGlmICgob2I9cHJlc2VudChXQUxESUQoImZlZSIpLCBNRSkpICYmICFvYi0+SXNFbmVteShQTCkpIHsKKyAgICAgIHdyaXRlKEJTKCJEaWUgV2FsZGZlZSBzY2hlaW50IERlaW5lbiBFbnRzY2hsdXNzIGVpbiB3ZW5pZyB2b24gZGVtICIKKyAgICAgICAgICsiV2Fzc2VyIHp1IGtvc3RlbiwgYmVtZXJrdCB6dSBoYWJlbiB1bmQgc3RyYWZ0IERpY2ggbWl0IGVpbmVtICIKKyAgICAgICAgICsibWFobmVuZGVuIEJsaWNrIGFiLiBEdSB1ZWJlcmxlZ3N0IGVzIERpciBhbHNvIG5vY2ggZWlubWFsIHVuZCAiCisgICAgICAgICArImxhZXNzdCB2b24gRGVpbmVtIFZvcmhhYmVuIGFiLiIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgLy8gZGFzIHRhbmtlbiBhbSBXYXNzZXIgaXN0IHVtc29uc3QsIGVzIGhlaWx0IGRhYmVpIHdpZSBlaW4KKyAgIC8vIEtuZWlwZW5nZXRyYWVuayBkYXMgZ2VuYXUgMSBNdWVuemUga29zdGV0LiBHZWhlaWx0IHdlcmRlbiBudXIgU1AKKyAgIC8vIEVpbiBNaXNzYnJhdWNoIGlzdCBpbSBXYWxkIGF1c2dlc2NobG9zc2VuLCBiencuIG1hbiBtdWVzc3RlIGRlbgorICAgLy8gZ2VzYW10ZW4gV2FsZCBsZWVybWV0emVsbiB1bmQga2FubiBkYW5uIHVlYmVuIGJpcyB6dW0gbmFlY2hzdGVuCisgICAvLyByZXNldC4gQmVpIEtvc3RlbiB2b24gZWluZXIgTXVlbnplIHBybyBIZWlsdW5nIGlzdCBlcyBzZWhyIGZyYWdsaWNoCisgICAvLyBvYiBzaWNoIGRhcyBsb2hudC4uLi4gOikKKyAgIGRyaW5rPShQTC0+UXVlcnlQcm9wKFBfTUFYX0RSSU5LKSkgLSAoUEwtPlF1ZXJ5UHJvcChQX0RSSU5LKSk7CisgICBpZiAoZHJpbms+MTApIGRyaW5rPTEwOyAvLyBuaWUgbWVociBhbHMgZnVlciAxMCBzb2FrIHRhbmtlbi4uLgorICAgaWYgKGRyaW5rIDw9IDAgfHwgIVBMLT5kcmlua19zb2Z0KGRyaW5rLCAxKSkgeworICAgICAgd3JpdGUoIkR1IGJpc3Qgc28gdm9sbCwgRHUga2FubnN0IGxlaWRlciB3aXJrbGljaCBuaWNodHMgbWVociB0cmlua2VuLi4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgd3JpdGUoIkR1IGdlaHN0IGFuIGRlbiBSYW5kIGRlcyBXZWloZXJzIHVuZCBuaW1tc3QgZWluZW4ga3JhZWZ0aWdlbiBTY2hsdWNrIHZvbiBkZW1cbiIKKyAgICAgICAgKyJXYXNzZXIuIFNvZ2xlaWNoIHNwdWVyc3QgRHUsIHdpZSBEZWluZSBtZW50YWxlbiBLcmFlZnRlIGxhbmdzYW0gZ2VzdGFlcmt0XG4iCisgICAgICAgICsid2VyZGVuLlxuIik7CisgICBpZiAoUEwtPmRyaW5rX3NvZnQoZHJpbmspKSB7IC8vIHNvYWsgZ3V0c2NocmVpYmVuIGVyZm9sZ3JlaWNoPworICAgICAgUEwtPmJ1ZmZlcl9zcChkcmluayo2LCA1KTsKKyAgICAgIFBMLT5TZXRQcm9wKFpBVUJFUldBTEQsIHRpbWUoKStBR0dSRVNTSVZFX1RJTUUpOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY21kX3NjaHdpbW1lbihzdHJpbmcgc3RyKQoreworICAgc3RyaW5nIHZlcmI7CisKKyAgIC8vIGJlc29uZGVyZSBFaWdlbnNjaGFmdCBkZXIgc2NobHVlc3NlbHdvZXJ0ZXIgYXVzbnV0emVuLi4uIDopCisgICB2ZXJiPShxdWVyeV92ZXJiKCl8fCIiKTsKKyAgIGlmICh2ZXJiWzwxXSE9J2UnKSB2ZXJiKz0iZSI7CisgICBpZiAobWVtYmVyKCh7ImluIHRlaWNoIiwgImluIHdlaWhlciIsICJpbiB0dWVtcGVsIiwgImluIHNlZSJ9KSwgc3RyKT09LTEpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJXb3JpbiB3aWxsc3QgRHUgIit2ZXJiKyJuP1xuIik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHN0cj1jYXBpdGFsaXplKHN0clszLi5dKTsgLy8gImluICIgYWJzY2huZWlkZW4uLi4KKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkgeworICAgICAgd3JpdGUoQlMoIkRpZSBXYWxkZmVlIHNjaGVpbnQgRGVpbmVuIEVudHNjaGx1c3MgaW0gIitzdHIrIiAiK3ZlcmIKKyAgICAgICAgICsibiB6dSBnZWhuIGlyZ2VuZHdpZSBiZW1lcmt0IHp1IGhhYmVuIHVuZCBzdHJhZnQgRGljaCBtaXQgZWluZW0gIgorICAgICAgICAgKyJtYWhuZW5kZW4gQmxpY2sgYWIuIERlaW5lIEx1c3QgenVtICIrY2FwaXRhbGl6ZSh2ZXJiKQorICAgICAgICAgKyJuIHNpbmt0IHNvZ2xlaWNoIGdlZ2VuIG51bGwsIGRlbm4gRHUgdmVyc3B1ZXJzdCBrZWluZSBncm9zc2UgIgorICAgICAgICAgKyJMdXN0IERpY2ggbWl0IGRlciBXYWxkZmVlIGFuenVsZWdlbi4iKSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHdyaXRlKEJTKCJNdXRpZyBnZWhzdCBEdSBlaW5lbiBTY2hyaXR0IGlucyBXYXNzZXIsIGRhIHVlYmVya29tbXQgRGljaCBhdWNoICIKKyAgICAgICAgICAgKyJzY2hvbiBlaW4gc2VsdHNhbWVzIGtyaWJiZWxuIGFtIGdhbnplbiBLb2VycGVyLiBJbiB3aW5kZXNlaWxlICIKKyAgICAgICAgICAgKyJoYXN0IER1IGRlbiAiK3N0cisiIGF1Y2ggc2Nob24gd2llZGVyIHZlcmxhc3Nlbi4iKSk7CisgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjbWRfcGZsdWVja2VuKHN0cmluZyBzdHIpCit7CisgICBvYmplY3Qgb2I7CisgICBub3RpZnlfZmFpbCgiV0FTIG1vZWNodGVzdCBEdSBwZmx1ZWNrZW4/XG4iKTsKKyAgIGlmIChtZW1iZXIoKHsiaGFobmVuZnVzcyIsCisgICAgICAgICAgICAgICAgIndhc3Nlci1oYWhuZW5mdXNzIiwKKyAgICAgICAgICAgICAgICAid2Vpc3NlciBoYWhuZW5mdXNzIiwKKyAgICAgICAgICAgICAgICAid2Vpc3NlciB3YXNzZXItaGFobmVuZnVzcyJ9KSwgc3RyKTwwKSByZXR1cm4gMDsKKyAgIGlmICgob2I9cHJlc2VudChXQUxESUQoImZlZSIpLCBNRSkpICYmICFvYi0+SXNFbmVteShQTCkpIHsKKyAgICAgIHdyaXRlKEJTKCJEaWUgV2FsZGZlZSBzY2hlaW50IERlaW4gVm9yaGFiZW4gYmVtZXJrdCB6dSBoYWJlbiB1bmQgIgorICAgICAgICAgKyJzdHJhZnQgRGljaCBtaXQgZWluZW0gbWFobmVuZGVuIEJsaWNrIGFiLiBEdSB1ZWJlcmxlZ3N0IGVzIERpciAiCisgICAgICAgICArIndpZWRlciBhbmRlcnMgdW5kIGxhZXNzdCB2b24gRGVpbmVtIFZvcmhhYmVuIGFiLCBzb2xhbmdlIGRpZSAiCisgICAgICAgICArIkZlZSBoaWVyIHdhY2h0LiIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgb2I9R2V0UGxhbnQoT0JKKCJoYWhuZW5mdXNzIikpOworICAgaWYgKG9iamVjdHAob2IpKSB7CisgICAgICBpZiAob2ItPm1vdmUoUEwsIE1fR0VUKT09MSkKKyAgICAgICAgICB3cml0ZShCUygiVm9yc2ljaHRpZyBwZmx1ZWNrc3QgRHUgIitvYi0+bmFtZShXRU4sIDEpCisgICAgICAgICAgICAgICAgICArIiB1bmQgbmltbXN0ICIrb2ItPlF1ZXJ5UHJvbm91bihXRU4pKyIgYW4gRGljaC4iKSk7CisgICAgICBlbHNlIHdyaXRlKEJTKCJWb3JzaWNodGlnIHBmbHVlY2tzdCBEdSAiK29iLT5uYW1lKFdFTiwgMSkrIiBrYW5uc3QgIgorICAgICAgICAgICAgICAgICAgK29iLT5RdWVyeVByb25vdW4oV0VOKSsiIGFiZXIgbmljaHQgbmVobWVuLiIpKTsKKyAgIH0KKyAgIGVsc2UgaWYgKCFvYikKKyAgICAgIHdyaXRlKEJTKCJEZXIgSGFobmVuZnVzcyBpc3Qgbm9jaCBuaWNodCB3aWVkZXIgd2VpdCBnZW51ZyAiCisgICAgICAgICAgICAgICsibmFjaGdld2FjaHNlbiB1bSBpaG4gcGZsdWVja2VuIHp1IGtvZW5uZW4uIikpOworICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgiZmVlIiksIE1FKSkKKyAgICAgIHJldHVybgorICAgICAgICAiRHUgc3RlaHN0IG51biBhbiBlaW5lbSBrbGVpbmVuIHZlcnd1bnNjaGVuZW4gV2VpaGVyLCBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuXG4iCisgICAgICAgKyJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBkZW4gdmVyc2NoaWVkZW5zdGVuIEZhcmJlblxuIgorICAgICAgICsidW5kIGhpZXIgdW5kIGRvcnQgc2Nod2lycnQgZWluZSBMaWJlbGxlIGluIGRlciBMdWZ0LiBNaXR0ZW4gdWViZXIgZGVtIFdlaWhlclxuIgorICAgICAgICsic2Nod2VidCBlaW5lIHd1bmRlcnNjaG9lbmUgV2FsZGZlZSBpbiBkZXIgTHVmdCB1bmQgc2NoZWludCBkZW4gV2VpaGVyIHp1XG4iCisgICAgICAgKyJiZXdhY2hlbi4gSXJnZW5kZXR3YXMgZ2VoZWltbmlzdm9sbGVzIHNjaGVpbnQgZXMgbWl0IGRlbSBXZWloZXIgYXVmIHNpY2hcbiIKKyAgICAgICArInp1IGhhYmVuLCBudXIgd2FzP1xuIjsKKyAgIHJldHVybgorICAgICAiRHUgc3RlaHN0IG51biBhbiBlaW5lbSBrbGVpbmVuIHZlcnd1bnNjaGVuZW4gV2VpaGVyLCBpbm1pdHRlbiBkZXMgWmF1YmVyd2FsZHMuXG4iCisgICAgKyJBdWYgZGVtIFdhc3NlciBzY2h3aW1tZW4gemFobHJlaWNoZSBTZWVyb3NlbiBpbiBkZW4gdmVyc2NoaWVkZW5zdGVuIEZhcmJlbiB1bmRcbiIKKyAgICArImhpZXIgdW5kIGRvcnQgc2Nod2lycnQgZWluZSBMaWJlbGxlIGluIGRlciBMdWZ0LiBBbGxlcyBzY2hlaW50IGhpZXIgc2VoclxuIgorICAgICsiZnJpZWRsaWNoIHp1IHNlaW4sIGZhc3QgZWluIHdlbmlnIHp1IGZyaWVkbGljaC4gSXJnZW5kZXR3YXMgZ2VoZWltbmlzdm9sbGVzXG4iCisgICAgKyJzY2hlaW50IGVzIG1pdCBkaWVzZW0gV2VpaGVyIGF1ZiBzaWNoIHp1IGhhYmVuLCBudXIgd2FzP1xuIjsKK30KZGlmZiAtLWdpdCBhL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3ZpcnR1YWxfY29tcGlsZXIuYyBiL2RvYy9iZWlzcGllbGUvemF1YmVyd2FsZC9yb29tL3ZpcnR1YWxfY29tcGlsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M0ZDVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vdmlydHVhbF9jb21waWxlci5jCkBAIC0wLDAgKzEsMTMzIEBACisvLyAoYykgYnkgUGFkcmVpYyAoUGFkcmVpY0BtZy5tdWQuZGUpCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dl9jb21waWxlci5oPgorI2luY2x1ZGUgIi4uL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3Avc2VydmljZS9wYWRyZWljL2tyYWV1dGVyL3BsYW50LmgiCisKK2luaGVyaXQgInN0ZC92aXJ0dWFsL3ZfY29tcGlsZXIiOworCitjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU1REX09CSkVDVCwgUk9PTSgic3RkbGljaHR1bmciKSk7CisgIFNldFByb3AoUF9DT01QSUxFUl9QQVRILCBST09NKCIiKSk7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkKK3sKKyAgZmlsZT06OlZhbGlkYXRlKGZpbGUpOworICBzd2l0Y2goZmlsZSkgeyAKKyAgICAgY2FzZSAibGljaHR1bmdzbyI6CisgICAgIGNhc2UgImxpY2h0dW5nbyI6CisgICAgIGNhc2UgImxpY2h0dW5nbm8iOgorICAgICBjYXNlICJsaWNodHVuZ24iOgorICAgICBjYXNlICJsaWNodHVuZ3MiOgorICAgICBjYXNlICJsaWNodHVuZ253IjoKKyAgICAgY2FzZSAibGljaHR1bmd3IjoKKyAgICAgY2FzZSAibGljaHR1bmdzdyI6ICByZXR1cm4gZmlsZTsKKyAgICAgZGVmYXVsdDoKKyAgfQorfQorICAgICAgICAgCittaXhlZCBDdXN0b21pemVPYmplY3QoKQoreworICBzdHJpbmcgZmlsZTsKKyAgZmlsZT1WYWxpZGF0ZSg6OkN1c3RvbWl6ZU9iamVjdCgpKTsKKyAgaWYgKCFyYW5kb20oMykpIFBPLT5BZGRJdGVtKE5QQygibGF1ZmVpY2hlIiksIFJFRlJFU0hfREVTVFJVQ1QsIChbTU5QQ19IT01FOiBST09NKGZpbGUpXSkgKTsKKyAgc3dpdGNoKGZpbGUpIHsKKyAgICAgY2FzZSAibGljaHR1bmdubyI6CisgICAgICAgUE8tPkFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5nbiIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgibGljaHR1bmdvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkd2VzdGVuIiwgUk9PTSgidHVlbXBlbCIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZG9zdGVuIiwgUk9PTSgid2VnMiIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLAorICAgICAgICAgIiBJbSBTdWVkb3N0ZW4gYmVmaW5kZXQgc2ljaCBkZXIgV2FsZHdlZywgdWViZXIgZGVuIER1IGRlbiBXYWxkIHdpZWRlciAiCisgICAgICAgICsidmVybGFzc2VuIGthbm5zdC4iKTsKKyAgICAgICByZXR1cm4gZmlsZTsKKworICAgICBjYXNlICJsaWNodHVuZ28iOgorICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ25vIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkZW4iLCBST09NKCJsaWNodHVuZ3NvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJvc3RlbiIsIFJPT00oIndlZzIiKSk7CisgICAgICAgUE8tPlNldFByb3AoRVhUUkFfTE9ORywKKyAgICAgICAgICIgSW0gT3N0ZW4gYmVmaW5kZXQgc2ljaCBkZXIgV2FsZHdlZywgdWViZXIgZGVuIER1IGRlbiBXYWxkIHdpZWRlciAiCisgICAgICAgICsidmVybGFzc2VuIGthbm5zdC4iKTsKKyAgICAgICByZXR1cm4gZmlsZTsKKworICAgICBjYXNlICJsaWNodHVuZ3NvIjoKKyAgICAgICBQTy0+QWRkRXhpdCgid2VzdGVuIiwgUk9PTSgibGljaHR1bmdzIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ28iKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm5vcmR3ZXN0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3Jkb3N0ZW4iLCBST09NKCJ3ZWcyIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsCisgICAgICAgICAiIEltIE5vcmRvc3RlbiBiZWZpbmRldCBzaWNoIGRlciBXYWxkd2VnLCB1ZWJlciBkZW4gRHUgZGVuIFdhbGQgd2llZGVyICIKKyAgICAgICAgKyJ2ZXJsYXNzZW4ga2FubnN0LiIpOworICAgICAgIFBPLT5BZGRJdGVtKE5QQygicmllc2UiKSwgUkVGUkVTSF9ERVNUUlVDVCk7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmdzIjoKKyAgICAgICBQTy0+QWRkRXhpdCgid2VzdGVuIiwgUk9PTSgibGljaHR1bmdzdyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgib3N0ZW4iLCBST09NKCJsaWNodHVuZ3NvIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsCisgICAgICAgICAiIEluIGRlciBXaWVzZSBzaWVoc3QgRHUgYW4gZWluZXIgU3RlbGxlIGV0d2FzIEtsZWUgd2FjaHNlbi4iKTsKKyAgICAgICBQTy0+QWRkUGxhbnQoQklUVEVSS0xFRSk7CisgICAgICAgLy8gImtsZWUiIF9uYWNoXyBkZW0gQWRkUGxhbnQgZWluZnVlZ2VuLCBkYW1pdCBkaWUgcmVzdGxpY2hlbiBEZXRhaWxzCisgICAgICAgLy8gd2llIEJpdHRlcmtsZWUgdHJvdHpkZW0gbm9jaCBlaW5nZWZ1ZWd0IHdlcmRlbgorICAgICAgIFBPLT5SZW1vdmVEZXRhaWwoKHsia2xlZSJ9KSk7CisgICAgICAgUE8tPkFkZERldGFpbCgoeyJzdGVsbGUiLCAia2xlZSJ9KSwKKyAgICAgICAgICJCZWkgZGVyIFN0ZWxsZSBzY2hlaW50IGVzIHNpY2ggdW56d2VpZmVsaGFmdCB1bSBCaXR0ZXJrbGVlIHp1IGhhbmRlbG4uXG4iKTsKKyAgICAgICBQTy0+QWRkQ21kKCJzdWVkZW4iLCAiY21kX3N1ZWRlbiIpOworICAgICAgIHJldHVybiBmaWxlOworCisgICAgIGNhc2UgImxpY2h0dW5nbiI6CisgICAgICAgUE8tPkFkZEV4aXQoIndlc3RlbiIsIFJPT00oImxpY2h0dW5nbnciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmdubyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgidHVlbXBlbCIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLCAiIEFtIFJhbmQgZGVyIFdpZXNlIGVudGRlY2t0IER1IGVpbmlnZSBrbGVpbmUgUGlsemUgaW0gR3Jhcy4iKTsKKyAgICAgICBQTy0+QWRkQ21kKCh7ImVzc2UiLCAiaXNzIiwgInBmbHVlY2siLCAicGZsdWVja2UifSksICJjbWRfcGlsemUiKTsKKyAgICAgICBQTy0+QWRkRGV0YWlsKCh7InBpbHoiLCAicGlsemUiLCAic2NoaW1tZXIifSksCisgICAgICAgICAiRGllIFBpbHplIGhhYmVuIGVpbmVuIGFldXNzZXJzdCBzZWx0c2FtZW4gbWV0YWxsaXNjaGVtIFNjaGltbWVyIHVuZFxuIgorICAgICAgICArInZlcmJyZWl0ZW4gZWluZW4gc2VociBhbmdlbmVobWVuIHN1ZXNzbGljaGVuIER1ZnQgaW0gUmF1bS5cbiIpOworICAgICAgIFBPLT5BZGRTbWVsbHMoKHsicGlseiIsICJwaWx6ZSJ9KSwKKyAgICAgICAgICJEaWUgUGlsemUgdmVyYnJlaXRlbiBlaW5lbiBzZWhyIHN1ZXNzbGljaGVuIER1ZnQuXG4iKTsKKyAgICAgICBQTy0+QWRkU21lbGxzKCJkdWZ0IiwgIkRlciBEdWZ0IGlzdCBlaWdlbnRsaWNoIHNlaHIgYmVmcmVpZW5kIHVuZCBhbmdlbmVobS5cbiIpOworICAgICAgIHJldHVybiBmaWxlOworCisgICAgIGNhc2UgImxpY2h0dW5nbnciOgorICAgICAgIFBPLT5BZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJzY2h1bGUiKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmduIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJzdWVkZW4iLCBST09NKCJsaWNodHVuZ3ciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoInN1ZWRvc3RlbiIsIFJPT00oInR1ZW1wZWwiKSk7CisgICAgICAgUE8tPlNldFByb3AoRVhUUkFfTE9ORywKKyAgICAgICAgICIgTmFjaCBXZXN0ZW4ga2FubnN0IER1IGVpbiBTdHVlY2sgaW4gZGVuIFdhbGQgaGluZWluIGdlaG4uIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmd3IjoKKyAgICAgICBQTy0+QWRkRXhpdCgibm9yZGVuIiwgUk9PTSgibGljaHR1bmdudyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgic3VlZGVuIiwgUk9PTSgibGljaHR1bmdzdyIpKTsKKyAgICAgICBQTy0+QWRkRXhpdCgib3N0ZW4iLCBST09NKCJ0dWVtcGVsIikpOworICAgICAgIFBPLT5TZXRQcm9wKEVYVFJBX0xPTkcsICIgQW0gV2FsZHJhbmQgc3RlaGVuIGVpbmlnZSBibGFldWxpY2hlIEZhcm5lLiIpOworICAgICAgIFBPLT5BZGRDbWQoKHsiZXNzZSIsICJpc3MiLCAicGZsdWVjayIsICJwZmx1ZWNrZSJ9KSwgImNtZF9mYXJuZSIpOworICAgICAgIFBPLT5BZGREZXRhaWwoKHsiZmFybiIsICJmYXJuZSJ9KSwKKyAgICAgICAgICJEaWUgYmxhZXVsaWNoZW4gRmFybmUgc2luZCB3aXJrbGljaCBzZWhyIG1lcmt3dWVyZGlnLiBzb2V0d2FzIGhhc3QgRHUgYmlzaGVyXG4iCisgICAgICAgICsibm9jaCBuaXJnZW5kd28gZ2VzZWhuLiBJcmdlbmRldHdhcyBiZXNvbmRlcmVzIGhhdCBlcyBzaWNoZXJsaWNoIGRhbWl0IGF1ZiBzaWNoLlxuIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgY2FzZSAibGljaHR1bmdzdyI6CisgICAgICAgUE8tPkFkZEV4aXQoIm9zdGVuIiwgUk9PTSgibGljaHR1bmdzIikpOworICAgICAgIFBPLT5BZGRFeGl0KCJub3JkZW4iLCBST09NKCJsaWNodHVuZ3ciKSk7CisgICAgICAgUE8tPkFkZEV4aXQoIm5vcmRvc3RlbiIsIFJPT00oInR1ZW1wZWwiKSk7CisgICAgICAgUE8tPkFkZEV4aXQoInN1ZWR3ZXN0ZW4iLCBST09NKCJzdGVpbiIpKTsKKyAgICAgICBQTy0+U2V0UHJvcChFWFRSQV9MT05HLAorICAgICAgICAgIiBOYWNoIFN1ZWR3ZXN0ZW4ga2FubnN0IER1IGVpbiBTdHVlY2sgaW4gZGVuIFdhbGQgaGluZWluIGdlaG4uIik7CisgICAgICAgcmV0dXJuIGZpbGU7CisKKyAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGZpbGU7Cit9CisKK2ludCBOb1BhcmFPYmplY3RzKCkgeyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMS5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWI3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS93ZWcxLmMKQEAgLTAsMCArMSw3NSBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDApOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkF1ZiBlaW5lbSBXYWxkd2VnIGltIFphdWJlcndhbGQiKTsKKyAgIEFkZERldGFpbCgoeyJibGFldHRlcmRhY2giLCAiZGFjaCIsICJiYWV1bWUifSksCisgICAgICJEaWUgQmFldW1lIHJlY2h0cyB1bmQgbGlua3MgZGVzIFdlZ2VzIGJpbGRlbiB1ZWJlciBkZW0gV2VnIGVpbiBzbyBkaWNodGVzXG4iCisgICAgKyJCbGFldHRlcmRhY2gsIGRhcyBzbyBndXQgd2llIHVlYmVyaGF1cHQga2VpbiBTb25uZW5saWNodCBtZWhyIGF1ZiBkZW4gV2VnXG4iCisgICAgKyJzY2hlaW50LlxuIik7CisgICBBZGRTcGVjaWFsRGV0YWlsKCJzemVuZSIsICJfcXVlcnlfaW50X2xvbmciKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsid2VnIiwgIndlZ2VzIiwgIndhbGR3ZWciLCAiYm9kZW4ifSksICJkZXRfd2VnIik7CisgICBBZGREZXRhaWwoKHsibGljaHQiLCAic29ubmVubGljaHQiLCAic29ubmVuc3RyYWhsZW4ifSksCisgICAgICJEdXJjaCBkYXMgZGljaHRlIEJsYWV0dGVyZGFjaCBzY2hhZmZlbiBlcyBkaWUgU29ubmVuc3RyYWhsZW4gbnVyIG5vY2ggc2VoclxuIgorICAgICsidmVyZWluemVsdCBiaXMgYXVmIGRlbiBXZWcgZHVyY2h6dWtvbW1lbi4gRGFkdXJjaCBpc3QgZXMgaGllciB1bnRlbiByZWxhdGl2XG4iCisgICAgKyJGZXVjaHQsIGthbHQgdW5kIGR1bmtlbC5cbiIpOworICAgQWRkRGV0YWlsKCh7ImhpbW1lbCIsICJzb25uZSIsICJ3b2xrZSIsICJ3b2xrZW4ifSksCisgICAgICJEYXMgQmxhZXR0ZXJkYWNoIGlzdCBoaWVyIHNvIGRpY2h0LCBkYXMgRHUgZGVuIEhpbW1lbCBuaWNodCBtYWwgbWVociBlcmFobmVuXG4iCisgICAgKyJrYW5uc3QuIER1IHdlaXNzdCBuaWNodCBtYWwsIG9iIGVzIHJlZ25ldCBvZGVyIG9iIGRpZSBTb25uZSBzY2hlaW50LlxuIik7CisgICBBZGREZXRhaWwoImZldWNodCIsCisgICAgICJCbG9zcyB3ZWlsIGZldWNodCBncm9zc2dlc2NocmllYmVuIGlzdCBlcyBub2NoIGxhbmdlIGtlaW4gU3Vic3RhbnRpdiwgd2VublxuIgorICAgICsidWViZXJoYXVwdCBoZWlzc3QgZXMgZGFubiBfRmV1Y2h0aWdrZWl0XyA6KS5cbiIpOworICAgQWRkRGV0YWlsKCJzdWJzdGFudGl2IiwgIk5pY2h0IGplZGVzIFN1YnN0YW50aXYgaXN0IGVpbiBzaW5udm9sbGVzIERldGFpbCA6KVxuIik7CisgICBBZGREZXRhaWwoImZldWNodGlna2VpdCIsICJFaW4gd2VuaWcgZmV1Y2h0LCB3aWUgbWFuIGVzIGhhbHQgYXVzIGplZGVtIFdhbGQgc28ga2VubnQuXG4iKTsKKyAgIEFkZERldGFpbCgia2FlbHRlIiwKKyAgICAgIkR1cmNoIGRhcyB3ZW5pZ2UgU29ubmVubGljaHQsIGRhcyBiaXMgbmFjaCBoaWVyIHVudGVuIGR1cmNoZHJpbmd0LCBpc3QgZXNcbiIKKyAgICArImhpZXIgdmVyaGFlbHRuaXNtYWVzc2lnIGZyaXNjaC5cbiIpOworICAgQWRkRGV0YWlsKCJkdW5rZWxoZWl0IiwKKyAgICAgIldlbm4gZXMgaGVsbCBpc3QsIGlzdCBlcyBuaWNodCBtZWhyIGR1bmtlbCB1bmQgd2VubiBlcyBuaWNodCBoZWxsIGlzdCwga2FubnN0XG4iCisgICAgKyJEdSBuaWNodCB2aWVsIHNlaG4uIFdpZSBhbHNvIHdpbGxzdCBEdSBkaWUgRHVua2VsaGVpdCB1bnRlcnN1Y2hlbiA6KT9cbiIpOworICAgQWRkRGV0YWlsKCJfZmV1Y2h0aWdrZWl0XyIsICJNZWluZSBHdWV0ZSwgbmltbSBkb2NoIG5pY2ggaW1tZXIgYWxsZXMgZ2xlaWNoIF9zb18gd29lcnRsaWNoLlxuIik7CisgICBBZGREZXRhaWwoImd1ZXRlIiwgIlNlaSBsaWViZXIgdm9yc2ljaHRpZywgc29vIGd1ZXRpZyBiaW4gaWNoIG51IGF1Y2ggbmljaHQgOikuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJsaWNodHF1ZWxsZSIsICJuYWNodHNpY2h0In0pLAorICAgICAiSGllciBpc3QgZXMgZWlnZW50bGljaCB2ZXJkYW1tdCBkdW5rZWwgdW5kIG9obmUgTmFjaHRzaWNodCBvZGVyIGVpbmUgZWlnZW5lXG4iCisgICAgKyJMaWNodHF1ZWxsZSwga29lbm50ZXN0IER1IGhpZXIgX25pY2h0c18gc2Vobi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImF1c2dhbmciLCAib3N0ZW4ifSksCisgICAgICJXZW5uIER1IGRlbSBXZWcgUmljaHR1bmcgT3N0ZW4gZm9sZ3N0LCBkYW5uIGtvbW1zdCBEdSB6aWVtbGljaCBiYWxkIHdpZWRlclxuIgorICAgICsiUmljaHR1bmcgQXVzZ2FuZy5cbiIpOworICAgQWRkRGV0YWlsKCh7InN0dWVjayIsICJ3YWxkIiwgIndlc3RlbiJ9KSwKKyAgICAgIk5hamEuLiBEdSBzdGVoc3QgendhciBzY2hvbiBpbSBXYWxkIGRyaW4sIGFiZXIgbmFjaCBXZXN0ZW4gaGluLCBnZWhzdCBlcyBub2NoXG4iCisgICAgKyJlaW4gU3R1ZWNrIHRpZWZlciBoaW5laW4uXG4iKTsKKyAgIEFkZEV4aXQoIm9zdGVuIiwgUk9PTSgiZWluZ2FuZyIpKTsKKyAgIEFkZEV4aXQoIndlc3RlbiIsIFJPT00oIndlZzIiKSk7CisgICBBZGRJdGVtKE5QQygid2FlY2h0ZXIiKSwgUkVGUkVTSF9SRU1PVkUsIDEpOworfQorCitzdGF0aWMgc3RyaW5nIGRldF93ZWcoKQoreworICAgaWYgKHByZXNlbnQoV0FMRElEKCJ3YWVjaHRlcmVpY2hlIiksIE1FKSkKKyAgICAgIHJldHVybiAiTWl0dGVuIGF1ZiBkZW0gV2VnIHN0ZWh0IGRlciBXYWVjaHRlciBkZXMgV2FsZGVzIHVuZCBrb250cm9sbGllcnQgc2VociBnZW5hdSxcbiIKKyAgICAgICAgICAgICsid2VyIGluIGRlbiBXYWxkIGhpbmVpbiBkYXJmIHVuZCB3ZXIgbmljaHQuIEVpZ2VudGxpY2ggaXN0IGVyIGplZG9jaCBkZW5cbiIKKyAgICAgICAgICAgICsibWVpc3RlbiBpbW1lciBzZWhyIGZyaWVkbGljaCBnZXNvbm5lbi5cbiI7CisgICByZXR1cm4gIkRlciBXZWcgZnVlaHJ0IGhpZXIgbmFjaCBXZXN0ZW4gbm9jaCBlaW4gU3R1ZWNrIHRpZWZlciBpbiBkZW4gV2FsZCBoaW5laW4sXG4iCisgICAgICAgICArIm5hY2ggT3N0ZW4ga2FubnN0IER1IGplZG9jaCB3aWVkZXIgaW4gUmljaHR1bmcgQXVzZ2FuZyBkZXMgWmF1YmVyd2FsZHMgZ2Vobi5cbiI7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmIChwcmVzZW50KFdBTERJRCgid2FlY2h0ZXJlaWNoZSIpLCBNRSkpCisgICAgICByZXR1cm4gIkhpZXIgaXN0IGVzIGpldHp0IHJpY2h0aWcgZHVlc3RlciB1bmQgb2huZSBlaWdlbmUgTGljaHRxdWVsbGUga29lbm50ZXN0IER1XG4iCisgICAgICAgICAgICArIm5pY2h0cyBtZWhyIHNlaG4sIGRhIHNvIGd1dCB3aWUgdWViZXJoYXVwdCBrZWluIExpY2h0IG1laHIgZHVyY2ggZGFzXG4iCisgICAgICAgICAgICArIkJsYWV0dGVyZGFjaCBhdWYgZGVuIFdlZyBzY2hlaW50LiBNaXR0ZW4gaW4gZGllc2VyIGVpZ2VudGxpY2ggbGViZW5zLVxuIgorICAgICAgICAgICAgKyJ1bmZyZXVuZGxpY2hlbiBTemVuZSwgc3RlaHQgZWluZSBncm9zc2UgYWx0ZSBFaWNoZSBtaXR0ZW4gYXVmIGRlbSBXZWcuXG4iOworICAgcmV0dXJuICJIaWVyIGlzdCBlcyBqZXR6dCByaWNodGlnIGR1ZXN0ZXIgdW5kIG9obmUgZWlnZW5lIExpY2h0cXVlbGxlIGtvZW5udGVzdCBEdVxuIgorICAgICAgICAgKyJoaWVyIG5pY2h0cyBtZWhyIHNlaG4sIGRhIHNvIGd1dCB3aWUgdWViZXJoYXVwdCBrZWluIExpY2h0IG1laHIgZHVyY2ggZGFzXG4iCisgICAgICAgICArIkJsYWV0dGVyZGFjaCBhdWYgZGVuIFdlZyBzY2hlaW50LiBEdSBrYW5uc3Qgbm9jaCBlaW4gU3R1ZWNrIHRpZWZlciBpbiBkZW5cbiIKKyAgICAgICAgICsiV2FsZCBoaW5laW4gdW5kIG5hY2ggV2VzdGVuIGdlaG4sIG9kZXIgYWJlciB6dXJ1ZWNrIFJpY2h0dW5nIEtyZXV6dW5nIG5hY2hcbiIKKyAgICAgICAgICsiT3N0ZW4uXG4iOworfQpkaWZmIC0tZ2l0IGEvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMi5jIGIvZG9jL2JlaXNwaWVsZS96YXViZXJ3YWxkL3Jvb20vd2VnMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDYxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmVpc3BpZWxlL3phdWJlcndhbGQvcm9vbS93ZWcyLmMKQEAgLTAsMCArMSw5MyBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCisjaW5jbHVkZSAiLi4vZmlsZXMuaCIKKworaW5oZXJpdCBST09NKCJzdGRyb29tIik7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5ET09SUywgMCk7CisgICBTZXRQcm9wKFBfTElHSFQsIDEpOworICAgU2V0UHJvcChQX0lOVF9TSE9SVCwgIkFtIFJhbmRlIGVpbmVyIExpY2h0dW5nIGltIFphdWJlcndhbGQiKTsKKyAgIEFkZFNwZWNpYWxEZXRhaWwoKHsid2FsZCIsICJ6YXViZXJ3YWxkIn0pLCAiX3F1ZXJ5X2ludF9sb25nIik7CisgICBBZGREZXRhaWwoKHsid2VzdGVuIiwgImxpY2h0dW5nIiwgInBsYWV0emNoZW4iLCAiaWR5bGxpc2NoZXMgcGxhZXR6Y2hlbiJ9KSwKKyAgICAgIkltIFdlc3RlbiBiZWZpbmRldCBzaWNoIGVpbmUgZ3Jvc3NlIExpY2h0dW5nIG1pdCBlaW5lbSBrbGVpbmVuIFR1ZW1wZWwsIGFtXG4iCisgICAgKyJSYW5kZSBkZXIgTGljaHR1bmcgc3RlaGVuIHZlcmVpbnplbHQgbm9jaCBlaW5pZ2UgQmFldW1lIGFiZXIgenVtIFR1ZW1wZWwgaGluLFxuIgorICAgICsid2lyZCBlcyBkYW5uIG1laHIgdW5kIG1laHIgbnVyIG5vY2ggR3JhcyBkYXMgZGVuIEJvZGVuIGJlZGVja3QuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJyYXNlbiIsICJncmFzIn0pLAorICAgICAiQW0gYmVzdGVuIGJldHJpdHRzdCBEdSBkaWUgTGljaHR1bmcgZWluZmFjaCB1bmQgc2NoYXVzdCBEaXIgZGVuIFJhc2VuXG4iCisgICAgKyJuYWVoZXIgYW4uXG4iKTsKKyAgIEFkZERldGFpbCgidHVlbXBlbCIsCisgICAgICJXZW5uIER1IERpciBkZW4gVHVlbXBlbCBuYWVoZXIgYW5zZWhlbiBtb2VjaHRlc3QsIGRhbm4gc29sbHRlc3QgRHUgc2Nob25cbiIKKyAgICArImVpbiBTdHVlY2sgbmFlaGVyIHJhbmdlaGVuLlxuIik7CisgICBBZGREZXRhaWwoKHsic3R1ZWNrIiwgInJhdW0ifSksCisgICAgICJOYSB3ZW5pZ3N0ZW5zIGVpbmVuIFJhdW0gd2VpdGVyIHNvbGx0ZXN0IER1IHNjaG9uIGdlaG4uXG4iKTsKKyAgIEFkZERldGFpbCgic2NoYXR0ZW4iLAorICAgICAiSGllciBiZWZpbmRlc3QgRHUgRGljaCBub2NoIGltIFNjaGF0dGVuIGRlciBCYWV1bWUsIGRpZSBMaWNodHVuZyBpbSBXZXN0ZW5cbiIKKyAgICArImxpZWd0IGplZG9jaCBrb21wbGV0dCBpbiBkZXIgd2Flcm1lbmRlbiBTb25uZS5cbiIpOworICAgQWRkU3BlY2lhbERldGFpbCgic29ubmUiLCAiZGV0X3Nvbm5lIik7CisgICBBZGREZXRhaWwoKHsid2VnZXNyYW5kIiwgImJhZXVtZSIsICJ3ZWdyYW5kIiwgInJhbmQifSksCisgICAgICJBbSBXZWdlc3JhbmQgc3RlaGVuIGVpbmlnZSBCYWV1bWUgZGllIGVpbiBzY2hvZW5lcyBCbGFldHRlcmRhY2ggdWViZXIgZGVuIFdlZ1xuIgorICAgICsic3Bhbm5lbiB1bmQgZGVuIFdlZyBpbiBpaHJlbiBTY2hhdHRlbiBsZWdlbi5cbiIpOworICAgQWRkRGV0YWlsKCh7ImhpbW1lbCIsICJibGFldHRlcmRhY2giLCAiZGFjaCIsICJsaWNodCIsICJzb25uZW5zdHJhaGxlbiIsICJ3b2xrZW4iLCAid29sa2UifSksCisgICAgICJEYXMgQmxhZXR0ZXJkYWNoIGlzdCB6aWVtbGljaCBkaWNodCwgc28gZGFzcyBEdSBuaWNodCBzb28gdmllbCBzZWhlbiBrYW5uc3QsXG4iCisgICAgKyJhYmVyIGVpbmlnZSBTb25uZW5zdHJhaGxlbiBkdXJjaGJyZWNoZW4gZGFzIERhY2ggdW5kIGVycmVpY2hlbiBkZW4gV2VnLlxuIik7CisgICBBZGREZXRhaWwoKHsid2VnIiwgImJvZGVuIiwgImVyZGUiLCAiYXVzZ2FuZyIsICJvc3RlbiIsICJyaWNodHVuZyJ9KSwKKyAgICAgIkltIFdlc3RlbiBmdWVocnQgZGVyIFdlZyB6dSBlaW5lciBncm9zc2VuIExpY2h0dW5nLCB3YWVocmVuZCBlciBuYWNoIE9zdGVuIGhpblxuIgorICAgICsiUmljaHR1bmcgQXVzZ2FuZyBkZXMgWmF1YmVyd2FsZHMgZnVlaHJ0LlxuIik7CisgICBBZGREZXRhaWwoInZvZWdlbCIsICJEdSBrYW5uc3Qgc2llIGRldXRsaWNoIGhvZXJlbiwgYmVrb21tc3QgYWJlciBrZWluZW4genUgc2Vobi5cbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCBST09NKCJ3ZWcxIikpOworICAgQWRkRXhpdCgic3VlZHdlc3RlbiIsIFJPT00oImxpY2h0dW5nc28iKSk7CisgICBBZGRFeGl0KCJ3ZXN0ZW4iLCBST09NKCJsaWNodHVuZ28iKSk7CisgICBBZGRFeGl0KCJub3Jkd2VzdGVuIiwgUk9PTSgibGljaHR1bmdubyIpKTsKKyAgIEFkZENtZCgib3N0ZW4iLCAiY21kX29zdGVuIik7CisgICBBZGRJdGVtKE5QQygibGF1ZmVpY2hlIiksIFJFRlJFU0hfREVTVFJVQ1QpOworfQorCitzdGF0aWMgc3RyaW5nIGRldF9zb25uZSgpCit7CisgICBpZiAoUEwpIFBMLT5TZXRQcm9wKFBfQkxJTkQsIDEpOworICAgcmV0dXJuICJEdSBzY2hhdXN0IGZhc3ppbmllcnQgaW4gZGllIFNvbm5lIHVuZCB1bnRlcnN1Y2h0IHNpZSBuYWVoZXIsIGRvY2ggZGFzIHdhclxuIgorICAgICAgICAgKyJ3b2hsIGVpbiBncm9zc2VyIEZlaGxlciwgZGVubiBwbG9ldHpsaWNoIHdpcmQgZXMgZ2FueiBnYW56IGR1bmtlbCB1bSBEaWNoIHJ1bS5cbiI7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgICAvLyB3ZW5uIG1hbiB2b24gd2VzdGVuIGtvbW10IHVuZCBrZWluZSBibG9ja2VuZGUgRWljaGUgaGllciBpc3QsIGRhbm4KKyAgIC8vIHNvIGJldHJhY2h0ZW4gYWxzIHdhZXJlIG1hbiBhdXMgZGVtIG9zdGVuIGdla29tbWVuCisgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShQTCkgJiYgIXByZXNlbnQoV0FMRElEKCJlaWNoZSIpKSkKKyAgICAgIFBMLT5TZXRQcm9wKEFVU0dBTkcsICJ3ZXN0ZW4iKTsKKyAgIDo6aW5pdCgpOworfQorCitzdGF0aWMgaW50IGNtZF9vc3RlbigpCisvLyB3ZW5uIGdlcmFkZSBlaW5lIEVpY2hlIGhpZXJoaW4gZ2VsYXVmZW4gaXN0LCBrb21tZW4gZmVpbmRsaWNoZQorLy8gU3BpZWxlciBuaWNodCBtZWhyIHZvcmJlaSA6KQoreworICAgaWYgKFBMICYmIFBMLT5RdWVyeVByb3AoQVVTR0FORykhPSJ3ZXN0ZW4iICYmCisgICAgICAgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKT50aW1lKCkgJiYgcHJlc2VudChXQUxESUQoImVpY2hlIiksIE1FKSkgeworICAgICAgaWYgKHByZXNlbnQoV0FMRElEKCJlaWNoZSAyIiksIE1FKSkKKyAgICAgICAgIHdyaXRlKCJEaWUgRWljaGVuIHN0ZWhlbiBEaXIgZGFiZWkgbGVpZGVyIGltIFdlZyB1bmQgbGFzc2VuIERpY2ggbmljaHQgdm9yYmVpLlxuIik7CisgICAgICBlbHNlIHdyaXRlKCJEaWUgRWljaGUgc3RlaHQgRGlyIGRhYmVpIGxlaWRlciBpbSBXZWcgdW5kIGxhZXNzdCBEaWNoIG5pY2h0IHZvcmJlaS5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2ludF9sb25nKCkKK3sKKyAgIGlmICghUEwgfHwgUEwtPlF1ZXJ5UHJvcChaQVVCRVJXQUxEKTw9dGltZSgpKQorICAgICByZXR1cm4KKyAgICAgICJEdSBzdGVoc3QgbnVuIG1pdHRlbiBpbSBaYXViZXJ3YWxkLiBJbSBXZXN0ZW4gZXJzdHJlY2t0IHNpY2ggdm9yIERpciBlaW5lXG4iCisgICAgICsiZ3Jvc3NlIExpY2h0dW5nLCBhdWYgZGllIER1IG11ZWhlbG9zIGdlbGFuZ2VuIGthbm5zdC4gTmFjaCBPc3RlbiBoaW4gZnVlaHJ0XG4iCisgICAgICsiZWluIHNjaG1hbGVyIFdlZyB6dXJ1ZWNrIHp1bSBBdXNnYW5nIGRlcyBXYWxkZXMuIEFsbGVzIHNjaGVpbnQgaGllciBzZWhyXG4iCisgICAgICsiZnJpZWRsaWNoIHp1IHNlaW4sIGRpZSBWb2VnZWwgendpdHNjaGVybiB1bmQgZGFzIEJsYWV0dGVyZGFjaCBpc3QgaGllciBhdWNoXG4iCisgICAgICsibmljaHQgbWVociBzbyBkaWNodCB3aWUgaW0gT3N0ZW4sIHNvIGRhc3MgZWluaWdlIFNvbm5lbnN0cmFobGVuIGRlbiBXZWdcbiIKKyAgICAgKyJlcnJlaWNoZW4uIEVzIHppZWh0IERpY2ggZm9lcm1saWNoIG5hY2ggV2VzdGVuIGF1ZiBkaWUgTGljaHR1bmcsIG1pdHRlbiBhdWZcbiIKKyAgICAgKyJkaWVzZXMgc29ubmlnZSBpZHlsbGlzY2hlIFBsYWV0emNoZW4uXG4iOworICAgcmV0dXJuICJOaWNodHMgd2llIHJhdXMgaGllci4gRXMgd2FyIGdhbnogdW5kIGdhciBrZWluZSBndXRlIElkZWUgaGllciBpbSBXYWxkIERlaW5lclxuIgorICAgICAgICAgKyJBZ2dyZXNzaXZpdGFldCBmcmVpZW4gTGF1ZiB6dSBsYXNzZW4uIER1IGthbm5zdCB2b24gR2x1ZWNrIGhhYmVuLCB3ZW5uIER1IG1pdFxuIgorICAgICAgICAgKyJlaW5lbSBibGF1ZW4gQXVnZSBkYXZvbiBrb21tc3QgdW5kIGRlbiBXYWxkIG5vY2ggbGViZW5kIHZlcmxhc3NlbiBrYW5uc3QuXG4iCisgICAgICAgICArIk5hY2ggV2VzdGVuIGdlbGFuZ3N0IER1IGF1ZiBkaWUgZ3Jvc3NlIExpY2h0dW5nLCByYXRzYW1lciB3YWVyZSBqZWRvY2ggd29obFxuIgorICAgICAgICAgKyJlaGVyIGRlciBXYWxkd2VnIGltIE9zdGVuLCB1ZWJlciBkZW4gRHUgZGVuIFphdWJlcndhbGQgd2llZGVyIHZlcmxhc3NlbiBrYW5uc3QuXG4iOworfQo=