LyogCiAqIEltcGxlbWVudGF0aW9uIG9mIFZFUi5ETEwKICogCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAidmVyLmgiCiNpbmNsdWRlICJsemV4cGFuZC5oIgojaW5jbHVkZSAibW9kdWxlLmgiCiNpbmNsdWRlICJuZWV4ZS5oIgojaW5jbHVkZSAic3RkZGVidWcuaCIKI2luY2x1ZGUgImRlYnVnLmgiCiNpbmNsdWRlICJ4bWFsbG9jLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKCiNkZWZpbmUgTFpSRUFEKHdoYXQpIFwKICBpZiAoc2l6ZW9mKCp3aGF0KSE9TFpSZWFkMzIobHpmZCx3aGF0LHNpemVvZigqd2hhdCkpKSByZXR1cm4gMDsKI2RlZmluZSBMWlRFTEwobHpmZCkgTFpTZWVrMzIobHpmZCwgMCwgU0VFS19DVVIpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgIHZvaWQgIGRwcmludGZfdmVyX3N0cmluZygKICogICAgICBjaGFyIGNvbnN0ICogcHJvbG9ndWUsCiAqICAgICAgY2hhciBjb25zdCAqIHRlc3RzdHJpbmcsCiAqICAgICAgY2hhciBjb25zdCAqIGVwaWxvZ3VlICkKICoKICogICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJpbnQgdmlhIGRwcmludGZfdmVyIHRvIHN0ZGRlYiB0aGUgcHJvbG9ndWUgc3RyaW5nLAogKiAgIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRlc3RzdHJpbmcgYW5kIHRoZSBzdHJpbmcgaXQgY29udGFpbnMgaWYKICogICB0ZXN0c3RyaW5nIGlzIG5vbi1udWxsIG9yICIobnVsbCkiIG90aGVyd2lzZSwgYW5kIHRoZW4gdGhlIGVwaWxvZ3VlCiAqICAgc3RyaW5nLgogKgogKiAgIFJldmlzaW9uIGhpc3RvcnkKICogICAgICAzMC1NYXktMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICogICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCAgZHByaW50Zl92ZXJfc3RyaW5nKAogICAgY2hhciBjb25zdCAqIHByb2xvZ3VlLAogICAgY2hhciBjb25zdCAqIHRlc3RzdHJpbmcsCiAgICBjaGFyIGNvbnN0ICogZXBpbG9ndWUgKQp7CiAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICIlcyIsIHByb2xvZ3VlKTsKICAgIAogICAgaWYodGVzdHN0cmluZykKCWRwcmludGZfdmVyKHN0ZGRlYiwgIiVwIChcIiVzXCIpIiwgKHZvaWQgY29uc3QgKikgdGVzdHN0cmluZywKCQkgICAgdGVzdHN0cmluZyk7CiAgICBlbHNlCglkcHJpbnRmX3ZlcihzdGRkZWIsICIobnVsbCkiKTsKCiAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICIlcyIsIGVwaWxvZ3VlKTsKCiAgICByZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICBpbnQgIHRlc3RGaWxlRXhpc3RlbmNlKAogKiAgICAgIGNoYXIgY29uc3QgKiBwYXRoLAogKiAgICAgIGNoYXIgY29uc3QgKiBmaWxlICkKICoKICogICBUZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gcGF0aC9maWxlIGNvbWJpbmF0aW9uIGV4aXN0cy4gIElmIHRoZSBmaWxlIGRvZXMKICogICBub3QgZXhpc3QsIHRoZSByZXR1cm4gdmFsdWUgaXMgemVyby4gIElmIGl0IGRvZXMgZXhpc3QsIHRoZSByZXR1cm4KICogICB2YWx1ZSBpcyBub24temVyby4KICoKICogICBSZXZpc2lvbiBoaXN0b3J5CiAqICAgICAgMzAtTWF5LTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCiAqICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCAgdGVzdEZpbGVFeGlzdGVuY2UoCiAgIGNoYXIgY29uc3QgKiBwYXRoLAogICBjaGFyIGNvbnN0ICogZmlsZSApCnsKICAgIGNoYXIgIGZpbGVuYW1lWzEwMjRdOwogICAgaW50ICBmaWxlbmFtZWxlbjsKICAgIE9GU1RSVUNUICBmaWxlaW5mbzsKICAgIGludCAgcmV0dmFsOwoKICAgIGZpbGVpbmZvLmNCeXRlcyA9IHNpemVvZihPRlNUUlVDVCk7CgogICAgc3RyY3B5KGZpbGVuYW1lLCBwYXRoKTsKICAgIGZpbGVuYW1lbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKCiAgICAvKiBBZGQgYSB0cmFpbGluZyBcIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYoZmlsZW5hbWVsZW4pIHsKCWlmKGZpbGVuYW1lW2ZpbGVuYW1lbGVuIC0gMV0gIT0gJ1xcJykKCSAgICBzdHJjYXQoZmlsZW5hbWUsICJcXCIpOwogICAgfQogICAgZWxzZSAvKiBzcGVjaWZ5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwoJc3RyY3B5KGZpbGVuYW1lLCAiLlxcIik7CgogICAgLyogQ3JlYXRlIHRoZSBmdWxsIHBhdGhuYW1lICovCiAgICBzdHJjYXQoZmlsZW5hbWUsIGZpbGUpOwoKICAgIGlmKE9wZW5GaWxlMzIoZmlsZW5hbWUsICZmaWxlaW5mbywgT0ZfRVhJU1QpID09IEhGSUxFX0VSUk9SMzIpCglyZXR2YWwgPSAwOwogICAgZWxzZQoJcmV0dmFsID0gMTsKCiAgICByZXR1cm4gIHJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgIGludCAgdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2UoCiAqICAgICAgY2hhciBjb25zdCAqIHBhdGgsCiAqICAgICAgY2hhciBjb25zdCAqIGZpbGUgKQogKgogKiAgIFRlc3RzIHdoZXRoZXIgYSBnaXZlbiBwYXRoL2ZpbGUgY29tYmluYXRpb24gZXhpc3RzIGFuZCBlbnN1cmVzIHRoYXQgbm8KICogICBvdGhlciBwcm9ncmFtcyBoYXZlIGhhbmRsZXMgdG8gdGhlIGdpdmVuIGZpbGUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdAogKiAgIGV4aXN0IG9yIGlzIG9wZW4sIHRoZSByZXR1cm4gdmFsdWUgaXMgemVyby4gIElmIGl0IGRvZXMgZXhpc3QsIHRoZQogKiAgIHJldHVybiB2YWx1ZSBpcyBub24temVyby4KICoKICogICBSZXZpc2lvbiBoaXN0b3J5CiAqICAgICAgMzAtTWF5LTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCiAqICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCAgdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2UoCiAgIGNoYXIgY29uc3QgKiBwYXRoLAogICBjaGFyIGNvbnN0ICogZmlsZSApCnsKICAgIGNoYXIgIGZpbGVuYW1lWzEwMjRdOwogICAgaW50ICBmaWxlbmFtZWxlbjsKICAgIE9GU1RSVUNUICBmaWxlaW5mbzsKICAgIGludCAgcmV0dmFsOwoKICAgIGZpbGVpbmZvLmNCeXRlcyA9IHNpemVvZihPRlNUUlVDVCk7CgogICAgc3RyY3B5KGZpbGVuYW1lLCBwYXRoKTsKICAgIGZpbGVuYW1lbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKCiAgICAvKiBBZGQgYSB0cmFpbGluZyBcIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYoZmlsZW5hbWVsZW4pIHsKCWlmKGZpbGVuYW1lW2ZpbGVuYW1lbGVuIC0gMV0gIT0gJ1xcJykKCSAgICBzdHJjYXQoZmlsZW5hbWUsICJcXCIpOwogICAgfQogICAgZWxzZSAvKiBzcGVjaWZ5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwoJc3RyY3B5KGZpbGVuYW1lLCAiLlxcIik7CgogICAgLyogQ3JlYXRlIHRoZSBmdWxsIHBhdGhuYW1lICovCiAgICBzdHJjYXQoZmlsZW5hbWUsIGZpbGUpOwoKICAgIGlmKE9wZW5GaWxlMzIoZmlsZW5hbWUsICZmaWxlaW5mbywgT0ZfRVhJU1QgfCBPRl9TSEFSRV9FWENMVVNJVkUpID09CiAgICAgICBIRklMRV9FUlJPUjMyKQoJcmV0dmFsID0gMDsKICAgIGVsc2UKCXJldHZhbCA9IDE7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKCmludApyZWFkX25lX2hlYWRlcihIRklMRTMyIGx6ZmQsTFBJTUFHRV9PUzJfSEVBREVSIG5laGQpIHsKCUlNQUdFX0RPU19IRUFERVIJbXpoOwoKCUxaU2VlazMyKGx6ZmQsMCxTRUVLX1NFVCk7CglpZiAoc2l6ZW9mKG16aCkhPUxaUmVhZDMyKGx6ZmQsJm16aCxzaXplb2YobXpoKSkpCgkJcmV0dXJuIDA7CglpZiAobXpoLmVfbWFnaWMhPUlNQUdFX0RPU19TSUdOQVRVUkUpCgkJcmV0dXJuIDA7CglMWlNlZWszMihsemZkLG16aC5lX2xmYW5ldyxTRUVLX1NFVCk7CglMWlJFQUQobmVoZCk7CglpZiAobmVoZC0+bmVfbWFnaWMgPT0gSU1BR0VfT1MyX1NJR05BVFVSRSkgewoJCUxaU2VlazMyKGx6ZmQsbXpoLmVfbGZhbmV3LFNFRUtfU0VUKTsKCQlyZXR1cm4gMTsKCX0KCWZwcmludGYoc3RkZXJyLCJtaXNjL3Zlci5jOnJlYWRfbmVfaGVhZGVyOmNhbid0IGhhbmRsZSBQRSBmaWxlcyB5ZXQuXG4iKTsKCS8qIG11c3QgaGFuZGxlIFBFIGZpbGVzIHRvby4gTGF0ZXIuICovCglyZXR1cm4gMDsKfQoKCmludApmaW5kX25lX3Jlc291cmNlKAoJSEZJTEUzMiBsemZkLExQSU1BR0VfT1MyX0hFQURFUiBuZWhkLFNFR1BUUiB0eXBlaWQsU0VHUFRSIHJlc2lkLAoJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgopIHsKCU5FX1RZUEVJTkZPCXRpOwoJTkVfTkFNRUlORk8Jbmk7CglpbnQJCWk7CglXT1JECQlzaGlmdGNvdW50OwoJRFdPUkQJCW5laGRvZmZzZXQ7CgoJbmVoZG9mZnNldCA9IExaVEVMTChsemZkKTsKCUxaU2VlazMyKGx6ZmQsbmVoZC0+cmVzb3VyY2VfdGFiX29mZnNldCxTRUVLX0NVUik7CglMWlJFQUQoJnNoaWZ0Y291bnQpOwoJZHByaW50Zl92ZXIoc3RkZGViLCJzaGlmdGNvdW50IGlzICVkXG4iLHNoaWZ0Y291bnQpOwoJZHByaW50Zl92ZXIoc3RkZGViLCJyZWFkaW5nIHJlc291cmNlIHR5cGVpbmZvIGRpci5cbiIpOwoKCWlmICghSElXT1JEKHR5cGVpZCkpIHR5cGVpZCA9IChTRUdQVFIpKExPV09SRCh0eXBlaWQpIHwgMHg4MDAwKTsKCWlmICghSElXT1JEKHJlc2lkKSkgIHJlc2lkICA9IChTRUdQVFIpKExPV09SRChyZXNpZCkgfCAweDgwMDApOwoJd2hpbGUgKDEpIHsKCQlpbnQJc2tpcGZsYWc7CgoJCUxaUkVBRCgmdGkpOwoJCWlmICghdGkudHlwZV9pZCkKCQkJcmV0dXJuIDA7CgkJZHByaW50Zl92ZXIoc3RkZGViLCIgICAgdGkudHlwZWlkID0lMDR4LGNvdW50PSVkXG4iLHRpLnR5cGVfaWQsdGkuY291bnQpOwoJCXNraXBmbGFnPTA7CgkJaWYgKCFISVdPUkQodHlwZWlkKSkgewoJCQlpZiAoKHRpLnR5cGVfaWQmMHg4MDAwKSYmKHR5cGVpZCE9dGkudHlwZV9pZCkpCgkJCQlza2lwZmxhZz0xOwoJCX0gZWxzZSB7CgkJCWlmICh0aS50eXBlX2lkICYgMHg4MDAwKSB7CgkJCQlza2lwZmxhZz0xOyAKCQkJfSBlbHNlIHsKCQkJCUJZVEUJbGVuOwoJCQkJY2hhcgkqc3RyOwoJCQkJRFdPUkQJd2hlcmVsZWZ0OwoKCQkJCXdoZXJlbGVmdCA9IExaVEVMTChsemZkKTsKCQkJCUxaU2VlazMyKAoJCQkJCWx6ZmQsCgkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K3RpLnR5cGVfaWQsCgkJCQkJU0VFS19TRVQKCQkJCSk7CgkJCQlMWlJFQUQoJmxlbik7CgkJCQlzdHI9eG1hbGxvYyhsZW4pOwoJCQkJaWYgKGxlbiE9TFpSZWFkMzIobHpmZCxzdHIsbGVuKSkKCQkJCQlyZXR1cm4gMDsKCQkJCWRwcmludGZfdmVyKHN0ZGRlYiwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCgkJCQkJc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpCgkJCQkpOwoJCQkJaWYgKGxzdHJjbXBpMzJBKHN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKSkpCgkJCQkJc2tpcGZsYWc9MTsKCQkJCWZyZWUoc3RyKTsKCQkJCUxaU2VlazMyKGx6ZmQsd2hlcmVsZWZ0LFNFRUtfU0VUKTsKCQkJfQoJCX0KCQlpZiAoc2tpcGZsYWcpIHsKCQkJTFpTZWVrMzIobHpmZCx0aS5jb3VudCpzaXplb2YobmkpLFNFRUtfQ1VSKTsKCQkJY29udGludWU7CgkJfQoJCWZvciAoaT0wO2k8dGkuY291bnQ7aSsrKSB7CgkJCVdPUkQJKnJkYXRhOwoJCQlpbnQJbGVuOwoKCQkJTFpSRUFEKCZuaSk7CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAoJCQkJbmkuaWQsbmkub2Zmc2V0LG5pLmxlbmd0aAoJCQkpOwoJCQlza2lwZmxhZz0xOwoJCQlpZiAoIUhJV09SRChyZXNpZCkpIHsKCQkJCWlmIChuaS5pZCA9PSByZXNpZCkKCQkJCQlza2lwZmxhZz0wOwoJCQl9IGVsc2UgewoJCQkJaWYgKCEobmkuaWQgJiAweDgwMDApKSB7CgkJCQkJQllURQlsZW47CgkJCQkJY2hhcgkqc3RyOwoJCQkJCURXT1JECXdoZXJlbGVmdDsKCgkJCQkJd2hlcmVsZWZ0ID0gTFpURUxMKGx6ZmQpOwoJCQkJCSAgTFpTZWVrMzIoCgkJCQkJCWx6ZmQsCgkJCQkJCW5laGRvZmZzZXQrbmVoZC0+cmVzb3VyY2VfdGFiX29mZnNldCtuaS5pZCwKCQkJCQkJU0VFS19TRVQKCQkJCQkpOwoJCQkJCUxaUkVBRCgmbGVuKTsKCQkJCQlzdHI9eG1hbGxvYyhsZW4pOwoJCQkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQsc3RyLGxlbikpCgkJCQkJCXJldHVybiAwOwoJCQkJCWRwcmludGZfdmVyKHN0ZGRlYiwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCgkJCQkJCXN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKQoJCQkJCSk7CgkJCQkJaWYgKCFsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQoJCQkJCQlza2lwZmxhZz0wOwoJCQkJCWZyZWUoc3RyKTsKCQkJCQlMWlNlZWszMihsemZkLHdoZXJlbGVmdCxTRUVLX1NFVCk7CgkJCQl9CgkJCX0KCQkJaWYgKHNraXBmbGFnKQoJCQkJY29udGludWU7CgkJCUxaU2VlazMyKGx6ZmQsKChpbnQpbmkub2Zmc2V0PDxzaGlmdGNvdW50KSxTRUVLX1NFVCk7CgkJCSpvZmYJPSAoaW50KW5pLm9mZnNldDw8c2hpZnRjb3VudDsKCQkJbGVuCT0gbmkubGVuZ3RoPDxzaGlmdGNvdW50OwoJCQlyZGF0YT0oV09SRCopeG1hbGxvYyhsZW4pOwoJCQlpZiAobGVuIT1MWlJlYWQzMihsemZkLHJkYXRhLGxlbikpIHsKCQkJCWZyZWUocmRhdGEpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQkJZHByaW50Zl92ZXIoc3RkZGViLCJyZXNvdXJjZSBmb3VuZC5cbiIpOwoJCQkqcmVzZGF0YT0gKEJZVEUqKXJkYXRhOwoJCQkqcmVzbGVuCT0gbGVuOwoJCQlyZXR1cm4gMTsKCQl9Cgl9Cn0KCi8qIEdldEZpbGVSZXNvdXJjZVNpemUJCQkJW1ZFUi4yXSAqLwpEV09SRApHZXRGaWxlUmVzb3VyY2VTaXplKExQQ1NUUiBmaWxlbmFtZSxTRUdQVFIgcmVzdHlwZSxTRUdQVFIgcmVzaWQsTFBEV09SRCBvZmYpIHsKCUhGSUxFMzIJCQlsemZkOwoJT0ZTVFJVQ1QJCW9mczsKCUJZVEUJCQkqcmVzZGF0YTsKCWludAkJCXJlc2xlbjsKCUlNQUdFX09TMl9IRUFERVIJbmVoZDsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVSZXNvdXJjZVNpemUoJXMsJWx4LCVseCwlcClcbiIsCgkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYKCSk7CglsemZkPUxaT3BlbkZpbGUzMkEoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKCWlmIChsemZkPT0wKQoJCXJldHVybiAwOwoJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCUxaQ2xvc2UzMihsemZkKTsKCQlyZXR1cm4gMDsKCX0KCWlmICghZmluZF9uZV9yZXNvdXJjZShsemZkLCZuZWhkLHJlc3R5cGUscmVzaWQsJnJlc2RhdGEsJnJlc2xlbixvZmYpKSB7CgkJTFpDbG9zZTMyKGx6ZmQpOwoJCXJldHVybiAwOwoJfQoJZnJlZShyZXNkYXRhKTsKCUxaQ2xvc2UzMihsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCi8qIEdldEZpbGVSZXNvdXJjZQkJCQlbVkVSLjNdICovCkRXT1JECkdldEZpbGVSZXNvdXJjZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLAoJCURXT1JEIG9mZixEV09SRCBkYXRhbGVuLExQVk9JRCBkYXRhCikgewoJSEZJTEUzMgkJCWx6ZmQ7CglPRlNUUlVDVAkJb2ZzOwoJQllURQkJCSpyZXNkYXRhOwoJaW50CQkJcmVzbGVuPWRhdGFsZW47CglJTUFHRV9PUzJfSEVBREVSCW5laGQ7CglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVSZXNvdXJjZSglcywlbHgsJWx4LCVsZCwlbGQsJXApXG4iLAoJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmLGRhdGFsZW4sZGF0YQoJKTsKCglsemZkPUxaT3BlbkZpbGUzMkEoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKCWlmIChsemZkPT0wKQoJCXJldHVybiAwOwoJaWYgKCFvZmYpIHsKCQlpZiAoIXJlYWRfbmVfaGVhZGVyKGx6ZmQsJm5laGQpKSB7CgkJCUxaQ2xvc2UzMihsemZkKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWlmICghZmluZF9uZV9yZXNvdXJjZShsemZkLCZuZWhkLHJlc3R5cGUscmVzaWQsJnJlc2RhdGEsJnJlc2xlbiwmb2ZmKSkgewoJCQlMWkNsb3NlMzIobHpmZCk7CgkJCXJldHVybiAwOwoJCX0KCQlmcmVlKHJlc2RhdGEpOwoJfQoJTFpTZWVrMzIobHpmZCxvZmYsU0VFS19TRVQpOwoJaWYgKHJlc2xlbj5kYXRhbGVuKQoJCXJlc2xlbj1kYXRhbGVuOwoJTFpSZWFkMzIobHpmZCxkYXRhLHJlc2xlbik7CglMWkNsb3NlMzIobHpmZCk7CglyZXR1cm4gcmVzbGVuOwp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm9TaXplCQkJW1ZFUi42XSAqLwpEV09SRApHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoTFBDU1RSIGZpbGVuYW1lLExQRFdPUkQgaGFuZGxlKSB7CglEV09SRAlsZW4scmV0OwoJQllURQlidWZbNzJdOwoJVlNfRklYRURGSUxFSU5GTyAqdmZmaTsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIkdldEZpbGVWZXJzaW9uSW5mb1NpemUxNiglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKCWxlbj1HZXRGaWxlUmVzb3VyY2VTaXplKGZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8saGFuZGxlKTsKCWlmICghbGVuKQoJCXJldHVybiAwOwoJcmV0PUdldEZpbGVSZXNvdXJjZSgKCQlmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLCpoYW5kbGUsc2l6ZW9mKGJ1ZiksYnVmCgkpOwoJaWYgKCFyZXQpCgkJcmV0dXJuIDA7CgoJdmZmaT0oVlNfRklYRURGSUxFSU5GTyopKGJ1ZisweDE0KTsKCWlmICh2ZmZpLT5kd1NpZ25hdHVyZSAhPSBWU19GRklfU0lHTkFUVVJFKQoJCXJldHVybiAwOwoJaWYgKCooV09SRCopYnVmIDwgbGVuKQoJCWxlbiA9ICooV09SRCopYnVmOwoJZHByaW50Zl92ZXIoc3RkZGViLCItPnN0cnVjdmVyPSVsZC4lbGQsZmlsZXZlcj0lbGQuJWxkLHByb2R1Y3R2ZXI9JWxkLiVsZCxmbGFnbWFzaz0lbHgsZmxhZ3M9JWx4LE9TPSIsCgkJKHZmZmktPmR3U3RydWNWZXJzaW9uPj4xNiksdmZmaS0+ZHdTdHJ1Y1ZlcnNpb24mMHhGRkZGLAoJCXZmZmktPmR3RmlsZVZlcnNpb25NUyx2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMsCgkJdmZmaS0+ZHdQcm9kdWN0VmVyc2lvbk1TLHZmZmktPmR3UHJvZHVjdFZlcnNpb25MUywKCQl2ZmZpLT5kd0ZpbGVGbGFnc01hc2ssdmZmaS0+ZHdGaWxlRmxhZ3MKCSk7Cglzd2l0Y2ggKHZmZmktPmR3RmlsZU9TJjB4RkZGRjAwMDApIHsKCWNhc2UgVk9TX0RPUzpkcHJpbnRmX3ZlcihzdGRkZWIsIkRPUywiKTticmVhazsKCWNhc2UgVk9TX09TMjE2OmRwcmludGZfdmVyKHN0ZGRlYiwiT1MvMi0xNiwiKTticmVhazsKCWNhc2UgVk9TX09TMjMyOmRwcmludGZfdmVyKHN0ZGRlYiwiT1MvMi0zMiwiKTticmVhazsKCWNhc2UgVk9TX05UOmRwcmludGZfdmVyKHN0ZGRlYiwiTlQsIik7YnJlYWs7CgljYXNlIFZPU19VTktOT1dOOgoJZGVmYXVsdDoKCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlVOS05PV04oJWxkKSwiLHZmZmktPmR3RmlsZU9TJjB4RkZGRjAwMDApO2JyZWFrOwoJfQoJc3dpdGNoICh2ZmZpLT5kd0ZpbGVPUyAmIDB4RkZGRikgewoJY2FzZSBWT1NfX0JBU0U6ZHByaW50Zl92ZXIoc3RkZGViLCJCQVNFIik7YnJlYWs7CgljYXNlIFZPU19fV0lORE9XUzE2OmRwcmludGZfdmVyKHN0ZGRlYiwiV0lOMTYiKTticmVhazsKCWNhc2UgVk9TX19XSU5ET1dTMzI6ZHByaW50Zl92ZXIoc3RkZGViLCJXSU4zMiIpO2JyZWFrOwoJY2FzZSBWT1NfX1BNMTY6ZHByaW50Zl92ZXIoc3RkZGViLCJQTTE2Iik7YnJlYWs7CgljYXNlIFZPU19fUE0zMjpkcHJpbnRmX3ZlcihzdGRkZWIsIlBNMzIiKTticmVhazsKCWRlZmF1bHQ6ZHByaW50Zl92ZXIoc3RkZGViLCJVTktOT1dOKCVsZCkiLHZmZmktPmR3RmlsZU9TJjB4RkZGRik7YnJlYWs7Cgl9Cglzd2l0Y2ggKHZmZmktPmR3RmlsZVR5cGUpIHsKCWRlZmF1bHQ6CgljYXNlIFZGVF9VTktOT1dOOgoJCWRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9VW5rbm93biglbGQpIix2ZmZpLT5kd0ZpbGVUeXBlKTsKCQlicmVhazsKCWNhc2UgVkZUX0FQUDpkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPUFQUCIpO2JyZWFrOwoJY2FzZSBWRlRfRExMOmRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9RExMIik7YnJlYWs7CgljYXNlIFZGVF9EUlY6CgkJZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1EUlYsIik7CgkJc3dpdGNoKHZmZmktPmR3RmlsZVN1YnR5cGUpIHsKCQlkZWZhdWx0OgoJCWNhc2UgVkZUMl9VTktOT1dOOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlVOS05PV04oJWxkKSIsdmZmaS0+ZHdGaWxlU3VidHlwZSk7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfUFJJTlRFUjoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJQUklOVEVSIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfS0VZQk9BUkQ6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiS0VZQk9BUkQiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9MQU5HVUFHRToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJMQU5HVUFHRSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0RJU1BMQVk6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiRElTUExBWSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX01PVVNFOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIk1PVVNFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfTkVUV09SSzoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJORVRXT1JLIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfU1lTVEVNOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlNZU1RFTSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0lOU1RBTExBQkxFOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIklOU1RBTExBQkxFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfU09VTkQ6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiU09VTkQiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9DT01NOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIkNPTU0iKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9JTlBVVE1FVEhPRDoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJJTlBVVE1FVEhPRCIpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CgljYXNlIFZGVF9GT05UOgoJCWRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9Rk9OVC4iKTsKCQlzd2l0Y2ggKHZmZmktPmR3RmlsZVN1YnR5cGUpIHsKCQlkZWZhdWx0OgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlVOS05PV04oJWxkKSIsdmZmaS0+ZHdGaWxlU3VidHlwZSk7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9GT05UX1JBU1RFUjpkcHJpbnRmX3ZlcihzdGRkZWIsIlJBU1RFUiIpO2JyZWFrOwoJCWNhc2UgVkZUMl9GT05UX1ZFQ1RPUjpkcHJpbnRmX3ZlcihzdGRkZWIsIlZFQ1RPUiIpO2JyZWFrOwoJCWNhc2UgVkZUMl9GT05UX1RSVUVUWVBFOmRwcmludGZfdmVyKHN0ZGRlYiwiVFJVRVRZUEUiKTticmVhazsKCQl9CgkJYnJlYWs7CgljYXNlIFZGVF9WWEQ6ZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1WWEQiKTticmVhazsKCWNhc2UgVkZUX1NUQVRJQ19MSUI6ZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1TVEFUSUNfTElCIik7YnJlYWs7Cgl9CglkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGVkYXRhPSVseC4lbHhcbiIsdmZmaS0+ZHdGaWxlRGF0ZU1TLHZmZmktPmR3RmlsZURhdGVMUyk7CglyZXR1cm4gbGVuOwp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBCQkJW1ZFUlNJT04uMV0gKi8KRFdPUkQKR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyQShMUENTVFIgZmlsZW5hbWUsTFBEV09SRCBoYW5kbGUpIHsKCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyQSglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKCXJldHVybiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoZmlsZW5hbWUsaGFuZGxlKTsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyVwkJCVtWRVJTSU9OLjJdICovCkRXT1JEIEdldEZpbGVWZXJzaW9uSW5mb1NpemUzMlcoIExQQ1dTVFIgZmlsZW5hbWUsIExQRFdPUkQgaGFuZGxlICkKewogICAgTFBTVFIgeGZuID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBmaWxlbmFtZSApOwogICAgRFdPUkQgcmV0ID0gR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTE2KCB4Zm4sIGhhbmRsZSApOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHhmbiApOwogICAgcmV0dXJuIHJldDsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvCQkJCVtWRVIuN10gKi8KRFdPUkQgCkdldEZpbGVWZXJzaW9uSW5mbzE2KExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsTFBWT0lEIGRhdGEpIHsKCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVZlcnNpb25JbmZvMTYoJXMsJWxkLCVsZCwlcClcbi0+IiwKCQlmaWxlbmFtZSxoYW5kbGUsZGF0YXNpemUsZGF0YQoJKTsKCXJldHVybiBHZXRGaWxlUmVzb3VyY2UoCgkJZmlsZW5hbWUsVlNfRklMRV9JTkZPLFZTX1ZFUlNJT05fSU5GTyxoYW5kbGUsZGF0YXNpemUsZGF0YQoJKTsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvQQkJCQlbVkVSU0lPTi4wXSAqLwpEV09SRCAKR2V0RmlsZVZlcnNpb25JbmZvMzJBKExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsTFBWT0lEIGRhdGEpIHsKCXJldHVybiBHZXRGaWxlVmVyc2lvbkluZm8xNihmaWxlbmFtZSxoYW5kbGUsZGF0YXNpemUsZGF0YSk7Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mb1cJCQkJW1ZFUlNJT04uM10gKi8KRFdPUkQgR2V0RmlsZVZlcnNpb25JbmZvMzJXKCBMUENXU1RSIGZpbGVuYW1lLCBEV09SRCBoYW5kbGUsIERXT1JEIGRhdGFzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBkYXRhKQp7CiAgICBMUFNUUiBmbiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZmlsZW5hbWUgKTsKICAgIERXT1JEIHJldCA9IEdldEZpbGVWZXJzaW9uSW5mbzE2KCBmbiwgaGFuZGxlLCBkYXRhc2l6ZSwgZGF0YSApOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGZuICk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICBWZXJGaW5kRmlsZSgpIFtWRVIuOF0KICogICBEZXRlcm1pbmVzIHdoZXJlIHRvIGluc3RhbGwgYSBmaWxlIGJhc2VkIG9uIHdoZXRoZXIgaXQgbG9jYXRlcyBhbm90aGVyCiAqICAgdmVyc2lvbiBvZiB0aGUgZmlsZSBpbiB0aGUgc3lzdGVtLiAgVGhlIHZhbHVlcyBWZXJGaW5kRmlsZSByZXR1cm5zIGFyZQogKiAgIHVzZWQgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gdGhlIFZlckluc3RhbGxGaWxlIGZ1bmN0aW9uLgogKgogKiAgIFJldmlzaW9uIGhpc3Rvcnk6CiAqICAgICAgMzAtTWF5LTE5OTcgICBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICogICAgICAgICBSZWltcGxlbWVudGF0aW9uIG9mIFZlckZpbmRGaWxlIGZyb20gb3JpZ2luYWwgc3R1Yi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpEV09SRCBWZXJGaW5kRmlsZTE2KAogICAgVUlOVDE2IGZsYWdzLAogICAgTFBDU1RSIGxwc3pGaWxlbmFtZSwKICAgIExQQ1NUUiBscHN6V2luRGlyLAogICAgTFBDU1RSIGxwc3pBcHBEaXIsCiAgICBMUFNUUiBscHN6Q3VyRGlyLAogICAgVUlOVDE2ICpscHVDdXJEaXJMZW4sCiAgICBMUFNUUiBscHN6RGVzdERpciwKICAgIFVJTlQxNiAqbHB1RGVzdERpckxlbiApCnsKICAgIERXT1JEICByZXR2YWw7CiAgICBjaGFyICBjdXJEaXJbMjU2XTsKICAgIGNoYXIgIGRlc3REaXJbMjU2XTsKICAgIHVuc2lnbmVkIGludCAgY3VyRGlyU2l6ZVJlcTsKICAgIHVuc2lnbmVkIGludCAgZGVzdERpclNpemVSZXE7CgogICAgcmV0dmFsID0gMDsKCiAgICAvKiBQcmludCBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCiAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICJWZXJGaW5kRmlsZSgpIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnM6XG4iCgkJIlx0ZmxhZ3MgPSAleCIsIGZsYWdzKTsKICAgIGlmKGZsYWdzICYgVkZGRl9JU1NIQVJFREZJTEUpCglkcHJpbnRmX3ZlcihzdGRkZWIsICIgKFZGRkZfSVNTSEFSRURGSUxFKVxuIik7CiAgICBlbHNlCglkcHJpbnRmX3ZlcihzdGRkZWIsICJcbiIpOwoKICAgIGRwcmludGZfdmVyX3N0cmluZygiXHRscHN6RmlsZW5hbWUgPSAiLCBscHN6RmlsZW5hbWUsICJcbiIpOwogICAgZHByaW50Zl92ZXJfc3RyaW5nKCJcdGxwc3pXaW5EaXIgPSAiLCBscHN6V2luRGlyLCAiXG4iKTsKICAgIGRwcmludGZfdmVyX3N0cmluZygiXHRscHN6QXBwRGlyID0gIiwgbHBzekFwcERpciwgIlxuIik7CgogICAgZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHN6Q3VyRGlyID0gJXBcbiIsIGxwc3pDdXJEaXIpOwogICAgaWYobHB1Q3VyRGlyTGVuKQoJZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHVDdXJEaXJMZW4gPSAlcCAoJXUpXG4iLAoJCSAgICBscHVDdXJEaXJMZW4sICpscHVDdXJEaXJMZW4pOwogICAgZWxzZQoJZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOwoKICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlx0bHBzekRlc3REaXIgPSAlcFxuIiwgbHBzekRlc3REaXIpOwogICAgaWYobHB1RGVzdERpckxlbikKCWRwcmludGZfdmVyKHN0ZGRlYiwgIlx0bHB1RGVzdERpckxlbiA9ICVwICgldSlcbiIsCgkJICAgIGxwdURlc3REaXJMZW4sICpscHVEZXN0RGlyTGVuKTsKCiAgICAvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBmaWxlIHNob3VsZCBnbzsgc2hhcmVkIGZpbGVzIGRlZmF1bHQgdG8gdGhlCiAgICAgICBzeXN0ZW0gZGlyZWN0b3J5ICovCgogICAgc3RyY3B5KGN1ckRpciwgIiIpOwogICAgc3RyY3B5KGRlc3REaXIsICIiKTsKCiAgICBpZihmbGFncyAmIFZGRkZfSVNTSEFSRURGSUxFICYmICFnZXR1aWQoKSkgewoJR2V0U3lzdGVtRGlyZWN0b3J5MzJBKGRlc3REaXIsIDI1Nik7CgoJLyogV2VyZSB3ZSBnaXZlbiBhIGZpbGVuYW1lPyAgSWYgc28sIHRyeSB0byBmaW5kIHRoZSBmaWxlLiAqLwoJaWYobHBzekZpbGVuYW1lKSB7CgkgICAgaWYodGVzdEZpbGVFeGlzdGVuY2UoZGVzdERpciwgbHBzekZpbGVuYW1lKSkgewoJCXN0cmNweShjdXJEaXIsIGRlc3REaXIpOwoKCQlpZighdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2UoZGVzdERpciwgbHBzekZpbGVuYW1lKSkKCQkgICAgcmV0dmFsIHw9IFZGRl9GSUxFSU5VU0U7CgkgICAgfQoJICAgIGVsc2UgaWYobHBzekFwcERpciAmJiB0ZXN0RmlsZUV4aXN0ZW5jZShscHN6QXBwRGlyLAoJCQkJCQkgICAgbHBzekZpbGVuYW1lKSkgewoJCXN0cmNweShjdXJEaXIsIGxwc3pBcHBEaXIpOwoJCXJldHZhbCB8PSBWRkZfQ1VSTkVERVNUOwoKCQlpZighdGVzdEZpbGVFeGNsdXNpdmVFeGlzdGVuY2UobHBzekFwcERpciwgbHBzekZpbGVuYW1lKSkKCQkgICAgcmV0dmFsIHw9IFZGRl9GSUxFSU5VU0U7CgkgICAgfQoJfQogICAgfQogICAgZWxzZSBpZighKGZsYWdzICYgVkZGRl9JU1NIQVJFREZJTEUpKSB7IC8qIG5vdCBhIHNoYXJlZCBmaWxlICovCglpZihscHN6QXBwRGlyKSB7CgkgICAgY2hhciAgc3lzdGVtRGlyWzI1Nl07CgkgICAgR2V0U3lzdGVtRGlyZWN0b3J5MzJBKHN5c3RlbURpciwgMjU2KTsKCgkgICAgc3RyY3B5KGRlc3REaXIsIGxwc3pBcHBEaXIpOwoKCSAgICBpZihscHN6RmlsZW5hbWUpIHsKCQlpZih0ZXN0RmlsZUV4aXN0ZW5jZShscHN6QXBwRGlyLCBscHN6RmlsZW5hbWUpKSB7CgkJICAgIHN0cmNweShjdXJEaXIsIGxwc3pBcHBEaXIpOwoKCQkgICAgaWYoIXRlc3RGaWxlRXhjbHVzaXZlRXhpc3RlbmNlKGxwc3pBcHBEaXIsIGxwc3pGaWxlbmFtZSkpCgkJCXJldHZhbCB8PSBWRkZfRklMRUlOVVNFOwoJCX0KCQllbHNlIGlmKHRlc3RGaWxlRXhpc3RlbmNlKHN5c3RlbURpciwgbHBzekZpbGVuYW1lKSkgewoJCSAgICBzdHJjcHkoY3VyRGlyLCBzeXN0ZW1EaXIpOwoJCSAgICByZXR2YWwgfD0gVkZGX0NVUk5FREVTVDsKCgkJICAgIGlmKCF0ZXN0RmlsZUV4Y2x1c2l2ZUV4aXN0ZW5jZShzeXN0ZW1EaXIsIGxwc3pGaWxlbmFtZSkpCgkJCXJldHZhbCB8PSBWRkZfRklMRUlOVVNFOwoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgY3VyRGlyU2l6ZVJlcSA9IHN0cmxlbihjdXJEaXIpICsgMTsKICAgIGRlc3REaXJTaXplUmVxID0gc3RybGVuKGRlc3REaXIpICsgMTsKCgoKICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2ludGVycyB0byB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycyBhcmUKICAgICAgIHZhbGlkOyBpZiBub3QsIGRvIE5PVEhJTkcgd2l0aCB0aGF0IGJ1ZmZlci4gIElmIHRoYXQgcG9pbnRlcgogICAgICAgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIHZhbGlkLCB0b28hICovCgogICAgaWYobHB1RGVzdERpckxlbiAmJiBscHN6RGVzdERpcikgewoJaWYoKmxwdURlc3REaXJMZW4gPCBkZXN0RGlyU2l6ZVJlcSkgewoJICAgIHJldHZhbCB8PSBWRkZfQlVGRlRPT1NNQUxMOwoJICAgIHN0cm5jcHkobHBzekRlc3REaXIsIGRlc3REaXIsICpscHVEZXN0RGlyTGVuIC0gMSk7CgkgICAgbHBzekRlc3REaXJbKmxwdURlc3REaXJMZW4gLSAxXSA9ICdcMCc7Cgl9CgllbHNlCgkgICAgc3RyY3B5KGxwc3pEZXN0RGlyLCBkZXN0RGlyKTsKCgkqbHB1RGVzdERpckxlbiA9IGRlc3REaXJTaXplUmVxOwogICAgfQogICAgCiAgICBpZihscHVDdXJEaXJMZW4gJiYgbHBzekN1ckRpcikgewoJaWYoKmxwdUN1ckRpckxlbiA8IGN1ckRpclNpemVSZXEpIHsKCSAgICByZXR2YWwgfD0gVkZGX0JVRkZUT09TTUFMTDsKCSAgICBzdHJuY3B5KGxwc3pDdXJEaXIsIGN1ckRpciwgKmxwdUN1ckRpckxlbiAtIDEpOwoJICAgIGxwc3pDdXJEaXJbKmxwdUN1ckRpckxlbiAtIDFdID0gJ1wwJzsKCX0KCWVsc2UKCSAgICBzdHJjcHkobHBzekN1ckRpciwgY3VyRGlyKTsKCgkqbHB1Q3VyRGlyTGVuID0gY3VyRGlyU2l6ZVJlcTsKICAgIH0KCiAgICBkcHJpbnRmX3ZlcihzdGRkZWIsICJWZXJGaW5kRmlsZSgpIHJldCA9ICVsdSAiLAoJCXJldHZhbCk7CgogICAgaWYocmV0dmFsKSB7CglkcHJpbnRmX3ZlcihzdGRkZWIsICIoICIpOwoKCWlmKHJldHZhbCAmIFZGRl9DVVJORURFU1QpCgkgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVkZGX0NVUk5FREVTVCAiKTsKCWlmKHJldHZhbCAmIFZGRl9GSUxFSU5VU0UpCgkgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVkZGX0ZJTEVJTlVTRSAiKTsKCWlmKHJldHZhbCAmIFZGRl9CVUZGVE9PU01BTEwpCgkgICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVkZGX0JVRkZUT09TTUFMTCAiKTsKCglkcHJpbnRmX3ZlcihzdGRkZWIsICIpIik7CiAgICB9CgogICAgZHByaW50Zl92ZXJfc3RyaW5nKCJcblx0KEV4aXQpIGxwc3pDdXJEaXIgPSAiLCBscHN6Q3VyRGlyLCAiXG4iKTsKICAgIGlmKGxwdUN1ckRpckxlbikKCWRwcmludGZfdmVyKHN0ZGRlYiwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9ICVwICgldSlcbiIsCgkJICAgIGxwdUN1ckRpckxlbiwgKmxwdUN1ckRpckxlbik7CiAgICBlbHNlCglkcHJpbnRmX3ZlcihzdGRkZWIsICJcdChFeGl0KSBscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOwoKICAgIGRwcmludGZfdmVyX3N0cmluZygiXHQoRXhpdCkgbHBzekRlc3REaXIgPSAiLCBscHN6RGVzdERpciwgIlxuIik7CiAgICBpZihscHVEZXN0RGlyTGVuKQoJZHByaW50Zl92ZXIoc3RkZGViLCAiXHQoRXhpdCkgbHB1RGVzdERpckxlbiA9ICVwICgldSlcbiIsCgkJICAgIGxwdURlc3REaXJMZW4sICpscHVEZXN0RGlyTGVuKTsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgovKiBWZXJGaW5kRmlsZUEJCQkJCQlbVkVSU0lPTi41XSAqLwpEV09SRApWZXJGaW5kRmlsZTMyQSgKCVVJTlQzMiBmbGFncyxMUENTVFIgZmlsZW5hbWUsTFBDU1RSIHdpbmRpcixMUENTVFIgYXBwZGlyLAoJTFBTVFIgY3VyZGlyLFVJTlQzMiAqcGN1cmRpcmxlbixMUFNUUiBkZXN0ZGlyLFVJTlQzMiAqcGRlc3RkaXJsZW4gKQp7CiAgICBVSU5UMTYgY3VyZGlybGVuLCBkZXN0ZGlybGVuOwogICAgRFdPUkQgcmV0ID0gVmVyRmluZEZpbGUxNihmbGFncyxmaWxlbmFtZSx3aW5kaXIsYXBwZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJkaXIsJmN1cmRpcmxlbixkZXN0ZGlyLCZkZXN0ZGlybGVuKTsKICAgICpwY3VyZGlybGVuID0gY3VyZGlybGVuOwogICAgKnBkZXN0ZGlybGVuID0gZGVzdGRpcmxlbjsKICAgIHJldHVybiByZXQ7Cn0KCi8qIFZlckZpbmRGaWxlVwkJCQkJCVtWRVJTSU9OLjZdICovCkRXT1JEClZlckZpbmRGaWxlMzJXKAoJVUlOVDMyIGZsYWdzLExQQ1dTVFIgZmlsZW5hbWUsTFBDV1NUUiB3aW5kaXIsTFBDV1NUUiBhcHBkaXIsCglMUFdTVFIgY3VyZGlyLFVJTlQzMiAqcGN1cmRpcmxlbixMUFdTVFIgZGVzdGRpcixVSU5UMzIgKnBkZXN0ZGlybGVuICkKewogICAgVUlOVDE2IGN1cmRpcmxlbiwgZGVzdGRpcmxlbjsKICAgIExQU1RSIHdmbix3d2Qsd2FkLHdkZCx3Y2Q7CiAgICBEV09SRCByZXQ7CgogICAgd2ZuID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBmaWxlbmFtZSApOwogICAgd3dkID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3aW5kaXIgKTsKICAgIHdhZCA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYXBwZGlyICk7CiAgICB3Y2QgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsICpwY3VyZGlybGVuICk7CiAgICB3ZGQgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsICpwZGVzdGRpcmxlbiApOwogICAgcmV0ID0gVmVyRmluZEZpbGUxNihmbGFncyx3Zm4sd3dkLHdhZCx3Y2QsJmN1cmRpcmxlbix3ZGQsJmRlc3RkaXJsZW4pOwogICAgbHN0cmNweW5BdG9XKGN1cmRpcix3Y2QsKnBjdXJkaXJsZW4pOwogICAgbHN0cmNweW5BdG9XKGRlc3RkaXIsd2RkLCpwZGVzdGRpcmxlbik7CiAgICAqcGN1cmRpcmxlbiA9IHN0cmxlbih3Y2QpOwogICAgKnBkZXN0ZGlybGVuID0gc3RybGVuKHdkZCk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2ZuICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3dkICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2FkICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2NkICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2RkICk7CiAgICByZXR1cm4gcmV0Owp9CgovKiBWZXJJbnN0YWxsRmlsZQkJCQkJW1ZFUi45XSAqLwpEV09SRApWZXJJbnN0YWxsRmlsZTE2KAoJVUlOVDE2IGZsYWdzLExQQ1NUUiBzcmNmaWxlbmFtZSxMUENTVFIgZGVzdGZpbGVuYW1lLExQQ1NUUiBzcmNkaXIsCiAJTFBDU1RSIGRlc3RkaXIsTFBDU1RSIGN1cmRpcixMUFNUUiB0bXBmaWxlLFVJTlQxNiAqdG1wZmlsZWxlbiApCnsKICAgIFVJTlQzMglmaWxlbGVuOwogICAgRFdPUkQgcmV0PSBWZXJJbnN0YWxsRmlsZTMyQShmbGFncyxzcmNmaWxlbmFtZSxkZXN0ZmlsZW5hbWUsc3JjZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyLGN1cmRpcix0bXBmaWxlLCZmaWxlbGVuKTsKCiAgICAqdG1wZmlsZWxlbiA9IGZpbGVsZW47CiAgICByZXR1cm4gcmV0Owp9CgovKiBWZXJJbnN0YWxsRmlsZUEJCQkJW1ZFUlNJT04uN10gKi8Kc3RhdGljIExQQllURQpfZmV0Y2hfdmVyc2lvbmluZm8oTFBTVFIgZm4pIHsKICAgIERXT1JECWFsbG9jbGVuOwogICAgTFBCWVRFCWJ1ZjsKICAgIERXT1JECXJldDsKCiAgICBhbGxvY2xlbiA9IDEwMDA7CiAgICBidWY9IHhtYWxsb2MoYWxsb2NsZW4pOwogICAgd2hpbGUgKDEpIHsKICAgIAlyZXQgPSBHZXRGaWxlVmVyc2lvbkluZm8zMkEoZm4sMCxhbGxvY2xlbixidWYpOwoJaWYgKCFyZXQpIHsKCSAgICBmcmVlKGJ1Zik7CgkgICAgcmV0dXJuIDA7Cgl9CglpZiAoYWxsb2NsZW48KihXT1JEKilidWYpIHsKCSAgICBmcmVlKGJ1Zik7CgkgICAgYWxsb2NsZW4gPSAqKFdPUkQqKWJ1ZjsKCSAgICBidWYgPSB4bWFsbG9jKGFsbG9jbGVuKTsKCX0gZWxzZQoJICAgIHJldHVybiBidWY7CiAgICB9Cn0KCnN0YXRpYyBEV09SRApfZXJyb3IydmlmKERXT1JEIGVycm9yKSB7CiAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CiAgICAJcmV0dXJuIFZJRl9BQ0NFU1NWSU9MQVRJT047CiAgICBjYXNlIEVSUk9SX1NIQVJJTkdfVklPTEFUSU9OOgogICAgCXJldHVybiBWSUZfU0hBUklOR1ZJT0xBVElPTjsKICAgIGRlZmF1bHQ6CiAgICAJcmV0dXJuIDA7CiAgICB9Cn0KCkRXT1JEClZlckluc3RhbGxGaWxlMzJBKAoJVUlOVDMyIGZsYWdzLExQQ1NUUiBzcmNmaWxlbmFtZSxMUENTVFIgZGVzdGZpbGVuYW1lLExQQ1NUUiBzcmNkaXIsCiAJTFBDU1RSIGRlc3RkaXIsTFBDU1RSIGN1cmRpcixMUFNUUiB0bXBmaWxlLFVJTlQzMiAqdG1wZmlsZWxlbiApCnsKICAgIGNoYXIJZGVzdGZuWzI2MF0sdG1wZm5bMjYwXSxzcmNmblsyNjBdOwogICAgSEZJTEUzMgloZnNyYyxoZmRzdDsKICAgIERXT1JECWF0dHIscmV0LHhyZXQsdG1wbGFzdDsKICAgIExQQllURQlidWYxLGJ1ZjI7CiAgICBPRlNUUlVDVAlvZnM7CgogICAgZnByaW50ZihzdGRkZWIsIlZlckluc3RhbGxGaWxlKCV4LCVzLCVzLCVzLCVzLCVzLCVwLCVkKVxuIiwKCSAgICBmbGFncyxzcmNmaWxlbmFtZSxkZXN0ZmlsZW5hbWUsc3JjZGlyLGRlc3RkaXIsY3VyZGlyLHRtcGZpbGUsKnRtcGZpbGVsZW4KICAgICk7CiAgICB4cmV0ID0gMDsKICAgIHNwcmludGYoc3JjZm4sIiVzXFwlcyIsc3JjZGlyLHNyY2ZpbGVuYW1lKTsKICAgIHNwcmludGYoZGVzdGZuLCIlc1xcJXMiLGRlc3RkaXIsZGVzdGZpbGVuYW1lKTsKICAgIGhmc3JjPUxaT3BlbkZpbGUzMkEoc3JjZm4sJm9mcyxPRl9SRUFEKTsKICAgIGlmIChoZnNyYz09SEZJTEVfRVJST1IzMikKICAgIAlyZXR1cm4gVklGX0NBTk5PVFJFQURTUkM7CiAgICBzcHJpbnRmKHRtcGZuLCIlc1xcJXMiLGRlc3RkaXIsZGVzdGZpbGVuYW1lKTsKICAgIHRtcGxhc3Q9c3RybGVuKGRlc3RkaXIpKzE7CiAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMzMkEodG1wZm4pOwogICAgaWYgKGF0dHIhPS0xKSB7CglpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSB7CgkgICAgTFpDbG9zZTMyKGhmc3JjKTsKCSAgICByZXR1cm4gVklGX1dSSVRFUFJPVDsKCX0KCS8qIEZJWE1FOiBjaGVjayBpZiBmaWxlIGN1cnJlbnRseSBpbiB1c2UgYW5kIHJldHVybiBWSUZfRklMRUlOVVNFICovCiAgICB9CiAgICBhdHRyID0gLTE7CiAgICBpZiAoZmxhZ3MgJiBWSUZGX0ZPUkNFSU5TVEFMTCkgewogICAgCWlmICh0bXBmaWxlWzBdKSB7CgkgICAgc3ByaW50Zih0bXBmbiwiJXNcXCVzIixkZXN0ZGlyLHRtcGZpbGUpOwoJICAgIHRtcGxhc3QgPSBzdHJsZW4oZGVzdGRpcikrMTsKCSAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMzMkEodG1wZm4pOwoJICAgIC8qIGlmIGl0IGV4aXN0cywgaXQgaGFzIGJlZW4gY29waWVkIGJ5IHRoZSBjYWxsIGJlZm9yZS4KCSAgICAgKiB3ZSBqdW1wIG92ZXIgdGhlIGNvcHkgcGFydC4uLiAKCSAgICAgKi8KCX0KICAgIH0KICAgIGlmIChhdHRyID09IC0xKSB7CiAgICAJY2hhcgkqczsKCglHZXRUZW1wRmlsZU5hbWUzMkEoZGVzdGRpciwidmVyIiwwLHRtcGZuKTsgLyogc2hvdWxkIG5vdCBmYWlsIC4uLiAqLwoJcz1zdHJyY2hyKHRtcGZuLCdcXCcpOwoJaWYgKHMpCgkgICAgdG1wbGFzdCA9IHMtdG1wZm47CgllbHNlCgkgICAgdG1wbGFzdCA9IDA7CgloZmRzdCA9IE9wZW5GaWxlMzIodG1wZm4sJm9mcyxPRl9DUkVBVEUpOwoJaWYgKGhmZHN0ID09IEhGSUxFX0VSUk9SMzIpIHsKCSAgICBMWkNsb3NlMzIoaGZzcmMpOwoJICAgIHJldHVybiBWSUZfQ0FOTk9UQ1JFQVRFOyAvKiB8IHRyYW5zbGF0ZWQgZG9zIGVycm9yICovCgl9CglyZXQgPSBMWkNvcHkzMihoZnNyYyxoZmRzdCk7CglfbGNsb3NlMzIoaGZkc3QpOwoJaWYgKCgobG9uZykgcmV0KSA8IDApIHsKCSAgICAvKiB0cmFuc2xhdGUgTFogZXJyb3JzIGludG8gVklGX3h4eCAqLwoJICAgIHN3aXRjaCAocmV0KSB7CgkgICAgY2FzZSBMWkVSUk9SX0JBRElOSEFORExFOgoJICAgIGNhc2UgTFpFUlJPUl9SRUFEOgoJICAgIGNhc2UgTFpFUlJPUl9CQURWQUxVRToKCSAgICBjYXNlIExaRVJST1JfVU5LTk9XTkFMRzoKCQlyZXQgPSBWSUZfQ0FOTk9UUkVBRFNSQzsKCQlicmVhazsKCSAgICBjYXNlIExaRVJST1JfQkFET1VUSEFORExFOgoJICAgIGNhc2UgTFpFUlJPUl9XUklURToKCQlyZXQgPSBWSUZfT1VUT0ZNRU1PUlk7IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwoJCWJyZWFrOwoJICAgIGNhc2UgTFpFUlJPUl9HTE9CQUxMT0M6CgkgICAgY2FzZSBMWkVSUk9SX0dMT0JMT0NLOgoJCXJldCA9IFZJRl9PVVRPRlNQQUNFOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6IC8qIHVua25vd24gZXJyb3IsIHNob3VsZCBub3QgaGFwcGVuICovCgkJcmV0ID0gMDsKCQlicmVhazsKCSAgICB9CgkgICAgaWYgKHJldCkgewoJCUxaQ2xvc2UzMihoZnNyYyk7CgkJcmV0dXJuIHJldDsKCSAgICB9Cgl9CiAgICB9CiAgICB4cmV0ID0gMDsKICAgIGlmICghKGZsYWdzICYgVklGRl9GT1JDRUlOU1RBTEwpKSB7CiAgICAJYnVmMSA9IF9mZXRjaF92ZXJzaW9uaW5mbyhkZXN0Zm4pOwoJaWYgKGJ1ZjEpIHsKCSAgICBidWYyID0gX2ZldGNoX3ZlcnNpb25pbmZvKHRtcGZuKTsKCSAgICBpZiAoYnVmMikgewoJICAgIAljaGFyCSp0YnVmMSwqdGJ1ZjI7CgkJVlNfRklYRURGSUxFSU5GTyAqZGVzdHZmZmksKnRtcHZmZmk7CgkJVUlOVDMyCWxlbjEsbGVuMjsKCgkJZGVzdHZmZmk9IChWU19GSVhFREZJTEVJTkZPKikoYnVmMSsweDE0KTsKCQl0bXB2ZmZpID0gKFZTX0ZJWEVERklMRUlORk8qKShidWYyKzB4MTQpOwoJCWxlbjE9bGVuMj00MDsKCgkJLyogY29tcGFyZSBmaWxlIHZlcnNpb25zICovCgkJaWYgKChkZXN0dmZmaS0+ZHdGaWxlVmVyc2lvbk1TID4gdG1wdmZmaS0+ZHdGaWxlVmVyc2lvbk1TKXx8CgkJICAgICgoZGVzdHZmZmktPmR3RmlsZVZlcnNpb25NUz09dG1wdmZmaS0+ZHdGaWxlVmVyc2lvbk1TKSYmCgkJICAgICAoZGVzdHZmZmktPmR3RmlsZVZlcnNpb25MUyA+IHRtcHZmZmktPmR3RmlsZVZlcnNpb25MUykKCQkgICAgKQoJCSkKCQkgICAgeHJldCB8PSBWSUZfTUlTTUFUQ0h8VklGX1NSQ09MRDsKCQkvKiBjb21wYXJlIGZpbGV0eXBlcyBhbmQgZmlsZXN1YnR5cGVzICovCgkJaWYgKChkZXN0dmZmaS0+ZHdGaWxlVHlwZSE9dG1wdmZmaS0+ZHdGaWxlVHlwZSkgfHwKCQkgICAgKGRlc3R2ZmZpLT5kd0ZpbGVTdWJ0eXBlIT10bXB2ZmZpLT5kd0ZpbGVTdWJ0eXBlKQoJCSkKCQkgICAgeHJldCB8PSBWSUZfTUlTTUFUQ0h8VklGX0RJRkZUWVBFOwoJCWlmIChWZXJRdWVyeVZhbHVlMzJBKGJ1ZjEsIlxcVmFyRmlsZUluZm9cXFRyYW5zbGF0aW9uIiwoTFBWT0lEKikmdGJ1ZjEsJmxlbjEpICYmCgkJICAgIFZlclF1ZXJ5VmFsdWUzMkEoYnVmMiwiXFxWYXJGaWxlSW5mb1xcVHJhbnNsYXRpb24iLChMUFZPSUQqKSZ0YnVmMiwmbGVuMikKCQkpIHsKCQkgICAgLyogaXJnZW5kd2FzIG1pdCB0YnVmMSB1bmQgdGJ1ZjIgbWFjaGVuIAoJCSAgICAgKiBnZW5lcmllcnQgRElGRkxBTkd8TUlTTUFUQ0gKCQkgICAgICovCgkJfQoJCWZyZWUoYnVmMik7CgkgICAgfSBlbHNlCgkJeHJldD1WSUZfTUlTTUFUQ0h8VklGX1NSQ09MRDsKCSAgICBmcmVlKGJ1ZjEpOwoJfQogICAgfQogICAgaWYgKHhyZXQpIHsKCWlmICgqdG1wZmlsZWxlbjxzdHJsZW4odG1wZm4rdG1wbGFzdCkpIHsKCSAgICB4cmV0fD1WSUZfQlVGVE9TTUFMTDsKCSAgICBEZWxldGVGaWxlMzJBKHRtcGZuKTsKCX0gZWxzZSB7CgkgICAgc3RyY3B5KHRtcGZpbGUsdG1wZm4rdG1wbGFzdCk7CgkgICAgKnRtcGZpbGVsZW4gPSBzdHJsZW4odG1wZm4rdG1wbGFzdCkrMTsKCSAgICB4cmV0fD1WSUZfVEVNUEZJTEU7Cgl9CiAgICB9IGVsc2UgewogICAgCWlmICgtMSE9R2V0RmlsZUF0dHJpYnV0ZXMzMkEoZGVzdGZuKSkKCSAgICBpZiAoIURlbGV0ZUZpbGUzMkEoZGVzdGZuKSkgewoJCXhyZXR8PV9lcnJvcjJ2aWYoR2V0TGFzdEVycm9yKCkpfFZJRl9DQU5OT1RERUxFVEU7CgkJRGVsZXRlRmlsZTMyQSh0bXBmbik7CgkJTFpDbG9zZTMyKGhmc3JjKTsKCQlyZXR1cm4geHJldDsKCSAgICB9CglpZiAoKCEoZmxhZ3MgJiBWSUZGX0RPTlRERUxFVEVPTEQpKQkmJiAKCSAgICBjdXJkaXIJCQkJJiYgCgkgICAgKmN1cmRpcgkJCQkmJgoJICAgIGxzdHJjbXBpMzJBKGN1cmRpcixkZXN0ZGlyKQoJKSB7CgkgICAgY2hhciBjdXJmblsyNjBdOwoKCSAgICBzcHJpbnRmKGN1cmZuLCIlc1xcJXMiLGN1cmRpcixkZXN0ZmlsZW5hbWUpOwoJICAgIGlmICgtMSE9R2V0RmlsZUF0dHJpYnV0ZXMzMkEoY3VyZm4pKSB7CgkJLyogRklYTUU6IGNoZWNrIGlmIGluIHVzZSAuLi4gaWYgaXQgaXMsIFZJRl9DQU5OT1RERUxFVEVDVVIgKi8KCQlpZiAoIURlbGV0ZUZpbGUzMkEoY3VyZm4pKQoJICAgIAkgICAgeHJldHw9X2Vycm9yMnZpZihHZXRMYXN0RXJyb3IoKSl8VklGX0NBTk5PVERFTEVURUNVUjsKCSAgICB9Cgl9CglpZiAoIU1vdmVGaWxlMzJBKHRtcGZuLGRlc3RmbikpIHsKCSAgICB4cmV0fD1fZXJyb3IydmlmKEdldExhc3RFcnJvcigpKXxWSUZfQ0FOTk9UUkVOQU1FOwoJICAgIERlbGV0ZUZpbGUzMkEodG1wZm4pOwoJfQogICAgfQogICAgTFpDbG9zZTMyKGhmc3JjKTsKICAgIHJldHVybiB4cmV0Owp9CgovKiBWZXJJbnN0YWxsRmlsZVcJCQkJW1ZFUlNJT04uOF0gKi8KRFdPUkQKVmVySW5zdGFsbEZpbGUzMlcoCglVSU5UMzIgZmxhZ3MsTFBDV1NUUiBzcmNmaWxlbmFtZSxMUENXU1RSIGRlc3RmaWxlbmFtZSxMUENXU1RSIHNyY2RpciwKCUxQQ1dTVFIgZGVzdGRpcixMUENXU1RSIGN1cmRpcixMUFdTVFIgdG1wZmlsZSxVSU5UMzIgKnRtcGZpbGVsZW4gKQp7CiAgICBMUFNUUiB3c3JjZix3c3JjZCx3ZGVzdGYsd2Rlc3RkLHd0bXBmLHdjdXJkOwogICAgRFdPUkQgcmV0OwoKICAgIHdzcmNmICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjZmlsZW5hbWUgKTsKICAgIHdzcmNkICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjZGlyICk7CiAgICB3ZGVzdGYgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRlc3RmaWxlbmFtZSApOwogICAgd2Rlc3RkID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXN0ZGlyICk7CiAgICB3dG1wZiAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRtcGZpbGUgKTsKICAgIHdjdXJkICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3VyZGlyICk7CiAgICByZXQgPSBWZXJJbnN0YWxsRmlsZTMyQShmbGFncyx3c3JjZix3ZGVzdGYsd3NyY2Qsd2Rlc3RkLHdjdXJkLHd0bXBmLHRtcGZpbGVsZW4pOwogICAgaWYgKCFyZXQpCiAgICAJbHN0cmNweW5BdG9XKHRtcGZpbGUsd3RtcGYsKnRtcGZpbGVsZW4pOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdzcmNmICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3NyY2QgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3ZGVzdGYgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3ZGVzdGQgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3dG1wZiApOwogICAgaWYgKHdjdXJkKSAKICAgIAlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2N1cmQgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qIEZJWE1FOiBUaGlzIHRhYmxlIHNob3VsZCwgb2YgY291cnNlLCBiZSBsYW5ndWFnZSBkZXBlbmRlbmQgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBfaWQyc3RyIHsKCVVJTlQxNglsYW5naWQ7Cgljb25zdCBjaGFyICpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaXNjaCJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW569nNpc2NoIn0sCgl7MHgwNDBELCJIZWJy5GlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNs5G5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybORuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlLkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1beRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJU/HJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnr2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJs5G5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnr2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKLyogVmVyTGFuZ3VhZ2VOYW1lCQkJCVtWRVIuMTBdICovCkRXT1JEClZlckxhbmd1YWdlTmFtZTE2KFVJTlQxNiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsVUlOVDE2IGxhbmduYW1lbGVuKSB7CglpbnQJaTsKCWNoYXIJKmJ1ZjsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlckxhbmd1YWdlTmFtZSglZCwlcCwlZClcbiIsbGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglidWY9KGNoYXIqKW1hbGxvYyhzdHJsZW4oIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIpKzkpOwoJc3ByaW50ZihidWYsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLGxhbmdpZCk7CglpZiAoRVJST1JfU1VDQ0VTUz09UmVnUXVlcnlWYWx1ZTE2KEhLRVlfTE9DQUxfTUFDSElORSxidWYsbGFuZ25hbWUsKExQRFdPUkQpJmxhbmduYW1lbGVuKSkgewoJCWxhbmduYW1lW2xhbmduYW1lbGVuLTFdPSdcMCc7CgkJcmV0dXJuIGxhbmduYW1lbGVuOwoJfQoJLyogaWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcmFsIHRhYmxlICovCglmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQlicmVhazsKCXN0cm5jcHkobGFuZ25hbWUsbGFuZ3VhZ2VzW2ldLmxhbmduYW1lLGxhbmduYW1lbGVuKTsKCWxhbmduYW1lW2xhbmduYW1lbGVuLTFdPSdcMCc7CglyZXR1cm4gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7Cn0KCi8qIFZlckxhbmd1YWdlTmFtZUEJCQkJW1ZFUlNJT04uOV0gKi8KRFdPUkQKVmVyTGFuZ3VhZ2VOYW1lMzJBKFVJTlQzMiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsVUlOVDMyIGxhbmduYW1lbGVuKSB7CglyZXR1cm4gVmVyTGFuZ3VhZ2VOYW1lMTYobGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKfQoKLyogVmVyTGFuZ3VhZ2VOYW1lVwkJCQlbVkVSU0lPTi4xMF0gKi8KRFdPUkQKVmVyTGFuZ3VhZ2VOYW1lMzJXKFVJTlQzMiBsYW5naWQsTFBXU1RSIGxhbmduYW1lLFVJTlQzMiBsYW5nbmFtZWxlbikgewoJaW50CWk7CgljaGFyCWJ1ZmZlcls4MF07CglMUFdTVFIJa2V5bmFtZTsKCgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJc3ByaW50ZihidWZmZXIsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLGxhbmdpZCk7CglrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdRdWVyeVZhbHVlMzJXKEhLRVlfTE9DQUxfTUFDSElORSxrZXluYW1lLGxhbmduYW1lLChMUERXT1JEKSZsYW5nbmFtZWxlbikpIHsKCQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoJLyogaWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcmFsIHRhYmxlICovCglmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQlicmVhazsKICAgICAgICBsc3RyY3B5QXRvVyggbGFuZ25hbWUsIGxhbmd1YWdlc1tpXS5sYW5nbmFtZSApOwoJcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOyAvKiBzYW1lIGFzIHN0cmxlblcobGFuZ25hbWUpOyAqLwp9CgovKiBGSVhNRTogVU5JQ09ERT8gKi8Kc3RydWN0IGRiIHsKCVdPUkQJbmV4dG9mZjsKCVdPUkQJZGF0YWxlbjsKLyogaW4gbWVtb3J5IHN0cnVjdHVyZS4uLiAqLwoJY2hhcgluYW1lWzFdOyAJLyogcGFkZGVkIHRvIGR3b3JkIGFsaWdubWVudCAqLwovKiAuLi4uIAoJY2hhcglkYXRhW2RhdGFsZW5dOyAgICAgcGFkZGVkIHRvIGR3b3JkIGFsaWduZW1udAoJQllURQlzdWJkaXJkYXRhW107ICAgICAgdW50aWwgbmV4dG9mZgogKi8KfTsKCnN0YXRpYyBCWVRFKgpfZmluZF9kYXRhKEJZVEUgKmJsb2NrLExQQ1NUUiBzdHIpIHsKCWNoYXIJKm5leHRzbGFzaDsKCWludAlzdWJzdHJsZW47CglzdHJ1Y3QJZGIJKmRiOwoKCXdoaWxlICgqc3RyICYmICpzdHI9PSdcXCcpCgkJc3RyKys7CglpZiAoTlVMTCE9KG5leHRzbGFzaD1zdHJjaHIoc3RyLCdcXCcpKSkKCQlzdWJzdHJsZW49bmV4dHNsYXNoLXN0cjsKCWVsc2UKCQlzdWJzdHJsZW49c3RybGVuKHN0cik7CglpZiAobmV4dHNsYXNoIT1OVUxMKSB7CgkJd2hpbGUgKCpuZXh0c2xhc2ggJiYgKm5leHRzbGFzaD09J1xcJykKCQkJbmV4dHNsYXNoKys7CgkJaWYgKCEqbmV4dHNsYXNoKQoJCQluZXh0c2xhc2g9TlVMTDsKCX0KCgoJd2hpbGUgKDEpIHsKCQlkYj0oc3RydWN0IGRiKilibG9jazsKCQlkcHJpbnRmX3ZlcihzdGRkZWIsImRiPSVwLGRiLT5uZXh0b2ZmPSVkLGRiLT5kYXRhbGVuPSVkLGRiLT5uYW1lPSVzLGRiLT5kYXRhPSVzXG4iLAoJCQlkYixkYi0+bmV4dG9mZixkYi0+ZGF0YWxlbixkYi0+bmFtZSwoY2hhciopKChjaGFyKilkYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+MykpCgkJKTsKCQlpZiAoIWRiLT5uZXh0b2ZmKQoJCQlyZXR1cm4gTlVMTDsKCgkJZHByaW50Zl92ZXIoc3RkZGViLCJjb21wYXJpbmcgd2l0aCAlc1xuIixkYi0+bmFtZSk7CgkJaWYgKCFzdHJuY21wKGRiLT5uYW1lLHN0cixzdWJzdHJsZW4pKSB7CgkJCWlmIChuZXh0c2xhc2gpCgkJCQlyZXR1cm4gX2ZpbmRfZGF0YSgKCQkJCQlibG9jays0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+MykrKChkYi0+ZGF0YWxlbiszKSZ+MykKCQkJCQksbmV4dHNsYXNoCgkJCQkpOwoJCQllbHNlCgkJCQlyZXR1cm4gYmxvY2s7CgkJfQoJCWJsb2NrPWJsb2NrKygoZGItPm5leHRvZmYrMykmfjMpOwoJfQp9CgovKiBWZXJRdWVyeVZhbHVlIAkJCVtWRVIuMTFdICovCi8qIHRha2UgY2FyZSwgJ2J1ZmZlcicgaXMgTk9UIGEgU0VHUFRSLCBpdCBqdXN0IHBvaW50cyB0byBvbmUgKi8KRFdPUkQKVmVyUXVlcnlWYWx1ZTE2KFNFR1BUUiBzZWdibG9jayxMUENTVFIgc3ViYmxvY2ssU0VHUFRSICpidWZmZXIsVUlOVDE2ICpidWZsZW4pCnsKCUJZVEUJKmJsb2NrPVBUUl9TRUdfVE9fTElOKHNlZ2Jsb2NrKSwqYjsKCXN0cnVjdAlkYgkqZGI7CgljaGFyCSpzOwoKCWRwcmludGZfdmVyKHN0ZGRlYiwiVmVyUXVlcnlWYWx1ZTE2KCVwLCVzLCVwLCVkKVxuIiwKCQlibG9jayxzdWJibG9jayxidWZmZXIsKmJ1ZmxlbgoJKTsKCXM9KGNoYXIqKXhtYWxsb2Moc3RybGVuKCJWU19WRVJTSU9OX0lORk9cXCIpK3N0cmxlbihzdWJibG9jaykrMSk7CglzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPXFwiKTtzdHJjYXQocyxzdWJibG9jayk7CgliPV9maW5kX2RhdGEoYmxvY2sscyk7CglpZiAoYj09TlVMTCkgewoJCSpidWZsZW49MDsKCQlyZXR1cm4gMDsKCX0KCWRiPShzdHJ1Y3QgZGIqKWI7CgkqYnVmbGVuCT0gZGItPmRhdGFsZW47CgkvKiBsZXQgYiBwb2ludCB0byBkYXRhIGFyZWEgKi8KCWIJPSBiKzQrKChzdHJsZW4oZGItPm5hbWUpKzQpJn4zKTsKCS8qIG5vdyBsb29rIHVwIHdoYXQgdGhlIHJlc3AuIFNFR1BUUiB3b3VsZCBiZSAuLi4gKi8KCSpidWZmZXIJPSAoYi1ibG9jaykrc2VnYmxvY2s7CglkcHJpbnRmX3ZlcihzdGRkZWIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKCXJldHVybiAxOwp9CgpEV09SRApWZXJRdWVyeVZhbHVlMzJBKExQVk9JRCB2YmxvY2ssTFBDU1RSIHN1YmJsb2NrLExQVk9JRCAqdmJ1ZmZlcixVSU5UMzIgKmJ1ZmxlbikKewoJQllURQkqYiwqYmxvY2s9KExQQllURSl2YmxvY2ssKipidWZmZXI9KExQQllURSopdmJ1ZmZlcjsKCXN0cnVjdAlkYgkqZGI7CgljaGFyCSpzOwoKCWRwcmludGZfdmVyKHN0ZGRlYiwiVmVyUXVlcnlWYWx1ZTMyQSglcCwlcywlcCwlZClcbiIsCgkJYmxvY2ssc3ViYmxvY2ssYnVmZmVyLCpidWZsZW4KCSk7CglzPShjaGFyKil4bWFsbG9jKHN0cmxlbigiVlNfVkVSU0lPTl9JTkZPXFwiKStzdHJsZW4oc3ViYmxvY2spKzEpOwoJc3RyY3B5KHMsIlZTX1ZFUlNJT05fSU5GT1xcIik7c3RyY2F0KHMsc3ViYmxvY2spOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkqYnVmZmVyCT0gYjsKCWRwcmludGZfdmVyKHN0ZGRlYiwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwoJcmV0dXJuIDE7Cn0KCkRXT1JEClZlclF1ZXJ5VmFsdWUzMlcoTFBWT0lEIHZibG9jayxMUENXU1RSIHN1YmJsb2NrLExQVk9JRCAqdmJ1ZmZlcixVSU5UMzIgKmJ1ZmxlbikKewoJLyogRklYTUU6IGhtbSwgd2Ugbm90IG9ubHkgbmVlZCB0byBjb252ZXJ0IHN1YmJsb2NrLCBidXQgYWxzbyAKCSAqICAgICAgICB0aGUgY29udGVudC4uLm9yPwoJICogQW5kIHdoYXQgYWJvdXQgVU5JQ09ERSB2ZXJzaW9uIGluZm8/CgkgKiBBbmQgdGhlIE5BTUVTIG9mIHRoZSB2YWx1ZXM/CgkgKi8KCUJZVEUJCSpiLCoqYnVmZmVyPShMUEJZVEUqKXZidWZmZXIsKmJsb2NrPShMUEJZVEUpdmJsb2NrOwoJc3RydWN0CWRiCSpkYjsKCWNoYXIJCSpzLCpzYjsKCglzYiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3ViYmxvY2sgKTsKCXM9KGNoYXIqKXhtYWxsb2Moc3RybGVuKCJWU19WRVJTSU9OX0lORk9cXCIpK3N0cmxlbihzYikrMSk7CglzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPXFwiKTtzdHJjYXQocyxzYik7CgliPV9maW5kX2RhdGEoYmxvY2sscyk7CglpZiAoYj09TlVMTCkgewoJCSpidWZsZW49MDsKCQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2IgKTsKCQlyZXR1cm4gMDsKCX0KCWRiPShzdHJ1Y3QgZGIqKWI7CgkqYnVmbGVuCT0gZGItPmRhdGFsZW47CgkvKiBsZXQgYiBwb2ludCB0byBkYXRhIGFyZWEgKi8KCWIJPSBiKzQrKChzdHJsZW4oZGItPm5hbWUpKzQpJn4zKTsKCSpidWZmZXIJPSBiOwoJZHByaW50Zl92ZXIoc3RkZGViLCIJLT4gJXM9JXNcbiIsc2IsYik7CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNiICk7CglyZXR1cm4gMTsKfQovKiAyMCBHRVRGSUxFVkVSU0lPTklORk9SQVcgKi8K