LyogV2luZG93cyBHVUkgQmVoYXZpb3VyIFRlc3RlciAqLwovKiBieSBPdmUgS+V2ZW4gKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KCiNpbmNsdWRlICJndWl0ZXN0LnJoIgoKLyogY2hlY2tzIHRvIGluY2x1ZGUgKi8KI2RlZmluZSBMT0dHSU5HIC8qIGNhbiBiZSB1bmRlZmluZWQgdW5kZXIgV2luZSBhbmQgdXNlIC1kZWJ1Z21zZyArbWVzc2FnZSBpbnN0ZWFkICovCiNkZWZpbmUgTUFJTl9TVFlMRSBXU19PVkVSTEFQUEVEV0lORE9XCiN1bmRlZiBURVNUX0RFU1RST1lfTUFJTgojdW5kZWYgU0hPV19TVUIKI2RlZmluZSBURVNUX0RJQUxPRwojZGVmaW5lIFJFU0laRV9ESUFMT0cKI3VuZGVmIFRFU1RfU1VCRElBTE9HCiN1bmRlZiBURVNUX0NPTU1DVEwKCi8qKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiogR0xPQkFMIFZBUklBQkxFUyAqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiovCgpISU5TVEFOQ0UgaEluc3Q7CkRXT1JEIFN0YXJ0VGltZTsKSFdORCBoTGlzdEJveCxoTWFpblduZCxoU3ViV25kOwpIV05EIGhCdXR0b25bNF09ezAsMCwwLDB9OwpIV05EIGhEaWFsb2c9MCxoR3JvdXA9MCxoU3ViRGxnPTA7CldORFBST0Mgd25kQnV0dG9uWzRdLHduZERpYWxvZyx3bmRHcm91cCx3bmRTdWJEbGc7CkJPT0wgQ2xpY2tlZD0wLFJlYWR5PTA7CmludCBTdGF0ZT0wLFJlYz0wOwojZGVmaW5lIFNUQVRFX0NSRUFURSAwCiNkZWZpbmUgU1RBVEVfREVTVFJPWSAxCiNkZWZpbmUgU1RBVEVfU0hPVyAyCiNkZWZpbmUgU1RBVEVfVVBEQVRFIDMKI2RlZmluZSBTVEFURV9ESUFMT0cgNAojZGVmaW5lIFNUQVRFX1RFU1QgNQojZGVmaW5lIFNUQVRFX0RJUkVDVCA2CiNkZWZpbmUgU1RBVEVfRElTUEFUQ0ggNwojZGVmaW5lIFNUQVRFX1JFQ1VSUyA4CmNoYXIqU3RhdGVOYW1lW109ewogIkNyZWF0IiwKICJEZXN0ciIsCiAiU2hvdyAiLAogIlVwZGF0IiwKICJEaWFsZyIsCiAiVGVzdCAiLAogIkNhbGwgIiwKICJEaXNwICIsCiAiUkNhbGwiCn07CgpzdGF0aWMgY2hhciB3Y2xhc3NuYW1lW10gPSAiR1VJVGVzdENsYXNzIjsKc3RhdGljIGNoYXIgd2NjbGFzc25hbWVbXSA9ICJHVUlUZXN0Q2hpbGRDbGFzcyI7CnN0YXRpYyBjaGFyIHdpbm5hbWVbXSA9ICJHVUlUZXN0IjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKiBMT0dHSU5HIEZBQ0lMSVRJRVMgKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgTVNHTkFNRVMgewogaW50IG1zZzsKIGNoYXIqbmFtZTsKfSBNc2dOYW1lc1tdPXsKI2RlZmluZSBNU0coeCkge3gsI3h9LAojZGVmaW5lIE1TRzIoeCx5KSB7eSwjeH0sCiNkZWZpbmUgRU5ETVNHIHswfQoKLyogd2UgZ2V0IHRoZXNlIGluIENyZWF0ZVdpbmRvdyAqLwpNU0coV01fR0VUTUlOTUFYSU5GTykKTVNHKFdNX05DQ1JFQVRFKQpNU0coV01fTkNDQUxDU0laRSkKTVNHKFdNX0NSRUFURSkKTVNHKFdNX1BBUkVOVE5PVElGWSkKCi8qIHdlIGdldCB0aGVzZSBpbiBTaG93V2luZG93ICovCk1TRyhXTV9TSE9XV0lORE9XKQpNU0coV01fV0lORE9XUE9TQ0hBTkdJTkcpCk1TRyhXTV9RVUVSWU5FV1BBTEVUVEUpCk1TRyhXTV9BQ1RJVkFURUFQUCkKTVNHKFdNX05DQUNUSVZBVEUpCk1TRyhXTV9HRVRURVhUKQpNU0coV01fQUNUSVZBVEUpCk1TRyhXTV9TRVRGT0NVUykKTVNHKFdNX05DUEFJTlQpCk1TRyhXTV9FUkFTRUJLR05EKQpNU0coV01fV0lORE9XUE9TQ0hBTkdFRCkKTVNHKFdNX1NJWkUpCk1TRyhXTV9NT1ZFKQoKLyogd2UgZ2V0IHRoZXNlIGluIERlc3Ryb3lXaW5kb3cgKi8KTVNHKFdNX0tJTExGT0NVUykKTVNHKFdNX0RFU1RST1kpCk1TRyhXTV9OQ0RFU1RST1kpCgovKiB3ZSBnZXQgdGhlc2UgZGlyZWN0bHkgc2VudCAqLwpNU0coV01fTkNISVRURVNUKQpNU0coV01fU0VUQ1VSU09SKQpNU0coV01fTU9VU0VBQ1RJVkFURSkKTVNHKFdNX0NISUxEQUNUSVZBVEUpCk1TRyhXTV9DT01NQU5EKQpNU0coV01fU1lTQ09NTUFORCkKCi8qIHBvc3RlZCBldmVudHMgKi8KTVNHKFdNX01PVVNFTU9WRSkKTVNHKFdNX05DTU9VU0VNT1ZFKQpNU0coV01fUEFJTlQpCk1TRyhXTV9MQlVUVE9ORE9XTikKTVNHKFdNX0xCVVRUT05VUCkKTVNHKFdNX05DTEJVVFRPTkRPV04pCk1TRyhXTV9OQ0xCVVRUT05VUCkKCk1TRyhXTV9LRVlET1dOKQpNU0coV01fS0VZVVApCk1TRyhXTV9DSEFSKQoKI2lmZGVmIFdJTjMyCk1TRyhXTV9DVExDT0xPUkJUTikKTVNHKFdNX0NUTENPTE9SRExHKQpNU0coV01fQ1RMQ09MT1JTVEFUSUMpCiNlbHNlCk1TRyhXTV9DVExDT0xPUikKI2VuZGlmCgovKiBtb3ZpbmcgYW5kIHNpemluZyAqLwpNU0cyKFdNX0VOVEVSU0laRU1PVkUsMHgwMjMxKQpNU0cyKFdNX0VYSVRTSVpFTU9WRSwweDAyMzIpCiNpZmRlZiBXSU4zMgpNU0coV01fU0laSU5HKQojZW5kaWYKCi8qIG1lbnVzL2RpYWxvZyBib3hlcyAqLwpNU0coV01fQ0FOQ0VMTU9ERSkKTVNHKFdNX0VOQUJMRSkKTVNHKFdNX1NFVEZPTlQpCk1TRyhXTV9JTklURElBTE9HKQpNU0coV01fR0VURExHQ09ERSkKTVNHKFdNX0VOVEVSSURMRSkKCi8qIGdldHRpbmcgdGhlc2UgZnJvbSBXaW5lIGJ1dCBub3QgZnJvbSBXaW5kb3dzICovCk1TRzIoV01fU0VUVklTSUJMRSwweDAwMDkpIC8qIHVuaGVhcmQgb2YgaW4gQkMrKyA0LjUyICovCiNpZmRlZiBXSU4zMgpNU0coV01fQ0FQVFVSRUNIQU5HRUQpCiNlbmRpZgoKRU5ETVNHfTsKCnN0cnVjdCBNU0dOQU1FUyBCdXRNc2dzW109ewpNU0coQk1fU0VUU1RBVEUpCk1TRyhCTV9TRVRTVFlMRSkKCkVORE1TR307CgpjaGFyKk1zZ05hbWUoVUlOVCBtc2csSFdORCBoV25kKQp7CiBpbnQgaTsKIHN0YXRpYyBjaGFyIGJ1ZmZlcls2NF0sd2NsYXNzWzY0XTsKIEdldENsYXNzTmFtZShoV25kLHdjbGFzcyxzaXplb2Yod2NsYXNzKSk7CgojZGVmaW5lIE1TR1NFQVJDSChtc2dzKSB7IFwKICBmb3IgKGk9MDsgbXNnc1tpXS5uYW1lJiZtc2dzW2ldLm1zZyE9bXNnOyBpKyspOyBcCiAgaWYgKG1zZ3NbaV0ubmFtZSkgcmV0dXJuIG1zZ3NbaV0ubmFtZTsgXAogfQoKIGlmICghc3RyaWNtcCh3Y2xhc3MsIkJ1dHRvbiIpKSBNU0dTRUFSQ0goQnV0TXNncyk7CiBNU0dTRUFSQ0goTXNnTmFtZXMpOwogLyogV01fVVNFUiAqLwogaWYgKG1zZz49V01fVVNFUikgewogIHNwcmludGYoYnVmZmVyLCJXTV9VU0VSKyUwNHh7JXN9Iixtc2ctV01fVVNFUix3Y2xhc3MpOwogIHJldHVybiBidWZmZXI7CiB9CiAvKiBtZXNzYWdlIG5vdCBmb3VuZCAqLwogc3ByaW50ZihidWZmZXIsIiUwNHh7JXN9Iixtc2csd2NsYXNzKTsKIHJldHVybiBidWZmZXI7Cn0KCmNoYXIqV25kTmFtZShIV05EIGhXbmQsaW50IHN0YXRlPVN0YXRlKQp7CiBzdGF0aWMgY2hhciBidWZmZXJbMTZdOwogaWYgKCFoV25kKSByZXR1cm4gIjAwMDAiOwogaWYgKGhXbmQ9PWhNYWluV25kIHx8IChzdGF0ZT09U1RBVEVfQ1JFQVRFICYmICFoTWFpblduZCkpIHJldHVybiAibWFpbiI7CiBpZiAoaFduZD09aFN1YlduZCB8fCAoc3RhdGU9PVNUQVRFX0NSRUFURSAmJiAhaFN1YlduZCkpIHJldHVybiAiY2hsZCI7CiBpZiAoaFduZD09aERpYWxvZyB8fCAoc3RhdGU9PVNUQVRFX0RJQUxPRyAmJiAhaERpYWxvZykpIHJldHVybiAidGRsZyI7CiBpZiAoaFduZD09aEdyb3VwKSByZXR1cm4gInRncnAiOwogaWYgKGhXbmQ9PWhCdXR0b25bMF0pIHJldHVybiAiYnV0MSI7CiBpZiAoaFduZD09aEJ1dHRvblsxXSkgcmV0dXJuICJidXQyIjsKIGlmIChoV25kPT1oQnV0dG9uWzJdKSByZXR1cm4gImJ1dDMiOwogaWYgKGhXbmQ9PWhCdXR0b25bM10pIHJldHVybiAiYnV0NCI7CiBpZiAoaFduZD09aFN1YkRsZyB8fCAoc3RhdGU9PVNUQVRFX0NSRUFURSAmJiAhaFN1YkRsZykpIHJldHVybiAic2RsZyI7CiBpZiAoaERpYWxvZykgewogIGludCBpZD1HZXREbGdDdHJsSUQoaFduZCk7CiAgaWYgKGlkKSB7CiAgIHNwcmludGYoYnVmZmVyLCJkbGdpdGVtKCVkKSIsaWQpOwogICByZXR1cm4gYnVmZmVyOwogIH0KIH0KIHNwcmludGYoYnVmZmVyLCIlMDR4IixoV25kKTsKIHJldHVybiBidWZmZXI7Cn0KCnZvaWQgTG9nKGNvbnN0IGNoYXIqZm10KQp7CiNpZmRlZiBMT0dHSU5HCiBpZiAoIUNsaWNrZWQpIFNlbmRNZXNzYWdlKGhMaXN0Qm94LExCX0FERFNUUklORywwLChMUEFSQU0pZm10KTsKI2VuZGlmCn0KCnZvaWQgTG9nZihjb25zdCBjaGFyKmZtdCwuLi4pCnsKIHZhX2xpc3QgcGFyOwogc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CgogdmFfc3RhcnQocGFyLGZtdCk7CiB2c3ByaW50ZihidWZmZXIsZm10LHBhcik7CiB2YV9lbmQocGFyKTsKIExvZyhidWZmZXIpOwp9Cgp2b2lkIExvZ0NoaWxkT3JkZXIoSFdORCBoV25kKQp7CiBIV05EIGhXbmRDaGlsZCA9IEdldFdpbmRvdyhoV25kLEdXX0NISUxEKTsKIGNoYXIqbmFtZTsKIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOwoKIHN0cmNweShidWZmZXIsImNoaWxkIGxpc3Q6Iik7CiB3aGlsZSAoaFduZENoaWxkKSB7CiAgc3RyY2F0KHN0cmNhdChidWZmZXIsIiAiKSxXbmROYW1lKGhXbmRDaGlsZCkpOwogIGhXbmRDaGlsZD1HZXRXaW5kb3coaFduZENoaWxkLEdXX0hXTkRORVhUKTsKIH0KIExvZyhidWZmZXIpOwp9Cgp2b2lkIExvZ01lc3NhZ2UoaW50IHN0YXRlLEhXTkQgaFduZCxVSU5UIG1zZyxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0sY2hhcipuYW1lPU5VTEwpCnsKIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOwogRFdPUkQgdGljaz1HZXRUaWNrQ291bnQoKS1TdGFydFRpbWU7CiBjaGFyKm1zZ25hbWU9TXNnTmFtZShtc2csaFduZCk7CiBpZiAoIW5hbWUpIG5hbWU9V25kTmFtZShoV25kLHN0YXRlKTsKIHN3aXRjaCAobXNnKSB7CiAgY2FzZSBXTV9TRVRGT0NVUzoKICBjYXNlIFdNX0tJTExGT0NVUzoKICBjYXNlIFdNX1NFVENVUlNPUjoKICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJXMsJTA4eCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCiAgICAgICAgbmFtZSxtc2duYW1lLFduZE5hbWUoKEhXTkQpd1BhcmFtKSxsUGFyYW0pOwogICBicmVhazsKI2lmZGVmIFdJTjMyCiAgY2FzZSBXTV9FTlRFUklETEU6CiAgY2FzZSBXTV9DVExDT0xPUkJUTjoKICBjYXNlIFdNX0NUTENPTE9SRExHOgogICBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDh4LCVzKSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKICAgICAgICBuYW1lLG1zZ25hbWUsd1BhcmFtLFduZE5hbWUoKEhXTkQpbFBhcmFtKSk7CiAgIGJyZWFrOwojZWxzZQogIGNhc2UgV01fRU5URVJJRExFOgogIGNhc2UgV01fQ1RMQ09MT1I6CiAgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwOHgsJTA0eDolcykiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCiAgICAgICAgbmFtZSxtc2duYW1lLHdQYXJhbSxISVdPUkQobFBhcmFtKSxXbmROYW1lKChIV05EKUxPV09SRChsUGFyYW0pKSk7CiAgIGJyZWFrOwojZW5kaWYKICBjYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOgogIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdFRDoKICAgewogICAgV0lORE9XUE9TKnBvcz0oV0lORE9XUE9TKilsUGFyYW07CiNpZmRlZiBXSU4zMgogICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlcCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCiAgICAgICAgIG5hbWUsbXNnbmFtZSx3UGFyYW0scG9zKTsKI2Vsc2UKICAgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwNHgsJXApIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAogICAgICAgICBuYW1lLG1zZ25hbWUsd1BhcmFtLHBvcyk7CiNlbmRpZgogICAgc3RyY3B5KGJ1ZmZlciwiRkxBR1M6Iik7CiAgICBpZiAocG9zLT5mbGFncyZTV1BfRFJBV0ZSQU1FKSBzdHJjYXQoYnVmZmVyLCIgRFJBV0ZSQU1FIik7CiAgICBpZiAocG9zLT5mbGFncyZTV1BfSElERVdJTkRPVykgc3RyY2F0KGJ1ZmZlciwiIEhJREVXSU5ET1ciKTsKICAgIGlmIChwb3MtPmZsYWdzJlNXUF9OT0FDVElWQVRFKSBzdHJjYXQoYnVmZmVyLCIgTk9BQ1RJVkFURSIpOwogICAgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PQ09QWUJJVFMpIHN0cmNhdChidWZmZXIsIiBOT0NPUFlCSVRTIik7CiAgICBpZiAocG9zLT5mbGFncyZTV1BfTk9NT1ZFKSBzdHJjYXQoYnVmZmVyLCIgTk9NT1ZFIik7CiAgICBpZiAocG9zLT5mbGFncyZTV1BfTk9PV05FUlpPUkRFUikgc3RyY2F0KGJ1ZmZlciwiIE5PT1dORVJaT1JERVIiKTsKICAgIGlmIChwb3MtPmZsYWdzJlNXUF9OT1NJWkUpIHN0cmNhdChidWZmZXIsIiBOT1NJWkUiKTsKICAgIGlmIChwb3MtPmZsYWdzJlNXUF9OT1JFRFJBVykgc3RyY2F0KGJ1ZmZlciwiIE5PUkVEUkFXIik7CiAgICBpZiAocG9zLT5mbGFncyZTV1BfTk9aT1JERVIpIHN0cmNhdChidWZmZXIsIiBOT1pPUkRFUiIpOwogICAgaWYgKHBvcy0+ZmxhZ3MmU1dQX1NIT1dXSU5ET1cpIHN0cmNhdChidWZmZXIsIiBTSE9XV0lORE9XIik7CiAgICBMb2coYnVmZmVyKTsKICAgfQogICBicmVhazsKICBkZWZhdWx0OgojaWZkZWYgV0lOMzIKICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlMDh4KSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKICAgICAgICBuYW1lLG1zZ25hbWUsd1BhcmFtLGxQYXJhbSk7CiNlbHNlCiAgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwNHgsJTA4eCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCiAgICAgICAgbmFtZSxtc2duYW1lLHdQYXJhbSxsUGFyYW0pOwojZW5kaWYKIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKiBHUkFQSElDUyBGQUNJTElUSUVTICoqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUGFpbnQoSFdORCBoV25kKQp7CiBIREMgZGM7CiBQQUlOVFNUUlVDVCBwczsKIGRjPUJlZ2luUGFpbnQoaFduZCwmcHMpOwogRW5kUGFpbnQoaFduZCwmcHMpOwp9Cgp2b2lkIEZpbGxQYXR0ZXJuKEhXTkQgaFduZCxIREMgcGRjPTApCnsKIEhEQyBkYz1wZGM/cGRjOkdldERDKGhXbmQpOwogSEJSVVNIIG9sZGJydXNoOwogUkVDVCByZWN0OwogaWYgKCFkYykgewogIExvZ2YoImZhaWxlZCB0byBhY3F1aXJlIERDIGZvciB3aW5kb3cgJXMiLFduZE5hbWUoaFduZCkpOwogIHJldHVybjsKIH0gZWxzZSB7CiAgTG9nZigiYWNxdWlyZWQgREMgZm9yICVzIHdpbmRvdyAlcywgcGFpbnRpbmciLAogICAgICAgSXNXaW5kb3dWaXNpYmxlKGhXbmQpPyJ2aXNpYmxlIjoiaW52aXNpYmxlIixXbmROYW1lKGhXbmQpKTsKIH0KIEdldENsaWVudFJlY3QoaFduZCwmcmVjdCk7CiBvbGRicnVzaD1TZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7CiBQYXRCbHQoZGMsMCwwLHJlY3QucmlnaHQscmVjdC5ib3R0b20sUEFUQ09QWSk7CiBTZWxlY3RPYmplY3QoZGMsb2xkYnJ1c2gpOwogaWYgKCFwZGMpIFJlbGVhc2VEQyhoV25kLGRjKTsKfQoKdm9pZCBQYWludFBhdHRlcm4oSFdORCBoV25kKQp7CiBIREMgZGM7CiBQQUlOVFNUUlVDVCBwczsKIGRjPUJlZ2luUGFpbnQoaFduZCwmcHMpOwogRmlsbFBhdHRlcm4oaFduZCxkYyk7CiBFbmRQYWludChoV25kLCZwcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqIFdJTkRPVyBQUk9DRURVUkVTICoqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBNQUlOIFdJTkRPVyAqLwpMUkVTVUxUIEZBUiBDQUxMQkFDSyBfZXhwb3J0IE1haW5XaW5kb3dQcm9jKEhXTkQgaFduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKIExSRVNVTFQgbFJlc3VsdD0wOwogUkVDVCByZWN0OwogaW50IE9sZFN0YXRlPVN0YXRlOwoKIFN0YXRlPVNUQVRFX1JFQ1VSUzsgUmVjKys7CiBpZiAoIUNsaWNrZWQpIExvZ01lc3NhZ2UoT2xkU3RhdGUsaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiBzd2l0Y2ggKG1zZykgewogIGNhc2UgV01fTkNISVRURVNUOgogICBsUmVzdWx0PURlZldpbmRvd1Byb2MoaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiAgIGJyZWFrOwogIGNhc2UgV01fTEJVVFRPTkRPV046CiAgY2FzZSBXTV9DSEFSOgogICBpZiAoIUNsaWNrZWQpIHsKICAgIFNldFBhcmVudChoTGlzdEJveCxoV25kKTsKICAgIEdldENsaWVudFJlY3QoaFduZCwmcmVjdCk7CiAgICBNb3ZlV2luZG93KGhMaXN0Qm94LDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLFRSVUUpOwogICAgU2hvd1dpbmRvdyhoTGlzdEJveCxTV19TSE9XKTsKICAgIFNldEZvY3VzKGhMaXN0Qm94KTsKICAgIENsaWNrZWQ9VFJVRTsKICAgfQogICBicmVhazsKICBjYXNlIFdNX1NJWkU6CiAgIEdldENsaWVudFJlY3QoaFduZCwmcmVjdCk7CiAgIGlmIChDbGlja2VkKSB7CiAgICBNb3ZlV2luZG93KGhMaXN0Qm94LDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLFRSVUUpOwogICB9CiAgIE1vdmVXaW5kb3coaFN1YlduZCwwLHJlY3QuYm90dG9tLzIscmVjdC5yaWdodCxyZWN0LmJvdHRvbS0ocmVjdC5ib3R0b20vMiksVFJVRSk7CiAgIGJyZWFrOwogIGNhc2UgV01fUEFJTlQ6CiAgIFBhaW50KGhXbmQpOwogICBicmVhazsKICBjYXNlIFdNX0RFU1RST1k6CiAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgbFJlc3VsdD1EZWZXaW5kb3dQcm9jKGhXbmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogfQogU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwogcmV0dXJuIGxSZXN1bHQ7Cn0KCi8qIENISUxEIFdJTkRPVyAqLwpMUkVTVUxUIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YldpbmRvd1Byb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewogTFJFU1VMVCBsUmVzdWx0PTA7CiBSRUNUIHJlY3Q7CiBpbnQgT2xkU3RhdGU9U3RhdGU7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKIHN3aXRjaCAobXNnKSB7CiAgY2FzZSBXTV9QQUlOVDoKICAgUGFpbnQoaFduZCk7CiAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgIGxSZXN1bHQ9RGVmV2luZG93UHJvYyhoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKIH0KIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKIHJldHVybiBsUmVzdWx0Owp9CgpCT09MIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YkRpYWxvZ1Byb2MoSFdORCBoV25kRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CgovKiBTVUJDTEFTU0VEIENPTlRST0xTICovCkxSRVNVTFQgRkFSIENBTExCQUNLIF9leHBvcnQgU3ViQ2xhc3NXaW5kb3dQcm9jKEhXTkQgaFduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKIExSRVNVTFQgbFJlc3VsdD0wOwogUkVDVCByZWN0OwogaW50IE9sZFN0YXRlPVN0YXRlOwogaW50IEJ1dD0tMTsKCiBpZiAoaFduZD09aEJ1dHRvblswXSkgQnV0PTA7IGVsc2UKIGlmIChoV25kPT1oQnV0dG9uWzFdKSBCdXQ9MTsgZWxzZQogaWYgKGhXbmQ9PWhCdXR0b25bMl0pIEJ1dD0yOyBlbHNlCiBpZiAoaFduZD09aEJ1dHRvblszXSkgQnV0PTM7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgewogIExvZ01lc3NhZ2UoT2xkU3RhdGUsaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiAgaWYgKEJ1dCE9LTEpIHsKICAgbFJlc3VsdD1DYWxsV2luZG93UHJvYygoRkFSUFJPQyl3bmRCdXR0b25bQnV0XSxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICAgaWYgKG1zZz09V01fTEJVVFRPTlVQKSB7CiAgICBMb2dDaGlsZE9yZGVyKEdldFBhcmVudChoV25kKSk7CiAgIH0KICB9CiAgZWxzZSBpZiAoaFduZD09aERpYWxvZykgewogICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZERpYWxvZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICB9CiAgZWxzZSBpZiAoaFduZD09aFN1YkRsZykgewogICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZFN1YkRsZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKICB9CiAgZWxzZSBpZiAoaFduZD09aEdyb3VwKSB7CiAgIGxSZXN1bHQ9Q2FsbFdpbmRvd1Byb2MoKEZBUlBST0Mpd25kR3JvdXAsaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7CiAgIGlmIChtc2c9PVdNX1NFVEZPQ1VTKSB7CiAgICAvKiBjcmVhdGUgc3ViZGlhbG9nICovCiAgICBpZiAoaFN1YkRsZykgewojaWYgMAogICAgIFNldFJlY3QoJnJlY3QsMCwwLDEsMSk7CiAgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwmcmVjdCxGQUxTRSk7CiNlbmRpZgogICAgfSBlbHNlIHsKI2lmZGVmIFRFU1RfU1VCRElBTE9HCiAgICAgU3RhdGU9U1RBVEVfQ1JFQVRFOwogICAgIGhTdWJEbGc9Q3JlYXRlRGlhbG9nKGhJbnN0LE1BS0VJTlRSRVNPVVJDRSgyKSxoV25kLChGQVJQUk9DKVN1YkRpYWxvZ1Byb2MpOwogICAgIFN0YXRlPVNUQVRFX1JFQ1VSUzsKI2Vsc2UKI2lmZGVmIFJFU0laRV9ESUFMT0cKICAgICBHZXRXaW5kb3dSZWN0KEdldFBhcmVudChoV25kKSwmcmVjdCk7CiAgICAgcmVjdC5yaWdodCsrOwogICAgIFNldFdpbmRvd1BvcyhHZXRQYXJlbnQoaFduZCksMCwwLDAsCiAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAogICAgICAgICAgICAgICAgICBTV1BfTk9NT1ZFfFNXUF9OT1pPUkRFUik7CiNlbmRpZgojZW5kaWYKICAgIH0KICAgfQogIH0KIH0KIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKIHJldHVybiBsUmVzdWx0Owp9CgovKiBNQUlOIERJQUxPRyBQUk9DRURVUkUgKi8KQk9PTCBGQVIgQ0FMTEJBQ0sgX2V4cG9ydCBUZXN0RGlhbG9nUHJvYyhIV05EIGhXbmREbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBCT09MIGJSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKIGludCBCdXQ9LTE7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtLCJkbGdwIik7CiBzd2l0Y2ggKG1zZykgewogIGNhc2UgV01fSU5JVERJQUxPRzoKICAgaERpYWxvZyA9IGhXbmREbGc7CiAgIC8qIHN1YmNsYXNzIGRpYWxvZyB3aW5kb3cgcHJvYyAqLwogICB3bmREaWFsb2cgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhEaWFsb2csR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKICAgTG9nZigiZGlhbG9nIHZpc2libGU9JXMiLElzV2luZG93VmlzaWJsZShoV25kRGxnKT8iVFJVRSI6IkZBTFNFIik7CiAgIC8qIHN1YmNsYXNzIE9LIGJ1dHRvbiAqLwogICBoQnV0dG9uWzNdID0gR2V0RGxnSXRlbShoV25kRGxnLElET0spOwogICB3bmRCdXR0b25bM10gPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhCdXR0b25bM10sR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKICAgLyogc3ViY2xhc3MgZ3JvdXAgYm94ICovCiAgIGhHcm91cCA9IEdldERsZ0l0ZW0oaFduZERsZyxJRENfR1JPVVBCT1gxKTsKICAgd25kR3JvdXAgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhHcm91cCxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwoKI2lmZGVmIFJFU0laRV9ESUFMT0cKICAgR2V0V2luZG93UmVjdChoV25kRGxnLCZyZWN0KTsKICAgcmVjdC5yaWdodC0tOwogICBTZXRXaW5kb3dQb3MoaFduZERsZywwLDAsMCwKICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAogICAgICAgICAgICAgICAgU1dQX05PTU9WRXxTV1BfTk9aT1JERVIpOwovLyAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kRGxnLElEQ0FOQ0VMKSxTV19ISURFKTsKI2VuZGlmCgogICBiUmVzdWx0PVRSVUU7IC8qIHdlIGRvbid0IGRvIFNldEZvY3VzICovCiAgIGJyZWFrOwogIGNhc2UgV01fUEFJTlQ6CiAgIFBhaW50UGF0dGVybihoV25kRGxnKTsKICAgYlJlc3VsdD1UUlVFOwogICBicmVhazsKICBjYXNlIFdNX0NPTU1BTkQ6CiAgIEVuZERpYWxvZyhoV25kRGxnLExPV09SRCh3UGFyYW0pKTsKICAgYlJlc3VsdD1UUlVFOwogICBicmVhazsKICBjYXNlIFdNX0NMT1NFOgogICBFbmREaWFsb2coaFduZERsZyxJRENBTkNFTCk7CiAgIGJSZXN1bHQ9VFJVRTsKICAgYnJlYWs7CiAgY2FzZSBXTV9OQ0RFU1RST1k6CiAgIGhEaWFsb2cgPSAwOwogICBicmVhazsKIH0KIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKIHJldHVybiBiUmVzdWx0Owp9CgovKiBTVUJESUFMT0cgUFJPQ0VEVVJFICovCkJPT0wgRkFSIENBTExCQUNLIF9leHBvcnQgU3ViRGlhbG9nUHJvYyhIV05EIGhXbmREbGcsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiBCT09MIGJSZXN1bHQ9MDsKIFJFQ1QgcmVjdDsKIGludCBPbGRTdGF0ZT1TdGF0ZTsKIGludCBCdXQ9LTE7CgogU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtKTsKIHN3aXRjaCAobXNnKSB7CiAgY2FzZSBXTV9JTklURElBTE9HOgogICBoU3ViRGxnID0gaFduZERsZzsKICAgLyogc3ViY2xhc3MgZGlhbG9nIHdpbmRvdyBwcm9jICovCiAgIHduZFN1YkRsZyA9IChXTkRQUk9DKVNldFdpbmRvd0xvbmcoaERpYWxvZyxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwoKICAgYlJlc3VsdD1UUlVFOyAvKiB3ZSBkb24ndCBkbyBTZXRGb2N1cyAqLwogICBicmVhazsKICBjYXNlIFdNX05DREVTVFJPWToKICAgaFN1YkRsZyA9IDA7CiAgIGJyZWFrOwogfQogU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwogcmV0dXJuIGJSZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKi8KLyoqKiBNQUlOIFBST0dSQU0gKioqLwovKioqKioqKioqKioqKioqKioqKiovCgpCT09MIEFwcEluaXQodm9pZCkKewogV05EQ0xBU1Mgd2NsYXNzOwoKIHdjbGFzcy5zdHlsZSA9IENTX0hSRURSQVd8Q1NfVlJFRFJBVzsKIHdjbGFzcy5scGZuV25kUHJvYyA9IE1haW5XaW5kb3dQcm9jOwogd2NsYXNzLmNiQ2xzRXh0cmEgPSAwOwogd2NsYXNzLmNiV25kRXh0cmEgPSAwOwogd2NsYXNzLmhJbnN0YW5jZSA9IGhJbnN0Owogd2NsYXNzLmhJY29uID0gTG9hZEljb24oaEluc3QsTUFLRUlOVFJFU09VUkNFKDEpKTsKIHdjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcigwLElEQ19BUlJPVyk7CiB3Y2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKIHdjbGFzcy5scHN6TWVudU5hbWUgPSBOVUxMOwogd2NsYXNzLmxwc3pDbGFzc05hbWUgPSB3Y2xhc3NuYW1lOwogaWYgKCFSZWdpc3RlckNsYXNzKCZ3Y2xhc3MpKSByZXR1cm4gRkFMU0U7CiB3Y2xhc3MubHBmblduZFByb2MgPSBTdWJXaW5kb3dQcm9jOwogd2NsYXNzLmxwc3pDbGFzc05hbWUgPSB3Y2NsYXNzbmFtZTsKIGlmICghUmVnaXN0ZXJDbGFzcygmd2NsYXNzKSkgcmV0dXJuIEZBTFNFOwogcmV0dXJuIFRSVUU7Cn0KCmludCBQQVNDQUwgV2luTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pDbWRMaW5lLCBpbnQgbkNtZFNob3cpCnsKIE1TRyBtc2c7CiBSRUNUIHJlY3Q7CgogaEluc3QgPSBoSW5zdGFuY2U7CiBpZiAoIWhQcmV2SW5zdGFuY2UpCiAgaWYgKCFBcHBJbml0KCkpCiAgIHJldHVybiAwOwoKIFN0YXJ0VGltZT1HZXRUaWNrQ291bnQoKTsKIGhMaXN0Qm94ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwiTWVzc2FnZXMiLFdTX0JPUkRFUnxXU19WU0NST0xMfFdTX0NISUxEfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJTX0hBU1NUUklOR1N8TEJTX05PVElGWXxMQlNfV0FOVEtFWUJPQVJESU5QVVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLEdldERlc2t0b3BXaW5kb3coKSwwLGhJbnN0LDApOwogaWYgKCFoTGlzdEJveCkgewogIE1lc3NhZ2VCb3goMCwiQ291bGQgbm90IGNyZWF0ZSBsaXN0IGJveCIsIkVycm9yIixNQl9PSyk7CiB9CgogU3RhdGU9U1RBVEVfQ1JFQVRFOwogaE1haW5XbmQgPSBDcmVhdGVXaW5kb3cod2NsYXNzbmFtZSx3aW5uYW1lLE1BSU5fU1RZTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDV19VU0VERUZBVUxULDAsNDAwLDMwMCwwLDAsaEluc3QsMCk7CiBpZiAoIWhNYWluV25kKSByZXR1cm4gMDsKIFN0YXRlPVNUQVRFX1NIT1c7CiBTaG93V2luZG93KGhNYWluV25kLG5DbWRTaG93KTsKI2lmZGVmIFRFU1RfREVTVFJPWV9NQUlOCiBTdGF0ZT1TVEFURV9ERVNUUk9ZOwogRGVzdHJveVdpbmRvdyhoTWFpblduZCk7CiBTdGF0ZT1TVEFURV9ESVJFQ1Q7CiB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLDAsMCwwKSkgewogIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CiAgU3RhdGU9U1RBVEVfRElTUEFUQ0g7CiAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwogIFN0YXRlPVNUQVRFX0RJUkVDVDsKIH0KIFN0YXRlPVNUQVRFX0NSRUFURTsKIGhNYWluV25kID0gQ3JlYXRlV2luZG93KHdjbGFzc25hbWUsd2lubmFtZSxNQUlOX1NUWUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwwLDQwMCwzMDAsMCwwLGhJbnN0LDApOwogaWYgKCFoTWFpblduZCkgcmV0dXJuIDA7CiBTdGF0ZT1TVEFURV9TSE9XOwogU2hvd1dpbmRvdyhoTWFpblduZCxuQ21kU2hvdyk7CiNlbmRpZgovKiB1cGRhdGUsIHNvIG5vIFdNX1BBSU5UcyBhcmUgcGVuZGluZyAqLwogU3RhdGU9U1RBVEVfVVBEQVRFOwovLyBVcGRhdGVXaW5kb3coaE1haW5XbmQpOwogUmVhZHk9VFJVRTsKLyogZmlsbCBjbGllbnQgYXJlYSB3aXRoIGEgcGF0dGVybiAqLwogRmlsbFBhdHRlcm4oaE1haW5XbmQpOwovKiBjcmVhdGUgc3Vid2luZG93ICovCiBTdGF0ZT1TVEFURV9DUkVBVEU7CiBHZXRDbGllbnRSZWN0KGhNYWluV25kLCZyZWN0KTsKIGhTdWJXbmQgPSBDcmVhdGVXaW5kb3cod2NjbGFzc25hbWUsd2lubmFtZSxXU19DSElMRHxXU19CT1JERVJ8V1NfQ0xJUFNJQkxJTkdTLAogICAgICAgICAgICAgICAgICAgICAgICAwLHJlY3QuYm90dG9tLzIscmVjdC5yaWdodCxyZWN0LmJvdHRvbS0ocmVjdC5ib3R0b20vMiksaE1haW5XbmQsMCxoSW5zdCwwKTsKIGlmICghaFN1YlduZCkgcmV0dXJuIDA7Ci8qIGNyZWF0ZSBidXR0b25zICovCiBoQnV0dG9uWzBdID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCIxIixXU19DSElMRHxXU19DTElQU0lCTElOR1N8V1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgOCw4LDQ4LDIwLGhNYWluV25kLDAsaEluc3QsMCk7CiBoQnV0dG9uWzFdID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCIyIixXU19DSElMRHxXU19DTElQU0lCTElOR1N8V1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsMTIsNDgsMjAsaE1haW5XbmQsMCxoSW5zdCwwKTsKIGhCdXR0b25bMl0gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIjMiLFdTX0NISUxEfFdTX0NMSVBTSUJMSU5HU3xXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICA1NiwxNiw0OCwyMCxoTWFpblduZCwwLGhJbnN0LDApOwovKiBzdWJjbGFzcyB0aGVtICovCiB3bmRCdXR0b25bMF0gPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhCdXR0b25bMF0sR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKIHduZEJ1dHRvblsxXSA9IChXTkRQUk9DKVNldFdpbmRvd0xvbmcoaEJ1dHRvblsxXSxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwogd25kQnV0dG9uWzJdID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoQnV0dG9uWzJdLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7Ci8qIHNob3cgdGhlbSAqLwogU3RhdGU9U1RBVEVfVVBEQVRFOwogVXBkYXRlV2luZG93KGhCdXR0b25bMF0pOwogTG9nQ2hpbGRPcmRlcihoTWFpblduZCk7CiBMb2dmKCJidXQxIHZpc2libGU9JWQiLElzV2luZG93VmlzaWJsZShoQnV0dG9uWzBdKSk7CgovKiBub3cgcmVwYXJlbnQgdGhlIGJ1dHRvbiB0byBvdXIgKGludmlzaWJsZSkgc3Vid2luZG93ICovCiBTdGF0ZT1TVEFURV9URVNUOwogLyogaW4gZGlmZmVyZW50IG9yZGVyLCBzZWVpbmcgd2hvIGdldHMgdG9wbW9zdCAqLwogU2V0UGFyZW50KGhCdXR0b25bMF0saFN1YlduZCk7CiBTZXRQYXJlbnQoaEJ1dHRvblsyXSxoU3ViV25kKTsKIFNldFBhcmVudChoQnV0dG9uWzFdLGhTdWJXbmQpOwogTG9nQ2hpbGRPcmRlcihoU3ViV25kKTsKLyogdGhlIGJ1dHRvbiBzaG91bGQgbm93IGJlIGludmlzaWJsZSAqLwogTG9nZigiYnV0MSB2aXNpYmxlPSVkIixJc1dpbmRvd1Zpc2libGUoaEJ1dHRvblswXSkpOwovKiBzZWUgaWYgd2UgY2FuIGRyYXcgb24gdGhlbSAqLwogRmlsbFBhdHRlcm4oaEJ1dHRvblswXSk7CgojaWZkZWYgU0hPV19TVUIKIFN0YXRlPVNUQVRFX1NIT1c7CiBTaG93V2luZG93KGhTdWJXbmQsU1dfU0hPV05PUk1BTCk7CiBTdGF0ZT1TVEFURV9VUERBVEU7CiBVcGRhdGVXaW5kb3coaFN1YlduZCk7CiBGaWxsUGF0dGVybihoU3ViV25kKTsKLy8gSW52YWxpZGF0ZVJlY3QoaE1haW5XbmQsTlVMTCxUUlVFKTsKIExvZ2YoImJ1dDEgdmlzaWJsZT0lZCIsSXNXaW5kb3dWaXNpYmxlKGhCdXR0b25bMF0pKTsKI2VuZGlmCgojaWZkZWYgVEVTVF9ESUFMT0cKIFN0YXRlPVNUQVRFX0RJQUxPRzsKIERpYWxvZ0JveChoSW5zdCxNQUtFSU5UUkVTT1VSQ0UoMSksaE1haW5XbmQsKEZBUlBST0MpVGVzdERpYWxvZ1Byb2MpOwojZW5kaWYKI2lmZGVmIFRFU1RfQ09NTUNUTAogewogIERXT1JEIGFyclsxNl07CiAgQ0hPT1NFQ09MT1IgY2M9e3NpemVvZihjYyksMCxoSW5zdCwwLGFyciwwfTsKICBDaG9vc2VDb2xvcigmY2MpOwogfQojZW5kaWYKCiBTdGF0ZT1TVEFURV9ESVJFQ1Q7CiB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLDAsMCwwKSkgewogIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CiAgU3RhdGU9U1RBVEVfRElTUEFUQ0g7CiAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwogIFN0YXRlPVNUQVRFX0RJUkVDVDsKIH0KIHJldHVybiAwOwp9CgoK