ZGlmZiAtLWdpdCBhL2dpbGRlbi9hYmVudGV1cmVyLmMgYi9naWxkZW4vYWJlbnRldXJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2U3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9naWxkZW4vYWJlbnRldXJlci5jCkBAIC0wLDAgKzEsMzc0IEBACisvLyBJY2ggZmFuZCBlcyBlaW4gd2VuaWcgbGFuZ3dlaWxpZyBpbiBkZXIgR2lsZGUsIGFsc28gaGFiZSBpY2ggZWluIHdlbmlnIGRhcmFuCisvLyBnZWJhc3RlbHQuCisvLyAgSGF0ZS4KKy8vIDIwMDItMTItMDYgTWFuZHJhZ29ucyBQcm9qZWt0YnJldHQgZWluZ2ViYXV0LCBIdW1uaS4KKy8vIDIwMDMtMDctMTEgQnVnZml4CisvLyAyMDA1LTA4LTE5IE1pcmlsIEFya3MgQmllbmVuIGVpbmdlYmF1dAorLy8gMjAwNy0wOC0wMyBaZXNzdHJhLCBQRmFkIGZ1ZXJzIFZlcmVpbnNidWVybyBhbmdlcGFzc3QuCitpbmhlcml0ICAiL3N0ZC9naWxkZW5fcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisjaW5jbHVkZSA8cGxheWVyL2Zhby5oPgorCisjZGVmaW5lIFBfQU5GQUVOR0VSX0JJRU5FTk9SVF8gImFuZmFlbmdlcl9iaWVuZW5vcnRfIgorI2RlZmluZSBQX0FORkFFTkdFUl9CSUVORU5aSUVMXyAiYW5mYWVuZ2VyX2JpZW5lbnppZWxfIgorCitzdHJpbmcgRnVua3Rpb24oKTsgLy8gRnVua3Rpb24gZGVyIEdpbGRlCitzdHJpbmcgU2NobXV0eigpOyAgLy8gV29obCBiYWxkIGVpbiBaYXViZXJ0cmFuaworCitpbnQgX3F1ZXJ5X2xpZ2h0KCkge3JldHVybiAyMDt9CisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSywiYWJfc3BlbGxzIik7CisgIFNldFByb3AoUF9MSUdIVCwyMCk7CisgIFNldFByb3AoUF9JTkRPT1JTLDEpOworICBBZGRTcGVsbCgic3RlaW5zY2hsYWciKTsKKyAgQWRkU3BlbGwoImxpY2h0Iik7CisgIEFkZFNwZWxsKCJrYW1wZnNjaHJlaSIpOworICBBZGRTcGVsbCgiYXVzd2VpY2hlbiIpOworICBBZGRTcGVsbCgic2NoYWV0eiIpOworICBBZGRTcGVsbCgicGZlaWwiKTsKKyAgQWRkU3BlbGwoImlkZW50aWZpemllcmUiKTsKKyAgQWRkU3BlbGwoImZldWVyYmFsbCIpOworICBBZGRTcGVsbCgic2NobmVsbCIpOworICBBZGRTcGVsbCgic2FldXJlc3RyYWhsIik7CisKKyAgU2V0UHJvcChQX0dVSUxEX01BTEVfVElUTEVTLCAoWworICAgICAgIDEgOiAiZGVyIGhvZmZudW5nc3ZvbGxlIEFuZmFlbmdlciIsCisgICAgICAgMiA6ICJkZXIgTGFuZHN0cmVpY2hlciIsCisgICAgICAgMyA6ICJkZXIgU3RyZXVuZXIiLAorICAgICAgIDQgOiAiZGVyIFdhbmRlcmdlc2VsbGUiLAorICAgICAgIDUgOiAiZGVyIFdhbGRsYWV1ZmVyIiwKKyAgICAgICA2IDogImRlciBGYWVocnRlbnN1Y2hlciIsCisgICAgICAgNyA6ICJkZXIgV2VnZWt1bmRpZ2UiLAorICAgICAgIDggOiAiZGVyIEphZWdlciIsCisgICAgICAgOSA6ICJkZXIgS3VuZHNjaGFmdGVyIiwKKyAgICAgIDEwIDogImRlciBSZWlzZW5kZSIsCisgICAgICAxMSA6ICJkZXIgQWJlbnRldXJlciIsCisgICAgICAxMiA6ICJkZXIgV2VsdGVuYnVtbWxlciIsCisgICAgICAxMyA6ICJkZXIgRHJhdWZnYWVuZ2VyIiwKKyAgICAgIDE0IDogImRlciBTY2hhdHpzdWNoZXIiLAorICAgICAgMTUgOiAiZGVyIEZldWVyYmFlbmRpZ2VyIiwKKyAgICAgIDE2IDogImRlciBFbnRkZWNrZXIiLAorICAgICAgMTcgOiAiZGVyIEVyb2JlcmVyIiwKKyAgICAgIDE4IDogImRlciBIZWxkIiwKKyAgICAgIDE5IDogImRlciBhbmdlaGVuZGUgU2VoZXIiLAorICAgICAgMjAgOiAiZGVyIFNlaGVyIiwKKyAgICAgIF0pICk7CisgIFNldFByb3AoUF9HVUlMRF9GRU1BTEVfVElUTEVTLCAoWworICAgICAgIDEgOiAiZGllIGhvZmZudW5nc3ZvbGxlIEFuZmFlbmdlcmluIiwKKyAgICAgICAyIDogImRpZSBMYW5kc3RyZWljaGVyaW4iLAorICAgICAgIDMgOiAiZGllIFN0cmV1bmVyaW4iLAorICAgICAgIDQgOiAiZGllIFdhbmRlcmdlc2VsbGluIiwKKyAgICAgICA1IDogImRpZSBXYWxkbGFldWZlcmluIiwKKyAgICAgICA2IDogImRpZSBGYWVocnRlbnN1Y2hlcmluIiwKKyAgICAgICA3IDogImRpZSBXZWdla3VuZGlnZSIsCisgICAgICAgOCA6ICJkaWUgSmFlZ2VyaW4iLAorICAgICAgIDkgOiAiZGllIEt1bmRzY2hhZnRlcmluIiwKKyAgICAgIDEwIDogImRpZSBSZWlzZW5kZSIsCisgICAgICAxMSA6ICJkaWUgQWJlbnRldXJlcmluIiwKKyAgICAgIDEyIDogImRpZSBXZWx0ZW5idW1tbGVyaW4iLAorICAgICAgMTMgOiAiZGllIERyYXVmZ2FlbmdlcmluIiwKKyAgICAgIDE0IDogImRpZSBTY2hhdHpzdWNoZXJpbiIsCisgICAgICAxNSA6ICJkaWUgRmV1ZXJiYWVuZGlnZXJpbiIsCisgICAgICAxNiA6ICJkaWUgRW50ZGVja2VyaW4iLAorICAgICAgMTcgOiAiZGllIEVyb2JlcmVyaW4iLAorICAgICAgMTggOiAiZGllIEhlbGRpbiIsCisgICAgICAxOSA6ICJkaWUgYW5nZWhlbmRlIFNlaGVyaW4iLAorICAgICAgMjAgOiAiZGllIFNlaGVyaW4iLAorICAgICAgXSkgKTsKKworICBTZXRQcm9wKFBfSU5UX1NIT1JULCJEaWUgYmVydWVobXRlIEFiZW50ZXVyZXJnaWxkZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsCisgIkRlciBncm9zc2UgUmF1bSBtaXQgc2VpbmVyIG5pZWRyaWdlbiBEZWNrZSB1bmQgZGVuIGdyb2IgZ2VzY2huaXR0ZW5lblxuIgorKyJRdWVyYmFsa2VuIGhhdCBQbGF0eiBmdWVyIHNlaHIgdmllbGUgUGVyc29uZW4uIEtuYXJyZW5kZSBEaWVsZW4gZXJ6YWVobGVuXG4iCisrInVlYmVyIEhlbGRlbnRhdGVuIGxhZW5nc3QgdmVyZ2Vzc2VuZXIgQWJlbnRldXJlciwgYmVydWVobXRlciBhbHMgbWFuY2hlclxuIgorKyJXZWlzZSB1bnNlcmVyIFplaXQuXG4iCisrIkFiZW50ZXVyZXIsIGFiZXIgYXVjaCBhbmRlcmUgQmV3b2huZXIgZGllc2VyIFdlbHQga29tbWVuIGhpZXJoZXIsIHVtXG4iCisrInNpY2ggenUgaW5mb3JtaWVyZW4sIGlocmUgRXJmYWhydW5nZW4gYXVzenV0YXVzY2hlbiBvZGVyIHNpY2ggaW4gZGVuXG4iCisrInZlcnNjaGllZGVuc3RlbiBXaXNzZW5zY2hhZnRlbiB6dSB2ZXJiZXNzZXJuLlxuIgorKyJEdXJjaCBkaWUgaW1tZXIgb2ZmZW5lIFR1ZXIgc2NoZWludCBkaWUgYXVmZ2VoZW5kZSBTb25uZSBoZXJlaW4gdW5kIGZ1ZWxsdFxuIgorKyJkZW4gUmF1bSBtaXQgaWhyZW0gZ29sZGVuZW4gTGljaHQuIFNvbnN0IGdpYnQgZXMgaGllciBudXIgbm9jaCBkZW4gQXVzZ2FuZ1xuIgorKyJpbSBOb3JkZW4sIHdlbGNoZXIgYXVmIGRpZSBIYWZlbnN0cmFzc2UgZnVlaHJ0IHVuZCBCaWxkZXIgYW4gZGVuIFdhZW5kZW4sXG4iCisrIm1pdCBaZWljaG51bmdlbiB1bmQgR2VtYWVsZGVuIHZvbSBNb3JnZW5HcmF1ZW4uIEVpbnMgZGVyIEJpbGRlciBlcmxhZXV0ZXJ0XG4iCisrImRpZSBGdW5rdGlvbiBkZXIgR2lsZGUgdW5kIGVpbmUgZ3Jvc3NlIFVociBhbiBkZXIgV2FuZCB6ZWlndCwgd2FzIGRpZVxuIgorLy8rIlN0dW5kZSBzY2hsYWVndC4gSW4gZWluZXIgRWNrZSBzdGVodCBlaW4ga2xlaW5lcyBQcm9qZWt0YnJldHQuXG4iCisrIlN0dW5kZSBzY2hsYWVndC5cbiIKKysiTmFjaCBvYmVuIGZ1ZWhydCBlaW5lIFRyZXBwZSBpbiBkYXMgQnVlcm8gZGVzIEZvZXJkZXJ2ZXJlaW5zIFByb2pla3RcbiIKKysiTW9yZ2VuR3JhdWVuIGUuVi4sIGRhcyBEdSB1bmJlZGluZ3QgYmVzdWNoZW4gc29sbHRlc3QuXG4iKTsKKworICBBZGREZXRhaWwoKHsicmF1bSIsICJnaWxkZSIsICJhYmVudGV1cmVyZ2lsZGUiLCAiaGF1cyIsICJnaWxkZW5oYXVzIiwKKyAgICAgICAgICAgICAgImdpbGRlaGF1cyJ9KSwKKyAgIkR1IHN0ZWhzdCBtaXR0ZW4gaW4gZGVyIEFiZW50ZXVyZXJnaWxkZS4gSGllciB0cmlmZnQgbWFuIHNpY2ggdW5kIGthbm5cbiIKKyArImF1Y2ggc2VpbmUgcGVyc29lbmxpY2hlbiBXZXJ0ZSB2ZXJiZXNzZXJuLlxuIik7CisgIEFkZERldGFpbCgoeyJ0dWVyIiwgImF1c2dhbmcifSksCisgICJEZXIgaW1tZXIgb2ZmZW5zdGVoZW5kZSBBdXNnYW5nIGZ1ZWhydCBoaW5hdXMgYXVmIGRpZSBIYWZlbnN0cmFzc2UuXG4iCisgKyJHb2xkZW5lcyBMaWNodCBlaW5lciBld2lnIGF1ZmdlaGVuZGVuIFNvbm5lIHNjaGVpbnQgaGVyZWluLlxuIik7CisgIEFkZFNwZWNpYWxEZXRhaWwoKHsiYmlsZCIsICJiaWxkZXIiLCAiemVpY2hudW5nZW4iLCAiZ2VtYWVsZGUiLCAia2FydGVuIiwKKyAgICAgICAgICAgICAgImxhbmRzY2hhZnRzYmlsZGVyIn0pLCJkZXRfYmlsZCIpOworICBBZGREZXRhaWwoKHsiZnVua3Rpb24iLCAic2NoaWxkIn0pLCAjJ0Z1bmt0aW9uKTsKKyAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLAorICAiQXVzIGZlaW4gc2FldWJlcmxpY2ggZ2VzY2hsYWdlbmVuIFN0ZWluZW4gc2luZCBkaWUgV2FlbmRlIGRlciBHaWxkZVxuIisKKyAienVzYW1tZW5nZXNldHp0LiBWaWVsZSBpbnRlcmVzc2FudGUgQmlsZGVyIGhhZW5nZW4gZGFyYW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7InN0ZWluIiwgInN0ZWluZSJ9KSwgIkVzIHNpbmQgZ2FueiBlaW5mYWNoZSBTYW5kc3RlaW5lLlxuIik7CisgIEFkZERldGFpbCgoeyJmZW5zdGVyIn0pLAorICAiRWluZSB3dW5kZXJ2b2xsZSBXZWx0IGVyb2VmZm5ldCBzaWNoIERpciwgZ2VuYW5udCBSZWFsaXRhZXQuIEFiZXIgZ2lidCBlc1xuIgorICsiZGllc2Ugd2lya2xpY2g/IElzdCBzaWUgbmljaHQgdm9sbGVyIEdlZmFocmVuIHVuZCBTdHJlc3M/XG4iKTsKKyAgQWRkRGV0YWlsKCh7InNlaXRlIiwgInN1ZWRzZWl0ZSJ9KSwKKyAgIkFtIFN1ZWRlbmRlIGRlcyBSYXVtZXMgaXN0IGVpbiBlaWdlbmFydGlnZXMgRmVuc3RlciBhdXN6dW1hY2hlbi5cbiIpOworICBBZGREZXRhaWwoKHsiYmFsa2VuIiwgInF1ZXJiYWxrZW4iLCAiaG9semJhbGtlbiIsICJkZWNrZW5iYWxrZW4ifSksCisgICJEaWVzZSBCYWxrZW4gaGFsdGVuIGRhcyBPYmVyZ2VzY2hvc3MgZGVzIEdpbGRlbmhhdXNlcywgd29oaW4gbnVyIE1hZ2llclxuIgorICsia29tbWVuIHVuZCBzaW5kIGFuIG1hbmNoZW4gU3RlbGxlbiBnYW56IHNjaG9lbiBkdXJjaGdlYm9nZW4uIERhcyBncm9iIGdlLVxuIgorICsic2Nobml0dGVuZSBIb2x6IGlzdCB0ZWlsd2Vpc2Ugdm9uIFNjaHdlcnRzdHJlaWNoZW4gemVybmFyYnQuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImhhZmVuIiwgImhhZmVuc3RyYXNzZSIsICJzdHJhc3NlIn0pLAorICAiWnVyIFR1ZXIgaGluYXVzIGdlbGFuZ3QgbWFuIHVlYmVyIGRpZSBIYWZlbnN0cmFzc2UgenVtIEhhZmVuIHZvbiBQb3J0IFZhaW4iCisgKyJcbiIpOworICBBZGREZXRhaWwoKHsiYm9kZW4iLCAiZnVzc2JvZGVuIiwgImRpZWxlbiJ9KSwKKyAgIkRpZSBrbmFycmVuZGVuIERpZWxlbiBkZXIgR2lsZGUgc2luZCBzY2hvbiBhbHQgdW5kIGFiZ2VzY2hhYnQuIEluIGRlblxuIgorICsiUml0emVuIHp3aXNjaGVuIGlobmVuIGlzdCB2aWVsIERyZWNrIHZvbiBkZW4gU3RpZWZlbG4gZGVyIEFiZW50ZXVyZXIuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImRlY2tlIn0pLAorICAiRGllIERlY2tlIGRlcyBSYXVtZXMgd2lyZCB2b24gSG9semJhbGtlbiBnZWhhbHRlbi5cbiIpOworICBBZGREZXRhaWwoKHsibGljaHQiLCAic29ubmVubGljaHQiLCAic29ubmUifSksCisgICJXYXJtZXMgU29ubmVubGljaHQgc2NoZWludCBkdXJjaCBkZW4gQXVzZ2FuZyB6dXIgU3RyYXNzZSBoZXJlaW4uIEplZGVzbWFsXG4iCisgKyJ3ZW5uIGplbWFuZCBoZXJlaW5rb21tdCB3aXJkIGVyIHZvbSBMaWNodCB1bXNwdWVsdCB1bmQgZXJzY2hlaW50IEdvdHQtXG4iCisgKyJnbGVpY2ggbWl0IGRpZXNlciBBdXJhLlxuIik7CisgIEFkZERldGFpbCgoeyJlYmVuZSJ9KSwKKyAgIkR1IGJldHJhY2h0ZXN0IGRhcyBCaWxkIGRlciBFYmVuZSB1bmQgZGVua3N0LCB3ZWxjaGUgU2NoYWV0emUgaW4gZGllc2VyXG4iCisgKyJmbGFjaGVuLCBncnVlbmVuIExhbmRzY2hhZnQgdmVyYm9yZ2VuIHNlaW4gbXVlc3Nlbi5cbiIpOworICBBZGREZXRhaWwoKHsiZ2ViaXJnZSIsICJodWVnZWwiLCAiYmVyZ2UiLCAiYmVyZyJ9KSwKKyAgIkRhcyBCaWxkIGRlciBIdWVnZWwgdW5kIEJlcmdlIGJldHJhY2h0ZW5kLCBzY2hsZWljaHQgc2ljaCBlaW4gd2VuaWcgU2Vobi1cbiIKKyArInN1Y2h0IG5hY2ggZGllc2VyIGhlcnJsaWNoZW4sIGFiZXIgZ2VmYWVocmxpY2hlbiBMYW5kc2NoYWZ0IGVpbi5cbiIpOworICBBZGREZXRhaWwoKHsicGVyc3Bla3RpdmVuIiwgInBlcnNwZWt0aXZlIiwgImRhcnN0ZWxsdW5nIiwgImxhbmRzY2hhZnQifSksCisgICJNYW5jaGUgZGVyIExhbmRzY2hhZnRzYmlsZGVyIHNpbmQgYXVzIGRlciBWb2dlbHBlcnNwZWt0aXZlIG9kZXIgdm9uXG4iCisgKyJob2hlbiBCZXJnZW4gYXVzIG9kZXIgdm9uIFp3ZXJnZW4gZ2VtYWx0IHdvcmRlbi5cbiIpOworICBBZGREZXRhaWwoKHsic2VlIiwgIm1lZXIiLCAid2VsbGVuIn0pLAorICAiRGllIFdlbGxlbiBhdWYgZGVtIE1lZXIgZ2xpdHplcm4gd2llIHRhdXNlbmQgRWRlbHN0ZWluZS5cbiIpOworICBBZGREZXRhaWwoKHsic3ByaXR6ZXIiLCAibGljaHRzcHJpdHplciJ9KSwKKyAgIldpZSB0YXVzZW5kIGtsZWluZSBFZGVsc3RlaW5lIHZlcnRlaWxlbiBzaWNoIGRpZXNlIHdpbnppZ2VuLCBnbHVlaGVuZGVuXG4iCisgKyJMaWNodHNwcml0emVyIHVlYmVyIGRhcyB3dW5kZXJ2b2xsZSBHZW1hZWxkZVxuIik7CisgIEFkZERldGFpbCgoeyJnZXNjaG9zcyIsICJvYmVyZ2VzY2hvc3MifSksCisgICJJbnMgb2JlcmUgR2VzY2hvc3MgZGVyIEdpbGRlIGtvbW1lbiBudXIgTWFnaWVyLCBtaXR0ZWxzIGVpbmVzIGJlc29uZGVyZW5cbiIKKyArIlphdWJlcnNwcnVjaHMsIGRlciBkaWUgRGVja2UgZHVyY2hsYWVzc2lnIGZ1ZXIgc2llIG1hY2h0LlxuIik7CisgIEFkZERldGFpbCgoeyJyaXR6ZW4iLCAiZnVnZW4ifSksCisgICJJbiBkZW4gRnVnZW4gendpc2NoZW4gZGVuIERpZWxlbiBiZWZpbmRldCBzaWNoIGVpbmUgTWVuZ2UgU2NobXV0eiB1bmRcbiIKKyArIkRyZWNrIHZvbiBkZW4gQmVzdWNoZXJuIGRlciBHaWxkZS5cbiIpOworICBBZGREZXRhaWwoKHsiZnVnZW4iLCAiZHJlY2siLCAic2NobXV0eiJ9KSwgIydTY2htdXR6KTsKKyAgQWRkRGV0YWlsKCh7ImhvbHoifSksICJEaWUgRGllbGVuIHVuZCBkaWUgRGVja2VuYmFsa2VuIHNpbmQgYXVzIEhvbHouXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImthcnRvZ3JhcGgiLCAia2FydG9ncmFwaGVuIn0pLAorICAiRGllc2VsYmVuIGxhdWZlbiBoaWVyIHp3YXIgaW0gTW9tZW50IG5pY2h0IGhlcnVtLCBhYmVyIGlocmUgS2FydGVuIHNlaGVuXG4iCisgKyJ6aWVtbGljaCB2ZXJ3aXJyZW5kIGF1cyBtaXQgZGVuIGdhbnplbiBMaW5pZW4sIHdlbGNoZSBkaWVzZSBXZWx0ICIKKyAgImRhcnN0ZWxsZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7InN0ZWxsZW4iLCAic3RlbGxlIn0pLAorICAiTmljaHRzIHNpZWh0IGF1cyB3aWUgZGFzIGFuZGVyZSwgdW5kIGRpZSBFY2tlbiBzaW5kIGRhIGtlaW5lIEF1c25haG1lbi5cbiIpOworICBBZGREZXRhaWwoKHsiZWNrZW4iLCJlY2tlIn0pLAorICAiSW4gZWluZXIgZGVyIEVja2VuLCBnbGVpY2ggbmViZW4gZGVyIFRyZXBwZSwgc3RlaHQgZWluIGtsZWluZXMgYnJhdW5lc1xuIgorICsiSG9semJyZXR0LCBkYXMgc29mb3J0IERlaW5lIEF1Zm1lcmtzYW1rZWl0IGVycmVndC4gV296dSBlcyB3b2hsIGRpZW50P1xuIik7CisgIEFkZERldGFpbCgiYXVmbWVya3NhbWtlaXQiLAorICAiRHUgYmVzY2hsaWVzc3QsIERpciBkYXMgQnJldHQgc29mb3J0IG5hZWhlciB6dSBiZXRyYWNodGVuLCB1bSBzaWUgenVcbiIKKyAgICAgICsiYmVmcmllZGlnZW4uXG4iKTsKKy8qCisgIEFkZERldGFpbCgoeyJicmV0dCIsImhvbHpicmV0dCJ9KSwKKyAgIkVpbiB1bnNjaGVpbmJhcmVzIGtsZWluZXMgQnJldHQgc3RlaHQgaW4gZGVyIEVja2UgZGVzIFJhdW1lcy4gV2VubiBtYW5cbiIKKyArImJlZGVua3QsIHdpZSB2aWVsZSBrbGVpbmUgWmV0dGVsIGRhcmFuIGJlZmVzdGlndCB3dXJkZW4sIGthbm4gZXMgc2ljaFxuIgorICsibnVyIHVtIGVpbiBzY2h3YXJ6ZXMgQnJldHQgaGFuZGVsbi4gV2VsY2hlIEluZm9ybWF0aW9uZW4gaGllciB3b2hsXG4iCisgKyJhdXNnZXRhdXNjaHQgd2VyZGVuPyBEdSBrb2VubnRlc3QgbmF0dWVybGljaCBhbmZhbmdlbiwgZGllIFpldHRlbCB6dVxuIgorICsibGVzZW4sIHVtIGRhcyBoZXJhdXN6dWZpbmRlbiAuLi5cbiIpOworICBBZGREZXRhaWwoInpldHRlbCIsCisgICJWaWVsZSB2ZXJzY2hpZWRlbmUgWmV0dGVsIHN0ZWNrZW4gYW4gZGVtIEJyZXR0LiBSb3RlLCBnZWxiZSwgYmxhdWUsXG4iCisgKyJqZWRlciBzY2hlaW50IGVpbmUgYW5kZXJlIEZhcmJlIHp1IGhhYmVuLiBBdWYgamVkZW0gdm9uIGlobmVuIHNjaGVpbnRcbiIKKyArImV0d2FzIGdlc2NocmllYmVuIHp1IHNlaW4uXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImZhcmJlIiwiZmFyYmVuIn0pLAorICAiRXMgc2luZCBzbyB2aWVsZSwgRHUgd3VlcmRlc3QgYmVzdGltbXQgamFocmVsYW5nIHphZWhsZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJpbmZvcm1hdGlvbmVuIiwKKyAgIldlbm4gRHUgZGllIFpldHRlbCBsaWVzdCwgZmluZGVzdCBEdSBiZXN0aW1tdCB3ZWxjaGUuIik7CisqLworICBBZGREZXRhaWwoKHsid2lzc2Vuc2NoYWZ0ZW4iLCAiZWlnZW5zY2hhZnRlbiJ9KSwgIydGdW5rdGlvbik7IC8vJyk7CisgIEFkZERldGFpbCgoeyJuYXJiZW4iLCAic2Nod2VydHN0cmVpY2gifSksCisgICJEaWUgTmFyYmVuIGluIGRlbiBIb2x6YmFsa2VuIHNpbmQgc2Nob24gcmVjaHQgYWx0LiBFcyBpc3QgbGFuZ2UgaGVyLCBkYXNzXG4iCisgICArImhpZXIgcmljaHRpZyBnZWthZW1wZnQgd3VyZGUuXG4iKTsKKyAgQWRkRGV0YWlsKCh7ImF1cmEifSksCisgIkVpbmUgQXVyYSB2b24gTGljaHQgdW1naWJ0IGplZGVuLCBkZXIgdm9uIGRlciBTdHJhc3NlIGlucyBIYXVzIGtvbW10LlxuIik7CisgIEFkZERldGFpbCgoeyJiZXdvaG5lciIsICJhYmVudGV1cmVyIn0pLAorICJIaWVyLCBpbSBHaWxkZW5oYXVzLCBpc3QgamVkZXIgZ2VybiB3aWxsa29tbWVuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3ZWlzZSIsICJ3ZWlzZXIiLCAicmVja2VuIn0pLAorICAiRGllIFdlaXNlbiBkaWVzZXMgTGFuZGVzIHNpbmQgYmVydWVobXQsIGtvbW1lbiBhYmVyIG5pY2h0IGFuIGRpZSBCZS1cbiIKKyAgKyJydWVobXRoZWl0IGlocmVyIFZvcmZhaHJlbiwgZGllIGdyb3NzZW4gUmVja2VuIGRlciBlcnN0ZW4gSmFocmUsIGhlcmFuLlxuIik7CisgIEFkZERldGFpbCgoeyJyZWFsaXRhZXQifSksICJXYXMgaXN0IHNjaG9uIHJlYWw/XG4iKTsKKyAgQWRkU3BlY2lhbERldGFpbCgidWhyIiwiemVpZ2VfcmVib290Iik7CisKKworICBBZGREZXRhaWwoKHsiYnVlcm8iLCJmb2VyZGVydmVyZWluIn0pLAorICAgICJXaWNodGlnZSBJbmZvcm1hdGlvbmVuIHdhcnRlbiBhdWYgRGljaCBpbSBCdWVybyBkZXMgRm9lcmRlcnZlcmVpbnMhXG4iKTsKKyAgQWRkRGV0YWlsKCJpbmZvcm1hdGlvbmVuIiwgIkR1IG11c3N0IHNjaG9uIGlucyBCdWVybyBnZWhlbiwgd2VubiBEdSAiCisgICAgICAiZGllIEluZm9ybWF0aW9uZW4gZXJoYWx0ZW4gd2lsbHN0LlxuIik7CisgIEFkZERldGFpbCgidHJlcHBlIiwiRGllIFRyZXBwZSBmdWVocnQgbmFjaCBPYmVuIGluIGRhcyBCdWVybyBkZXMgIgorICAgICAgIkZvZXJkZXJ2ZXJlaW5zIFByb2pla3QgTW9yZ2VuR3JhdWVuIGUuVi5cbiIpOworICBBZGRFeGl0KCJub3JkZW4iLCAiL2QvZWJlbmUvcm9vbS9Qb3J0VmFpbi9wb19oYWYxIik7CisgIEFkZEV4aXQoIm9iZW4iLCIvcC92ZXJlaW4vcm9vbS9idWVybyIpOworCisgIEFkZENtZCgiZ2VoZXxnZWgmXG5nZWh0bmljaHQiLDAsIlVtIERpY2ggaGllciBmb3J0enViZXdlZ2VuLCAiCisgICAgICAic29sbHRlc3QgRHUgZGlyZWt0IGRhcyBLb21tYW5kbyBkZXIgUmljaHR1bmcgZWluZ2ViZW4sIgorICAgICAgIiB3aWUgLCxub3JkZW4nJyBvZGVyICwsc3VlZHdlc3RlbicnLiBEdSBrYW5uc3QgZGFzIGF1Y2ggIgorICAgICAgImFia3VlcnplbiwgZHVyY2ggLCxuJycgb2RlciAsLHN3JycuIik7CisKKyAgQWRkSXRlbSgiL29iai96ZWl0dW5nc2F1dG9tYXQiLCBSRUZSRVNIX1JFTU9WRSk7CisKKyAgQWRkU3BlY2lhbERldGFpbCgia2FydGUiLCJrYXJ0ZSIpOworICBBZGRTcGVjaWFsRGV0YWlsKCJicmV0dCIsImJyZXR0X2Z1biIpOworCisgIEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX0FEVkFOQ0UsICJoYW5kbGVfYWR2YW5jZSIsIHRoaXNfb2JqZWN0KCkpOworCisgIC8vIG51ciBhdWYgZGVtIE11ZHJlY2huZXIgbGFkZW4gKFN0aWNod29ydDogb2VmZmVudGxpY2ggTXVkbGliKQorI2lmIE1VREhPU1QgPT0gX19IT1NUX05BTUVfXworICBBZGRJdGVtKCIvcC9zZXJ2aWNlL3Ryb3kvb2JqL2J1Y2hhdXRvbWF0IiwgUkVGUkVTSF9SRU1PVkUpOworLy8gIEFkZEl0ZW0oIi9wL3NlcnZpY2UvbWFuZHJhZ29uL3Byb2pla3RicmV0dC9ib2FyZCIsIFJFRlJFU0hfUkVNT1ZFKTsKKyAgLy8gRGllIEJpZW5lIGZ1ZXIgZGVuIFRyYW5zcG9ydCB6dXIgV29ubmV3aWNodGxpY2h0dW5nLgorICAvLyBBcmssIDE5LjA4LjA1CisgIEFkZEl0ZW0oIi9kL2FuZmFlbmdlci9hcmsvbW9uL21hbnRpc2JpZW5lIixSRUZSRVNIX0RFU1RSVUNULAorICAgKFtQX0FORkFFTkdFUl9CSUVORU5PUlRfOiJNZW5zY2giLAorICAgICBQX0FORkFFTkdFUl9CSUVORU5aSUVMXzooeyIvZC9hbmZhZW5nZXIvYXJrL3Jvb21zL3dhbGQxNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInp1bSBXYWxkIGRlciBXb25uZXdpY2h0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9naWxkZW4vYWJlbnRldXJlciJ9KV0pKTsKKyNlbmRpZgorfQorCitzdHJpbmcgZGV0X2JpbGQoKQoreworICByZXR1cm4KKyAgICJEaWUgWmVpY2hudW5nIHVuZCBHZW1hZWxkZSBzdGVsbGVuIE1vcmdlbkdyYXVlbiBhdXMgZGVuIHZlcnNjaGllZGVuc3RlblxuIgorICAgIlBlcnNwZWt0aXZlbiBkYXIuIEVpbmlnZSBkYXZvbiB6ZWlnZW4gYWJzdHJha3RlIERhcnN0ZWxsdW5nZW4sIHdpZSBzaWVcbiIKKyAgICJnZXJuZSB2b24gS2FydG9ncmFwaGVuIGdlbWFjaHQgd2VyZGVuLCB1bmQgYW5kZXJlIHplaWdlbiB3dW5kZXJzY2hvZW5lXG4iCisgICAiRGFyc3RlbGx1bmdlbiB2b24gTGFuZHNjaGFmdGVuLCB3aWUgZGVtIEdlYmlyZ2Ugb2RlciBkZXIgRWJlbmUuIEJlc29uZGVyc1xuIgorICAgInNjaG9lbiBpc3QgZWluIEJpbGQgZGVyIFNlZS4gVGF1c2VuZGUgdm9uIExpY2h0c3ByaXR6ZXJuIHZlcnRlaWxlbiBzaWNoXG4iCisgICAidWViZXIgZGllIFdlbGxlbi5cbiIKKyAgICJFaW4ga2xlaW5lcyBTY2hpbGQgemVpZ3QgZm9sZ2VuZGVzOlxuIitGdW5rdGlvbigpOworfQorCitzdHJpbmcgYnJldHRfZnVuKCkKK3sKKyAgaWYgKHByZXNlbnQoInBhcnR5XG5icmV0dCIsdGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuICJXZWxjaGVzIEJyZXR0IG1laW5zdCBEdSBkZW5uPyBEYXMgUGFydHlicmV0dCBvZGVyIGRhcyBIb2x6YnJldHQ/XG4iOworICByZXR1cm4gR2V0RGV0YWlsKCJob2x6YnJldHQiKTsKK30KKworaW50IGJlaXRyZXRlbigpCit7CisgIGlmICg6OmJlaXRyZXRlbigpPDEpCisgICAgcmV0dXJuIDE7IC8vIE1lbGR1bmcgdm9tIEdpbGRlbm1hc3RlciBvZGVyIEdpbGRlbm9iamVrdAorICB3cml0ZSgiRHUgYmlzdCBqZXR6dCBlaW4gQWJlbnRldXJlci5cbiIpOworICBhZGp1c3RfdGl0bGUoUEwpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgYXVzdHJldGVuKGludCBsb3NzKQoreworICBpZiAoOjphdXN0cmV0ZW4oKTwxKQorICAgIHJldHVybiAxOyAvLyBNZWxkdW5nIGtvbW10IHZvbSBHaWxkZW5tYXN0ZXIKKyAgd3JpdGUoIkR1IGJpc3QgbnVuIGtlaW4gQWJlbnRldXJlciBtZWhyLlxuIik7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgRnVua3Rpb24oKQoreyAgIHN0cmluZyByZTsKKyAgcmUgPSAoIk1vZWdsaWNoZSBCZWZlaGxlIHNpbmQ6XG4iCisgICAgICAgICsiICAgICAgICAgICAgICAgIGxpc3RlXG4iCisgICAgICAgICsiICAgICAgICAgICAgICAgIGVyaG9laGUgKHN0dWZlKVxuIgorICAgICAgICArIiAgICAgICAgICAgICAgICBrb3N0ZW5cbiIKKyAgICAgICAgKyIgICAgICAgICAgICAgICAgbGVybmVcbiIpOworICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR1VJTEQpIT0iYWJlbnRldXJlciIpCisgIHJlICs9ICgiICAgICAgICAgICAgICAgIHRyZXRlIGluIGdpbGRlIGVpblxuIisKKyAgICAgICAgICIgICAgICAgICAgICAgICAgdHJldGUgYXVzIGdpbGRlIGF1c1xuIik7CisgIHJldHVybiByZTsKK30KKworc3RyaW5nIFNjaG11dHooKQoreworICAvLyBoaWVyIHNvbGx0ZSBzaWNoIGRvY2ggZ2xhdHQgZWluIFphdWJlcnRyYW5rIGxvaG5lbiEhCisgIHJldHVybiAiSW4gZGVuIEZ1Z2VuIGJlZmluZGV0IHNpY2ggdmllbCBTY2htdXR6LlxuIjsKK30KKworLy8gRnVlciBTcGllbGVyc3R1ZmVuYXVmc3RpZWdlIGdlcnVmZW4gLSBlZ2FsIGluIHdlbGNoZXIgR2lsZGUuCitwdWJsaWMgdm9pZCBoYW5kbGVfYWR2YW5jZShzdHJpbmcgZWlkLCBvYmplY3QgdHJpZ29iLCBtaXhlZCBkYXRhKSB7CisKKyAgb2JqZWN0IHBsID0gZGF0YVtFX09CSkVDVF07CisgIGlmICghcGwgfHwgIUlzR3VpbGRNZW1iZXIocGwpIHx8ICFpbnRlcmFjdGl2ZShwbCkpCisgICAgcmV0dXJuOworCisgIGludCBsdmw9cGwtPlF1ZXJ5UHJvcChQX0xFVkVMKTsKKyAgLy8gbmljaHQgZnVlciBMZXZlbCAxLCBkYSBpc3QgZ2VudWcgc2Nyb2xsLi4uCisgIGlmIChsdmwgPT0gMSkgcmV0dXJuOworCisgIC8vIEFsbGUgU3BlbGxzIHJhdXNzdWNoZW4sIGRpZSBkZXIgU3BpZWxlciBsZXJuZW4ga2Fubi4KKyAgc3RyaW5nICpzcGVsbHM9ZmlsdGVyKG1faW5kaWNlcyhRdWVyeShQX0dVSUxEX1NLSUxMUyxGX1ZBTFVFKSksIAorICAgICAgZnVuY3Rpb24gaW50IChzdHJpbmcgc3ApCisgICAgICB7CisgICAgICAgIG1hcHBpbmcgc2tpID0gUXVlcnlTcGVsbChzcCk7CisgICAgICAgIGlmICghc2tpKSByZXR1cm4gMDsgLy8ga2VpbiBTcGVsbAorICAgICAgICBpZiAocGwtPlF1ZXJ5U2tpbGxBYmlsaXR5KHNwKSA+IDAKKyAgICAgICAgICAgIHx8IGNoZWNrX3Jlc3RyaWN0aW9ucyhwbCwgc2tpW1NJX1NLSUxMUkVTVFJfTEVBUk5dKSkKKyAgICAgICAgICByZXR1cm4gMDsgLy8gVm9ycmF1c3NldHp1bmdlbiBuaWNodCBlcmZ1ZWxsdCBvZGVyIHNjaG9uIGdlbGVybnQuCisgICAgICAgIHJldHVybiAxOyAvLyBvZmZlbmJhciBpc3Qgc3AgbGVybmJhci4KKyAgICAgIH0KKyAgICAgICk7CisKKyAgaW50IGNvdW50PXNpemVvZihzcGVsbHMpOworICBpZiAoIWNvdW50KQorICAgIHJldHVybjsKKyAgCisgIGlmIChjb3VudCA9PSAxKSB7CisgICAgdGVsbF9vYmplY3QocGwsIGJyZWFrX3N0cmluZygiRGlyIGZhZWxsdCBhdWYgZWlubWFsIGF1ZiwgZGFzcyBEdSAiCisgICAgICAgInZlcnN1Y2hlbiBrb2VubnRlc3QsIGRlbiBaYXViZXJzcHJ1Y2ggXCIiICsgc3BlbGxzWzBdIAorICAgICAgICsgIlwiIGluIGRlciBBYmVudGV1cmVyZ2lsZGUgenUgZXJsZXJuZW4uIiw3OCkpOworICB9CisgIGVsc2UgeworICAgICB0ZWxsX29iamVjdChwbCwgYnJlYWtfc3RyaW5nKCJEaXIgZmFlbGx0IGF1ZiBlaW5tYWwgYXVmLCBkYXNzIER1ICIKKyAgICAgICAidmVyc3VjaGVuIGtvZW5udGVzdCwgZGllIGZvbGdlbmRlbiBaYXViZXJzcHJ1ZWNoZSBpbiBkZXIgIgorICAgICAgICJBYmVudGV1cmVyZ2lsZGUgenUgZXJsZXJuZW46Iiw3OCkpOworICAgICB0ZWxsX29iamVjdChwbCwgQ291bnRVcChzcGVsbHMpICsgIlxuIik7CisgIH0KK30KKworLy8gd2lyZCBhdXMgU3BpZWxlcm9iamVrdCwgL3N0ZC9naWxkZS5jIHVuZCBHaWxkZW5tYXN0ZXIgZ2VydWZlbiAobWluZGVzdGVucykKKy8vIGFrdHVhbGlzaWVydCBkZW4gR2lsZGVubGV2ZWwgYXVmIGRlbiBTcGllbGVybGV2ZWwgdW5kIHNldHp0IGRlbiBwZXIKKy8vIGdldF9uZXdfdGl0bGUoKSBhdXMgZGVuIEdpbGRlbnRpdGVsbiBlcm1pdHRlbHRlbiBHaWxkZW50aXRlbC4KK3ZvaWQgYWRqdXN0X3RpdGxlKG9iamVjdCBwbCkgeworICBpbnQgbHY7CisKKyAgLy8gYmVpIFBfTEVWRUwgPCAwIGlzdCBkZXIgU3BpZWxlciBub2NoICJuaWNodCBmZXJ0aWciLgorICAvLyBEZXIgVGl0ZWwgd2lyZCBhbnNjaGxpZXNzZW5kIG5vY2gga29ycmVrdCBnZXNldHp0LgorICBpZiAoIXBsIHx8ICFJc0d1aWxkTWVtYmVyKHBsKSB8fCAobHY9cGwtPlF1ZXJ5UHJvcChQX0xFVkVMKSkgPCAwKQorICAgIHJldHVybjsKKworICBwbC0+U2V0UHJvcChQX0dVSUxEX0xFVkVMLGx2KTsKKyAgaWYgKCFsdikgbHY9MTsKKyAgcGwtPlNldFByb3AoUF9HVUlMRF9USVRMRSwgZ2V0X25ld190aXRsZShsdixwbCkpOworICAvLyBTcGllbGVydGl0ZWwgbnVsbGVuLCBkYW1pdCBkZXIgR2lsZGVudGl0ZWwgYW5nZXplaWd0IHdpcmQuCisgIGlmICghSVNfU0VFUihwbCkgJiYgIUZBT19IQVNfVElUTEVfR0lGVChwbCkpCisgICAgcGwtPlNldFByb3AoUF9USVRMRSwwKTsKK30KKworc3RyaW5nIGthcnRlKCkgeworICBpZiAodGhpc19wbGF5ZXIoKSAmJiBwcmVzZW50KCJrYXJ0ZSIsdGhpc19wbGF5ZXIoKSkpIHJldHVybiAwOworICByZXR1cm4gR2V0RGV0YWlsKCJrYXJ0ZW4iKTsKK30KKwordm9pZCBpbml0KCkgeworICBpbnQgcmVzOworICBvYmplY3Qgb2I7CisKKyAgOjppbml0KCk7CisKKyAgLy8gVm9uIEFyaywgYW4gYWxsZSBSYXNzZW5zdGFydHB1bmt0ZQorICBpZiAob2I9cHJlc2VudCgiXG5lbnRkZWNrZXJfb2JqIix0aGlzX3BsYXllcigpKSkKKyAgICAgIG9iLT5DaGVja19BbmRfVXBkYXRlKHRoaXNfcGxheWVyKCksIk1lbnNjaGVuIik7Cit9CisKZGlmZiAtLWdpdCBhL3NwZWxsYm9va3MvYWJfc3BlbGxzLmMgYi9zcGVsbGJvb2tzL2FiX3NwZWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWFmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcGVsbGJvb2tzL2FiX3NwZWxscy5jCkBAIC0wLDAgKzEsNTM1IEBACisvKiBHaWxkZW5vYmpla3QgZnVlciBBYmVudGV1cmVyIC0gTW9yZ2VuR3JhdWVuICovCisvKiBCb2luZywgMTk5My0xOTk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU3BydWVjaGU6CisgICAgIExpY2h0a3VnZWwgaGVyYmVpemF1YmVybjogbGljaHQKKyAgICAgICBNYWdpZXB1bmt0ZSA1LCBTdHVmZSA0CisgICAgICAgRGF1ZXI6IExldmVsICogMjAgU2VrdW5kZW4KKyAgICAgSWRlbnRpZml6aWVyZW46IGlkZW50aWZpemllcmUKKyAgICAgICBNYWdpZXB1bmt0ZSAxMCwgU3R1ZmUgMworICAgICBNb25zdGVyIGVpbnNjaGFldHplbjogc2NoYWV0eiA8bmFtZT4KKyAgICAgICBNYWdpZXB1bmt0ZSAzLCBTdHVmZSAxMAorICAgICBQZmVpbGFuZ3JpZmY6IHBmZWlsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCAyMCwgTWFnaWVwdW5rdGUgMTAsIFN0dWZlIDExCisgICAgIEdlZ2Vuc3RhZW5kZSB1bnRlcnN1Y2hlbjogaWRlbnRpZml6aWVyZSA8b2JqZWt0PgorICAgICAgIFdlbm4gUF9JTkZPIGV4aXNpdGllcnQsIHdpcmQgZGllcyBhdXNnZWdlYmVuCisgICAgICAgTWFnaWVwdW5rdGUgMTAsIHN0dWZlIDgKKyAgICAgQXVzd2VpY2hlbjogYXVzd2VpY2hlbgorICAgICAgIEdlaHQgbnVyIGltIEthbXBmLCBnZW5hdSBlaW5lciBBdHRhY2tlIHdpcmQgYXVzZ2V3aWNoZW4uCisgICAgICAgTWFnaWVwdW5rdGUgMTAsIFN0dWZlIDEyCisgICAgIEthbXBmc2NocmVpOiBrYW1wZnNjaHJlaSA8b3BmZXI+IGJ6dy4ga2FtcGZzY2hyZWkgbWVsZHVuZyA8bWVsZHVuZz4KKyAgICAgICBEZXIgS2FtcGZzY2hyZWkgd2lyZCBhdXNnZXN0b3NzZW4gdW5kIHZlcmxhbmdzYW10IGRlbiBHZWduZXIuCisgICAgICAgTWFnaWVwdW5rdGUgMzAsIHN0dWZlIDEzCisgICAgIEZldWVyYmFsbDogZmV1ZXJiYWxsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCA0MCwgTWFnaWVwdW5rdGUgMjAsIFN0dWZlIDE1CisgICAgIFNjaG5lbGxpZ2tlaXQ6IHNjaG5lbGwKKyAgICAgICBHaWJ0IGZ1ZXIgZWluZSBiZXN0aW1tdGUgWmVpdCB6dXNhZXR6bGljaGUgQW5ncmlmZmUKKyAgICAgICBNYWdpZXB1bmt0ZSAxMDAsIFN0dWZlIDE3CisgICAgIFNhZXVyZXN0cmFobDogc2FldXJlc3RyYWhsIDxuYW1lPgorICAgICAgIFNjaGFkZW4gbWF4aW1hbCA2MCwgTWFnaWVwdW5rdGUgMjUsIFN0dWZlIDMwCisqLworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworI2RlZmluZSBMSUNIVEtVR0VMICIvZ2lsZGVuL2ZpbGVzLmFiZW50ZXVyZXIvbGljaHRrdWdlbCIKKworaW5oZXJpdCAiL3N0ZC9zcGVsbGJvb2siOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0dMT0JBTF9TS0lMTFBST1BTLAorICAgICAgICAgIChbU0lfU1BFTExGQVRJR1VFOjIsICAgICAgIC8vIDIgU2VrdW5kZW4ga2VpbiBuZXVlciBTcGVsbAorICAgICAgICAgICAgU0lfU0tJTExMRUFSTjo1LCAgICAgICAgIC8vIDAuMDUlIHBybyAyIEFfSU5UCisgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExMRUFSTik6MTAgLy8gcGx1cyAwLjElIGluIGplZGVtIEZhbGwKKyAgICAgICAgICAgIF0pKTsKKworICAgIEFkZFNwZWxsKCJzdGVpbnNjaGxhZyIsNSwKKyAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxXSksCisgICAgICAgICBTSV9TS0lMTERBTUFHRTo0MCwKKyAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRSk6NDAsCisgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOiAoe0RUX0JMVURHRU9OfSksCisgICAgICAgICBTSV9NQUdJQ19UWVBFOih7TVRfQU5HUklGRn0pLAorICAgICAgICAgU0lfU1BFTEw6KFtTUF9OQU1FOiJzdGVpbnNjaGxhZyJdKV0pKTsKKworICBBZGRTcGVsbCgiaWRlbnRpZml6aWVyZSIsMTAsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDozXSksCisgICAgICAgICBTSV9NQUdJQ19UWVBFOiAoeyBNVF9IRUxMU0lDSFQgfSksCisgICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJpZGVudGlmaXppZXJlIl0pLAorICAgICAgICAgXSkgKTsKKyAgQWRkU3BlbGwoImxpY2h0Iiw1LAorICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDo2XSksCisgICAgICAgIFNJX1NQRUxMOiAoW1BfTkFNRTogImxpY2h0Il0pIAorICAgICAgIF0pICk7CisgIEFkZFNwZWxsKCJzY2hhZXR6IiwzLAorICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6OF0pLAorICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfSEVMTFNJQ0hUIH0pLAorICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogInNjaGFldHoiXSksCisgICAgICAgICBdKSk7CisgIEFkZFNwZWxsKCJwZmVpbCIsMTAsCisgICAgICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MTBdKSwKKyAgICAgICAgICAgICAvLyBVbSBkaWVzZW4gU3BydWNoIGxlcm5lbiB6dSBrb2VubmVuIG11c3MKKyAgICAgICAgICAgICAvLyBkZXIgTGV2ZWwgbWluZGVzdGVucyAxMSBzZWluCisgICAgICAgICAgICAgU0lfU0tJTExEQU1BR0U6MjAwLAorICAgICAgICAgICAgIC8vIFNjaGFkZW46IFJhbmRvbSgyMDApIC4uLgorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX1RZUEU6KHtEVF9NQUdJQ30pLAorICAgICAgICAgICAgIC8vIERhbWFnZSBUeXBlOiBNYWdpYworICAgICAgICAgICAgIFNJX01BR0lDX1RZUEU6ICh7IE1UX0FOR1JJRkYgfSksCisgICAgICAgICAgICAgU0lfU1BFTEw6IChbIFNQX05BTUU6ICJwZmVpbCIgXSksCisgICAgICAgICAgICAgLy8gQm9uaSBm/HIgaGludGVyZSBLYW1wZnJlaWhlbgorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzogKFsyOjExMCwzOjUwLDQ6MTBdKSwKKyAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKTogKFsyOjUwLDM6MjAsNDo1XSkKKyAgICAgICAgICAgICBdKSk7CisgIEFkZFNwZWxsKCJhdXN3ZWljaGVuIiwgMTAsCisgICAgICAoW1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOjEzXSksCisgICAgICAgIFNJX1NQRUxMOiAoW1BfTkFNRTogImF1c3dlaWNoZW4iXSksCisgICAgICAgIF0pKTsKKyAgQWRkU3BlbGwoImthbXBmc2NocmVpIiwgMzAsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxNl0pLAorICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfUFNZQ0hPIH0pLAorICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogImthbXBmc2NocmVpIl0pLAorICAgICAgICAgXSkpOworICBBZGRTcGVsbCgiZmV1ZXJiYWxsIiwyMCwKKyAgICAgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoxOF0pLAorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFOjMwMCwKKyAgICAgICAgICAgICAvLyBTY2hhZGVuOiBSYW5kb20oMzAwKSAuLi4KKyAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0UpOjEwMCwKKyAgICAgICAgICAgICAvLyAuLi4gcGx1cyAxMDAKKyAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOih7RFRfRklSRX0pLAorICAgICAgICAgICAgIC8vIERhbWFnZSBUeXBlOiBGaXJlCisgICAgICAgICAgICBTSV9NQUdJQ19UWVBFOiAoeyBNVF9BTkdSSUZGIH0pLAorICAgICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogImZldWVyYmFsbCJdKSwKKyAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzogKFsyOjgwLDM6MTUwLDQ6ODAsNToyMF0pLAorICAgICAgICAgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFX0JZX1JPVyk6IChbMjozMCwzOjgwLDQ6MzAsNToxMF0pCisgICAgICAgICAgICAgXSkpOworICBBZGRTcGVsbCgic2NobmVsbCIsMTAwLAorICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoyMV0pLAorICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJzY2huZWxsIl0pIF0pKTsKKyAgQWRkU3BlbGwoInNhZXVyZXN0cmFobCIsMjUsCisgICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDoyOF0pLAorICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTExFQVJOKToxLAorICAgICAgICAgICAgIEZBQ1RPUihTSV9TS0lMTExFQVJOKToyMCwKKyAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRTo0MDAsCisgICAgICAgICAgICAgLy8gU2NoYWRlbjogUmFuZG9tKDQwMCkgLi4uCisgICAgICAgICAgICAgT0ZGU0VUKFNJX1NLSUxMREFNQUdFKToyMDAsCisgICAgICAgICAgICAgLy8gLi4uIHBsdXMgMjAwCisgICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRTooe0RUX0FDSUR9KSwKKyAgICAgICAgICAgICAvLyBEYW1hZ2UgVHlwZTogU2FldXJlCisgICAgICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfQU5HUklGRiB9KSwKKyAgICAgICAgICAgICBTSV9TUEVMTDogKFtTUF9OQU1FOiAic2FldXJlc3RyYWhsIl0pLAorICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzooWzI6NjAsMzoxNTAsNDoyMTAsNToxNTAsNjo2MF0pLAorICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRV9CWV9ST1cpOihbMjozMCwzOjgwLDQ6MTIwLDU6ODAsNjozMF0pCisgICAgICAgICAgICAgXSkpOworCit9CisKK2ludAorc3RlaW5zY2hsYWcob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2biwgdm53LCBjbjsKKyAgaW50IHN1YzsKKworICB2aWN0aW09RmluZEVuZW15VmljdGltKHNpbmZvW1NJX1NLSUxMQVJHXSxjYXN0ZXIsCisgICAgICAgICAiVWViZXIgd2VtIHdpbGxzdCBEdSBlaW5lbiBTdGVpbnNjaGxhZyBuaWVkZXJnZWhlbiBsYXNzZW4/XG4iKTsKKyAgaWYgKCF2aWN0aW0pCisgICAgcmV0dXJuIDA7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IHZpY3RpbS0+U3BlbGxEZWZlbmQoY2FzdGVyLCBzaW5mbykpCisgIHsKKyAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIGNuID0gY2FzdGVyLT5OYW1lKCk7CisgIHZudyA9IHZpY3RpbS0+bmFtZShXRU4sIDIpOworICBzYXkoc3ByaW50ZigiJXMgbGFlc3N0IGtsZWluZSBLaWVzZWwgYXVmICVzIGZhbGxlbi5cbiIsY24sIHZudyksCisgICAgICB2aWN0aW0pOworICBwcmludGYoIkR1IGtvbnplbnRyaWVyc3QgRGljaCBkYXJhdWYsIGtsZWluZSBLaWVzZWwgYXVmICVzIGZhbGxlbiB6dSBsYXNzZW4uXG4iLCB2bncpOworICB0ZWxsX29iamVjdCh2aWN0aW0sc3ByaW50ZigiJXMgbGFlc3N0IGtsZWluZSBLaWVzZWwgYXVmIERpY2ggZmFsbGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24pKTsKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6InN0ZWluc2NobGFnIiwgU1BfUEhZU0lDQUxfQVRUQUNLOjEsU1BfU0hPV19EQU1BR0U6MV0pKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitzY2hhZXR6KG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKKyAgIG9iamVjdCB2aWN0aW07CisgICBpbnQgaHBkaWZmLCB3Y2RpZmYsIGFjZGlmZjsKKyAgIGludCBocCwgdmhwLCB3YywgdndjLCBhYywgdmFjOworICAgc3RyaW5nIHJlc3VsdDsKKyAgIHN0cmluZyB2bmFtZSwgdm5hbWVnZW47CisgICBpbnQgc3VjOworCisgICB2aWN0aW09RmluZExpdmluZ1ZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlbiBtb2VjaHRlc3QgRHUgZWluc2NoYWV0emVuP1xuIik7CisgICBpZiAoIXZpY3RpbSkKKyAgICAgcmV0dXJuIDA7CisgICBpZiAoKHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKSk8PTApCisgICAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgIGlmIChzdWMgPCB2aWN0aW0tPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQorICAgeworICAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgIHJldHVybiBFUkZPTEc7CisgICB9CisKKyAgIGhwID0gY2FzdGVyLT5RdWVyeVByb3AoUF9IUCk7ICAgIHZocCA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfSFApOworICAgd2MgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKTsgIHZ3YyA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpOworICAgYWMgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX1RPVEFMX0FDKTsgIHZhYyA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpOworICAgaHBkaWZmID0gaHAgLSB2aHA7CisgICB3Y2RpZmYgPSB3YyAtIHZ3YzsKKyAgIGFjZGlmZiA9IGFjIC0gdmFjOworICAgdm5hbWUgPSB2aWN0aW0tPm5hbWUoV0VSLCAxKTsKKyAgIHZuYW1lZ2VuID0gdmljdGltLT5uYW1lKFdFU1NFTiwgMSk7CisKKyAgIGlmIChocGRpZmYgPiAxMCp2aHApCisgICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZpY3RpbS0+bmFtZShXRVIsIDEpKSsiIHNvbGx0ZSBzaWNoIGJlc3NlciBzY2hvbiBtYWwgZWluZW4gU2FyZyBiZXNvcmdlbi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiA3KnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0ICIgKyB2aWN0aW0tPm5hbWUoV0VNLCAxKSArICIgaGF1c2hvY2ggdWViZXJsZWdlbi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiA0KnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHNlaHIgdmllbCBzdGFlcmtlciBhbHMgIiArIHZuYW1lICsgIi5cbiI7CisgICBlbHNlIGlmIChocGRpZmYgPiAyKnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHZpZWwgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOworICAgZWxzZSBpZiAoMipocGRpZmYgPiAzKnZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHNwdWVyYmFyIHN0YWVya2VyIGFscyAiICsgdm5hbWUgKyAiLlxuIjsKKyAgIGVsc2UgaWYgKGhwZGlmZiA+IHZocCkKKyAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHN0YWVya2VyIGFscyAiICsgdm5hbWUgKyAiLlxuIjsKKyAgIGVsc2UgaWYgKGhwZGlmZiA+IHZocC81KQorICAgICAgcmVzdWx0ID0gIkR1IGJpc3QgZXR3YXMgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOworICAgZWxzZSBpZiAoLWhwZGlmZiA+IDEwKmhwKQorICAgICAgcmVzdWx0ID0gIkJlc29yZyBEaXIgYmVzc2VyIHNjaG9uIG1hbCBlaW5lbiBTYXJnLlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiA3KmhwKQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBEaXIgaGF1c2hvY2ggdWViZXJsZWdlbi5cbiI7CisgICBlbHNlIGlmICgtaHBkaWZmID4gNCpocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc2VociB2aWVsIHN0YWVya2VyIGFscyBEdS5cbiI7CisgICBlbHNlIGlmICgtaHBkaWZmID4gMipocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3QgdmllbCBzdGFlcmtlciBhbHMgRHUuXG4iOworICAgZWxzZSBpZiAoLTIqaHBkaWZmID4gMypocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc3B1ZXJiYXIgc3RhZXJrZXIgYWxzIER1LlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiBocCkKKyAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc3RhZXJrZXIgYWxzIER1LlxuIjsKKyAgIGVsc2UgaWYgKC1ocGRpZmYgPiBocC81KQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBldHdhcyBzdGFlcmtlciBhbHMgRHUuXG4iOworICAgZWxzZQorICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBldHdhIGdsZWljaCBzdGFyayB3aWUgRHUuXG4iOworICAgd3JpdGUocmVzdWx0KTsKKworICAgaWYgKGFjZGlmZiA+IDIqdmFjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFJ1ZXN0dW5nIGlzdCB1bmdsYXVibGljaCB2aWVsIGJlc3NlciBhbHMgZGllICIKKyAgICAgKyB2bmFtZWdlbiArICIuXG4iOworICAgZWxzZSBpZiAoYWNkaWZmID4gdmFjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFJ1ZXN0dW5nIGlzdCB2aWVsIGJlc3NlciBhbHMgZGllICIgKyB2bmFtZWdlbiArICIuXG4iOworICAgZWxzZSBpZiAoYWNkaWZmID52YWMvNSkKKyAgICAgIHJlc3VsdCA9ICJEZWluZSBSdWVzdHVuZyBpc3QgYmVzc2VyIGFscyBkaWUgIiArIHZuYW1lZ2VuICsgIi5cbiI7CisgICBlbHNlIGlmICgtYWNkaWZmID4gMiphYykKKyAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuCisgICAgICsgIiBpc3QgdW5nbGF1YmxpY2ggdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UgaWYgKC1hY2RpZmYgPiBhYykKKyAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuICsgIiBpc3QgdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UgaWYgKC1hY2RpZmYgPiBhYy81KQorICAgICAgcmVzdWx0ID0gIkRpZSBSdWVzdHVuZyAiICsgdm5hbWVnZW4gKyAiIGlzdCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKKyAgIGVsc2UKKyAgICAgIHJlc3VsdCA9ICJFdXJlIFJ1ZXN0dW5nZW4gc2luZCBldHdhIGdsZWljaCBndXQuXG4iOworICAgd3JpdGUocmVzdWx0KTsKKworICAgaWYgKHdjZGlmZiA+IDIqdndjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFdhZmZlIGlzdCBlaWdlbnRsaWNoIHp1IGd1dCBmdWVyIGRpZXNlbiBHZWduZXIuXG4iOworICAgZWxzZSBpZiAod2NkaWZmID4gdndjKQorICAgICAgcmVzdWx0ID0gIkRlaW5lIFdhZmZlIGlzdCB2aWVsIGJlc3NlciBhbHMgZGllICIgK3ZuYW1lZ2VuICsgIi5cbiI7CisgICBlbHNlIGlmICh3Y2RpZmYgPiB2d2MvNSkKKyAgICAgIHJlc3VsdCA9ICJEZWluZSBXYWZmZSBpc3QgYmVzc2VyIGFscyBkaWUgIiArdm5hbWVnZW4gKyAiLlxuIjsKKyAgIGVsc2UgaWYgKC13Y2RpZmYgPiAyKndjKQorICAgICAgcmVzdWx0ID0gIkRpZSBXYWZmZSAiICsgdm5hbWVnZW4KKyAgICAgKyAiIGxhZXNzdCBEZWluZSBnYW56IG1pY2tyaWcgYXVzc2VoZW4uXG4iOworICAgZWxzZSBpZiAoLXdjZGlmZiA+IHdjKQorICAgICAgcmVzdWx0ID0gIkRpZSBXYWZmZSAiICsgdm5hbWVnZW4gKyAiIGlzdCB2aWVsIGJlc3NlciBhbHMgRGVpbmUuXG4iOworICAgZWxzZSBpZiAoLXdjZGlmZiA+IHdjLzUpCisgICAgICByZXN1bHQgPSAiRGllIFdhZmZlICIgKyB2bmFtZWdlbiArICIgaXN0IGJlc3NlciBhbHMgRGVpbmUuXG4iOworICAgZWxzZQorICAgICAgcmVzdWx0ID0gIkV1cmUgV2FmZmVuIHNpbmQgZXR3YSBnbGVpY2ggZ3V0LlxuIjsKKyAgIHdyaXRlKHJlc3VsdCk7CisgICByZXR1cm4gRVJGT0xHOworfQorCitpbnQga2FtcGZzY2hyZWkob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgY21kbGluZSwgbWVsZHVuZzsKKyAgaW50ICAgIHN1YywgZGF1ZXI7CisKKyAgY21kbGluZSA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CisgIGlmIChjbWRsaW5lKQorICB7CisgICAgaWYgKHNzY2FuZihjbWRsaW5lLCAibWVsZHVuZyAlcyIsIG1lbGR1bmcpKQorICAgIHsKKyAgICAgIGNhc3Rlci0+U2V0KCJhYl9rYW1wZnNjaHJlaSIsIFNBVkUsIEZfTU9ERV9BUyk7CisgICAgICBjYXN0ZXItPlNldFByb3AoImFiX2thbXBmc2NocmVpIiwgbWVsZHVuZyk7CisgICAgICBwcmludGYoIkRlaW4gS2FtcGZzY2hyZWkgaXN0IGpldHp0OiAlc1xuIiwgbWVsZHVuZyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgb2IgPSBGaW5kRW5lbXlWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLCBjYXN0ZXIsCisgICAgICAgICAgIldlbSB3aWxsc3QgRHUgRGVpbmVuIEthbXBmc2NocmVpIGVudGdlZ2Vuc2NobGV1ZGVybj9cbiIpOworCisgIGlmICghb2IpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3Rlciwgc2luZm8pKSA8PSAwKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgb2ItPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQorICB7CisgICAgdGVsbF9vYmplY3QoY2FzdGVyLCBvYi0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIG1lbGR1bmcgPSBjYXN0ZXItPlF1ZXJ5UHJvcCgiYWJfa2FtcGZzY2hyZWkiKTsKKyAgaWYgKCFtZWxkdW5nKQorICAgIG1lbGR1bmcgPSAiQWFhYWFhYWlpaWlpZWVlZWVlZWVlZWVlZWVlZWhoaGhoaGhoaGhoaGhoaCEhISEhISFcbiI7CisKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKG1lbGR1bmcsIDc4LCAiRHUga3JlaXNjaHN0OiAiKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChjYXN0ZXIpLAorICAgICAgICBicmVha19zdHJpbmcobWVsZHVuZywgNzgsIGNhc3Rlci0+TmFtZSgpKyIga3JlaXNjaHQ6ICIpLAorICAgICAgICAoe2Nhc3Rlcn0pKTsKKyAgdGVsbF9vYmplY3Qob2IsICJEdSBmdWVobHN0IERpY2ggd2llIGdlbGFlaG10LlxuIik7CisKKyAgZGF1ZXIgPSAxICsgKHN1Yy8xMDAwICsgcmFuZG9tKGNhc3Rlci0+UXVlcnlQcm9wKFBfTEVWRUwpLzIpKS8yOworICBpZiAoZGF1ZXI+MjUpCisgICAgZGF1ZXIgPSAyNTsKKyAgb2ItPk1vZGlmeVNraWxsQXR0cmlidXRlKFNBX1NQRUVELCAtNTAsIGRhdWVyKTsKKworICByZXR1cm4gRVJGT0xHOworfQorCitpbnQgYXVzd2VpY2hlbihvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQoreworICBpZiAoIWNhc3Rlci0+SW5GaWdodCgpKQorICB7CisgICAgd3JpdGUoIkF1c3dlaWNoZW4gYXVzc2VyaGFsYiBlaW5lcyBLYW1wZmVzIGlzdCB6aWVtbGljaCBzaW5ubG9zLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoY2FzdGVyLT5RdWVyeVByb3AoUF9UTVBfREVGRU5EX0hPT0spKQorICB7CisgICAgd3JpdGUoIkRhcyBnZWh0IG1vbWVudGFuIG5pY2h0LCBEdSB3dW5kZXJzdCBEaWNoIHdpZXNvIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoU3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbyk8PTApCisgICAgcmV0dXJuIE1JU1NFUkZPTEc7CisKKyAgY2FzdGVyLT5TZXRQcm9wKFBfVE1QX0RFRkVORF9IT09LLCAoeyB0aW1lKCkrNCwgdGhpc19vYmplY3QoKSwgIkRlY2t1bmciIH0pKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworbWl4ZWQgRGVja3VuZyhpbnQgZGFtLCBtaXhlZCBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKK3sKKyAgaWYgKCFwb2ludGVycChkYW1fdHlwZSkpCisgICAgZGFtX3R5cGUgPSAoeyBkYW1fdHlwZSB9KTsKKyAgaWYgKHNpemVvZihkYW1fdHlwZSAmIG1faW5kaWNlcyhQSFlTSUNBTF9EQU1BR0VfVFlQRVMpKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRHUgd2VpY2hzdCBnZWtvbm50IGF1cy5cbiIpOworICAgIGlmIChwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wKFBfVE1QX0RFRkVORF9IT09LKVsxXSA9PSB0aGlzX29iamVjdCgpKQorICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlNldFByb3AoUF9UTVBfREVGRU5EX0hPT0ssIDApOworICAgIHJldHVybiAwOworICB9CisgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRGVpbiBBdXN3ZWljaHZlcnN1Y2ggaXN0IHZlcmdlYmVucy5cbiIpOworICByZXR1cm4gKHsgZGFtLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15IH0pOworfQorCitpbnQKK2lkZW50aWZpemllcmUob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3Qgb2I7CisgIHN0cmluZyogZmk7CisgIHN0cmluZyBjbjsKKyAgc3RyaW5nIHJlc3VsdCwgaW5mbzsKKyAgaW50IHN1YzsKKyAgb2I9RmluZFZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sIGNhc3RlciwKKyAgICAgICAgICAgICAgICAiV2FzIG1vZWNodGVzdCBEdSBpZGVudGlmaXppZXJlbj9cbiIpOworICBpZiAoIW9iKQorICAgIHJldHVybiAwOworCisgIGNuID0gY2FzdGVyLT5uYW1lKCk7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IG9iLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3Rlciwgb2ItPk5hbWUoKSArICIgd2VocnQgRGVpbmVuIFNwcnVjaCBhYi5cbiIpOworICAgIHJldHVybiBFUkZPTEc7CisgIH0KKworICByZXN1bHQ9IkR1IGlkZW50aWZpemllcnN0ICIrb2ItPm5hbWUoV0VOLDEpKyIuICIKKyAgICAgICAgK2NhcGl0YWxpemUob2ItPlF1ZXJ5UHJvbm91bigpKQorICAgICAgICArIiBiZXN0ZWgiCisgICAgICAgICsob2ItPlF1ZXJ5UHJvcChQX1BMVVJBTCkgPyAiZW4iIDogInQiKQorICAgICAgICArIiBhdXMgIgorICAgICAgICArKG9iLT5NYXRlcmlhbExpc3QoV0VNLCBjYXN0ZXIpKSsiLiAiOworICBpZiAoaW5mbz1vYi0+UXVlcnlQcm9wKFBfSU5GTykpCisgICAgcmVzdWx0Kz0iQXVzc2VyZGVtIGJlbWVya3N0IER1IGZvbGdlbmRlczpcbiIraW5mbzsKKyAgZWxzZSByZXN1bHQrPSJEdSBrYW5uc3Qgc29uc3QgbmljaHRzIGJlc29uZGVyZXMgYW4gIitvYi0+UXVlcnlQcm9ub3VuKFdFTSkKKyAgICAgICAgICAgICAgKyIgZXJrZW5uZW4uIjsKKyAgd3JpdGUoYnJlYWtfc3RyaW5nKHJlc3VsdCwgNzgsIDAsIDEpKTsKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitsaWNodChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQoreworICAgb2JqZWN0IGw7CisKKyAgIHRlbGxfb2JqZWN0KGNhc3RlciwgIkR1IG1hY2hzdCBlaW5lIG1hZ2lzY2hlIEJld2VndW5nLlxuIik7CisgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoY2FzdGVyKSwKKyAgICAgICBzcHJpbnRmKCIlcyBtYWNodCBlaW5lIG1hZ2lzY2hlIEJld2VndW5nLlxuIiwKKyAgICAgICAgICAgY2FwaXRhbGl6ZShjYXN0ZXItPm5hbWUoV0VSKSkpLCAoe2Nhc3Rlcn0pKTsKKyAgIAorICAgaW50IHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKTsKKyAgIGlmIChzdWM8PTApCisgICAgICByZXR1cm4gTUlTU0VSRk9MRzsKKworICAgbCA9IGNsb25lX29iamVjdChMSUNIVEtVR0VMKTsKKyAgIGlmIChsLT5tb3ZlKHRoaXNfcGxheWVyKCkpID4gMCkKKyAgIHsKKyAgICAgIGludCBsdmw7CisgICAgICAvLyBmdWVyIFNwcnVjaHJvbGxlbi1TdXBwb3J0LgorICAgICAgaWYgKCFzaW5mb1tTSV9VU1JdIHx8ICEobHZsPXNpbmZvW1NJX1VTUl1bUF9MRVZFTF0pICkKKyAgICAgICAgbHZsID0gY2FzdGVyLT5RdWVyeVByb3AoUF9MRVZFTCk7CisgICAgICBsdmwgPSBtaW4obHZsLDQyKTsKKyAgICAgIC8vIHdlbm4gZGVyIFNwZWxsIG5pY2h0IGdhbnogc28gZ3V0IGdlbGluZ3QsIGlzdCBkaWUgS3VnZWwgYXVjaCBldHdhcworICAgICAgLy8gZHVua2xlci4KKyAgICAgIGlmIChzdWM8NjAwMCkKKyAgICAgIHsKKyAgICAgICAgbC0+U2V0UHJvcChQX0xJR0hULDEpOworICAgICAgICB0ZWxsX29iamVjdChjYXN0ZXIsCisgICAgICAgICAgICAiV2llIGF1cyBkZW0gTmljaHRzIGVyc2NoZWludCBlaW5lIGxldWNodGVuZGUgS3VnZWwuXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLAorICAgICAgICAgICAgIldpZSBhdXMgZGVtIE5pY2h0cyBlcnNjaGVpbnQgZWluZSBoZWxsIGxldWNodGVuZGUgS3VnZWwuXG4iKTsKKyAgICAgIGwtPnN0YXJ0X3JlbW92ZShsdmwgKiAyMCAqIG1pbihzdWMrMzMzMywxMDAwMCkgLyAxMDAwMCk7CisgICB9CisgICBlbHNlCisgICB7CisgICAgICBsLT5yZW1vdmUoKTsKKyAgICAgIHRlbGxfb2JqZWN0KGNhc3RlciwKKyAgICAgICAgICAiRWluZSBMaWNodGt1Z2VsIGVyc2NoZWludCwgemVycGxhdHp0IGFiZXIgc29mb3J0IG1pdCBlaW5lbSBzYW5mdGVuICdwbG9wcCcuXG4iKTsKKyAgIH0KKworICAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitzYWV1cmVzdHJhaGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2bnc7CisgIGludCBzdWM7CisKKyAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgIldlbiB3aWxsc3QgRHUgbWl0IGVpbmVtIFNhZXVyZXN0cmFobCBiZXNjaGllc3Nlbj9cbiIpOworICBpZiAoIXZpY3RpbSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKKyAgICByZXR1cm4gRVJGT0xHOworICB9CisKKyAgdm53ID0gdmljdGltLT5uYW1lKFdFTiwgMik7CisgIHNheShicmVha19zdHJpbmcoCisgICBzcHJpbnRmKAorICAgIiVzIGZ1Y2h0ZWx0IHNlbHRzYW0gaW4gZGVyIEx1ZnQgaGVydW0gdW5kIHNjaGllc3N0IGVpbmVuIFNhZXVyZXN0cmFobCBhdWYgJXMuXG4iLAorICAgICAgIGNhc3Rlci0+TmFtZSgpLCB2bncpLCA3OCksIHZpY3RpbSk7CisgIHByaW50ZigiRHUgc2NoaWVzc3QgZWluZW4gU2FldXJlc3RyYWhsIGF1ZiAlcy5cbiIsIHZudyk7CisgIHRlbGxfb2JqZWN0KHZpY3RpbSwgc3ByaW50ZigiJXMgc2NoaWVzc3QgZWluZW4gU2FldXJlc3RyYWhsIGF1ZiBEaWNoLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpKSk7CisKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6IlNhZXVyZXN0cmFobCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitmZXVlcmJhbGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgeworICBvYmplY3QgdmljdGltOworICBpbnQgaGFuZHM7CisgIHN0cmluZyB2bnc7CisgIGludCBzdWM7CisKKyAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJBdWYgd2VuIHdpbGxzdCBEdSBlaW5lbiBGZXVlcmJhbGwgc2NobGV1ZGVybj9cbiIpOworICBpZiAoIXZpY3RpbSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQorICAgIHJldHVybiBNSVNTRVJGT0xHOworICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKKyAgICByZXR1cm4gRVJGT0xHOworICB9CisKKyAgdm53ID0gdmljdGltLT5uYW1lKFdFTSwgMik7CisgIHNheShzcHJpbnRmKCIlcyB3aXJmdCBlaW5lbiBGZXVlcmJhbGwgbmFjaCAlcy5cbiIsCisgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpLCB2bncpLCB2aWN0aW0pOworICBwcmludGYoIkR1IHdpcmZzdCBlaW5lbiBGZXVlcmJhbGwgbmFjaCAlcy5cbiIsIHZudyk7CisgIHRlbGxfb2JqZWN0KHZpY3RpbSwgc3ByaW50ZigiJXMgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggRGlyLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpKSk7CisKKyAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCisgICAgICAgICAgICAoW1NQX05BTUU6IkZldWVyYmFsbCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30KKworaW50CitwZmVpbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CisgIG9iamVjdCB2aWN0aW07CisgIGludCBoYW5kczsKKyAgc3RyaW5nIHZuLCB2bncsIGNuOworICBpbnQgc3VjOworCisgIHZpY3RpbT1GaW5kRW5lbXlWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLGNhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTmFjaCB3ZW0gd2lsbHN0IER1IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCB3ZXJmZW4/XG4iKTsKKyAgaWYgKCF2aWN0aW0pCisgICAgcmV0dXJuIDA7CisgIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKKyAgICByZXR1cm4gTUlTU0VSRk9MRzsKKyAgaWYgKHN1YyA8IHZpY3RpbS0+U3BlbGxEZWZlbmQoY2FzdGVyLCBzaW5mbykpCisgIHsKKyAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CisgICAgcmV0dXJuIEVSRk9MRzsKKyAgfQorCisgIGNuID0gY2FzdGVyLT5OYW1lKCk7CisgIHZudyA9IHZpY3RpbS0+bmFtZShXRU4sIDIpOworICBzYXkoc3ByaW50ZigiJXMgZmV1ZXJ0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgJXMgYWIuXG4iLGNuLCB2bncpLAorICAgICAgdmljdGltKTsKKyAgcHJpbnRmKCJEdSBmZXVlcnN0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgJXMgYWIuXG4iLCB2bncpOworICB0ZWxsX29iamVjdCh2aWN0aW0sc3ByaW50ZigiJXMgZmV1ZXJ0IGVpbmVuIG1hZ2lzY2hlbiBQZmVpbCBhdWYgRGljaCBhYi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuKSk7CisgIFRyeURlZmF1bHRBdHRhY2tTcGVsbCh2aWN0aW0sY2FzdGVyLHNpbmZvLAorICAgICAgICAgICAgKFtTUF9OQU1FOiJQZmVpbCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CisgIHJldHVybiBFUkZPTEc7Cit9CisKK2ludAorc2NobmVsbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CisgIGludCBkYXVlcjsKKworICBpZiAoU3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbyk8PTApCisgICAgcmV0dXJuIE1JU1NFUkZPTEc7CisgIHdyaXRlKCJEdSBmdWVobHN0IERpY2ggcGxvZXR6bGljaCBkZXV0bGljaCBzY2huZWxsZXIuXG4iKTsKKyAgZGF1ZXIgPSAyICogKGNhc3Rlci0+UXVlcnlBdHRyaWJ1dGUoQV9ERVgpICsKKyAgICAgICAgICAgcmFuZG9tKHNpbmZvW1NJX1NLSUxMQUJJTElUWV0vMTAwMCkpOworICBpZiAoZGF1ZXI+NjApCisgICAgZGF1ZXIgPSA2MDsKKyAgY2FzdGVyLT5Nb2RpZnlTa2lsbEF0dHJpYnV0ZShTQV9TUEVFRCwgMTAwLCBkYXVlcik7CisKKyAgcmV0dXJuIEVSRk9MRzsKK30K