ZGlmZiAtLWdpdCBhL2F1dG8vZmVhdHVyZSBiL2F1dG8vZmVhdHVyZQppbmRleCAxNWRhNWJkLi42YWQwMDhhIDEwMDY0NAotLS0gYS9hdXRvL2ZlYXR1cmUKKysrIGIvYXV0by9mZWF0dXJlCkBAIC0xNCw3ICsxNCw4IEBACiBuZ3hfZm91bmQ9bm8KIAogaWYgdGVzdCAtbiAiJG5neF9mZWF0dXJlX25hbWUiOyB0aGVuCi0gICAgbmd4X2hhdmVfZmVhdHVyZT1gZWNobyAkbmd4X2ZlYXR1cmVfbmFtZSB8IHRyICdbYS16XScgJ1tBLVpdJ2AKKyAgICBuZ3hfaGF2ZV9mZWF0dXJlPWBlY2hvICRuZ3hfZmVhdHVyZV9uYW1lIFwKKyAgICAgICAgICAgICAgICAgICB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYAogZmkKIAogY2F0IDw8IEVORCA+ICROR1hfQVVUT1RFU1QuYwpkaWZmIC0tZ2l0IGEvYXV0by9pbmNsdWRlIGIvYXV0by9pbmNsdWRlCmluZGV4IDdhMDk4ZDkuLjQxMzkyMzggMTAwNjQ0Ci0tLSBhL2F1dG8vaW5jbHVkZQorKysgYi9hdXRvL2luY2x1ZGUKQEAgLTM1LDggKzM1LDggQEAKIAogICAgIGVjaG8gIiBmb3VuZCIKIAotICAgIG5neF9uYW1lPWBlY2hvICRuZ3hfaW5jbHVkZSB8IHNlZCAtZSAncy9cLi9fLycgLWUgJ3MvXC8vXy8nIFwKLSAgICAgICAgICAgICAgICAgIHwgIHRyICdbYS16XScgJ1tBLVpdJ2AKKyAgICBuZ3hfbmFtZT1gZWNobyAkbmd4X2luY2x1ZGUgXAorICAgICAgICAgICAgICB8IHRyIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ly4gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX2AKIAogCiAgICAgaGF2ZT1OR1hfSEFWRV8kbmd4X25hbWUgLiBhdXRvL2hhdmVfaGVhZGVycwpkaWZmIC0tZ2l0IGEvY29uZi9rb2ktd2luIGIvY29uZi9rb2ktd2luCmluZGV4IDkyY2FiYjEuLjJiMTJiOGQgMTAwNjQ0Ci0tLSBhL2NvbmYva29pLXdpbgorKysgYi9jb25mL2tvaS13aW4KQEAgLTEwLDggKzEwLDIyIEBACiAgICAgOUUgIEI3IDsgIyAmbWlkZG90OwogCiAgICAgQTMgIEI4IDsgIyBzbWFsbCB5bworICAgIEE0ICBCQSA7ICMgc21hbGwgVWtyYWluaWFuIHllCisKKyAgICBBNiAgQjMgOyAjIHNtYWxsIFVrcmFpbmlhbiBpCisgICAgQTcgIEJGIDsgIyBzbWFsbCBVa3JhaW5pYW4gagorCisgICAgQUQgIEI0IDsgIyBzbWFsbCBVa3JhaW5pYW4gc29mdCBnCisgICAgQUUgIEEyIDsgIyBzbWFsbCBCeWVsb3J1c3NpYW4gc2hvcnQgdQogCiAgICAgQjMgIEE4IDsgIyBjYXBpdGFsIFlPCisgICAgQjQgIEFBIDsgIyBjYXBpdGFsIFVrcmFpbmlhbiBZRQorCisgICAgQjYgIEIyIDsgIyBjYXBpdGFsIFVrcmFpbmlhbiBJCisgICAgQjcgIEFGIDsgIyBjYXBpdGFsIFVrcmFpbmlhbiBKCisKKyAgICBCRCAgQTUgOyAjIGNhcGl0YWwgVWtyYWluaWFuIHNvZnQgRworICAgIEJFICBBMSA7ICMgY2FwaXRhbCBCeWVsb3J1c3NpYW4gc2hvcnQgVQogCiAgICAgQkYgIEE5IDsgIyAoQykKIApkaWZmIC0tZ2l0IGEvY29uZi9uZ2lueC5jb25mIGIvY29uZi9uZ2lueC5jb25mCmluZGV4IDExNDA0YWQuLjJmNTc4NWEgMTAwNjQ0Ci0tLSBhL2NvbmYvbmdpbnguY29uZgorKysgYi9jb25mL25naW54LmNvbmYKQEAgLTI2LDkgKzI2LDEwIEBACiAKICAgICBzZW5kZmlsZSAgICAgICAgb247CiAgICAgI3RjcF9ub3B1c2ggICAgIG9uOwotICAgICN0Y3Bfbm9kZWxheSAgICBvbjsKIAogICAgICNrZWVwYWxpdmVfdGltZW91dCAgMDsKKyAgICBrZWVwYWxpdmVfdGltZW91dCAgNjU7CisgICAgdGNwX25vZGVsYXkgICAgICAgIG9uOwogCiAgICAgI2d6aXAgIG9uOwogCkBAIC02MCw3ICs2MSw4IEBACiAgICAgICAgICMgICAgaW5jbHVkZSAgICAgICAgY29uZi9mYXN0Y2dpX3BhcmFtczsKICAgICAgICAgI30KIAotICAgICAgICAjIGRlbnkgYWNjZXNzIHRvIC5odGFjY2VzcyBmaWxlcworICAgICAgICAjIGRlbnkgYWNjZXNzIHRvIC5odGFjY2VzcyBmaWxlcywgaWYgQXBhY2hlJ3MgZG9jdW1lbnQgcm9vdAorICAgICAgICAjIGNvbmN1cnMgd2l0aCBuZ2lueCdzIG9uZQogICAgICAgICAjCiAgICAgICAgICNsb2NhdGlvbiB+IC9cLmh0IHsKICAgICAgICAgIyAgICBkZW55ICBhbGw7CmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IGQxM2U2MTUuLjkyZmVmYTQgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksMzkgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMy40NCIgZGF0ZT0iMDQuMDUuMjAwNiI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQwdLBzcXU0iB3YWl0INcgy8/Nwc7ExSBTU0kgaW5sY3VkZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAid2FpdCIgcGFyYW1ldGVyIGluIHRoZSBTU0kgImluY2x1ZGUiIGNvbW1hbmQuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK9cg1MHCzMnD1SDQxdLFy8/EydLP18vJIGtvaS13aW4gxM/CwdfMxc7ZINXL0sHJztPLycUgySDCxczP0tXT08vJxSDTyc3Xz8zZLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIFVrcmFpbmlhbiBhbmQgQnllbG9ydXNzaWFuIGNoYXJhY3RlcnMgd2VyZSBhZGRlZCB0byBrb2ktd2luIGNvbnZlcnNpb24KK3RhYmxlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9cgU1NJLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgoraW4gdGhlIFNTSS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjMuNDMiIGRhdGU9IjI2LjA0LjIwMDYiPgogCiA8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCA5YTA4ZjEzLi43ZmQ5ZDcyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuNDMiCisjZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4zLjQ0IgogCiAjZGVmaW5lIE5HSU5YX1ZBUiAgICAgICAgICAiTkdJTlgiCiAjZGVmaW5lIE5HWF9PTERQSURfRVhUICAgICAiLm9sZGJpbiIKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9idWYuYyBiL3NyYy9jb3JlL25neF9idWYuYwppbmRleCA5MDFjM2Y1Li4zMWQ5OTAzIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfYnVmLmMKKysrIGIvc3JjL2NvcmUvbmd4X2J1Zi5jCkBAIC0xMzQsMTIgKzEzNCw2IEBACiAgICAgfQogCiAgICAgd2hpbGUgKGluKSB7Ci0KLSAgICAgICAgaWYgKG5neF9idWZfc3luY19vbmx5KGluLT5idWYpKSB7Ci0gICAgICAgICAgICBpbiA9IGluLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQogICAgICAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHBvb2wpOwogICAgICAgICBpZiAoY2wgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYwppbmRleCA3YzIyOTQ4Li5iODk1OTEwIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCkBAIC0yMjEsMTIgKzIyMSwxNCBAQAogewogICAgIGNoYXIgICAgICAgICAgICpydjsKICAgICB2b2lkICAgICAgICAgICAqY29uZiwgKipjb25mcDsKLSAgICBuZ3hfdWludF90ICAgICAgaSwgdmFsaWQ7CisgICAgbmd4X3VpbnRfdCAgICAgIGksIG11bHRpOwogICAgIG5neF9zdHJfdCAgICAgICpuYW1lOwogICAgIG5neF9jb21tYW5kX3QgICpjbWQ7CiAKICAgICBuYW1lID0gY2YtPmFyZ3MtPmVsdHM7CiAKKyAgICBtdWx0aSA9IDA7CisKICAgICBmb3IgKGkgPSAwOyBuZ3hfbW9kdWxlc1tpXTsgaSsrKSB7CiAKICAgICAgICAgLyogbG9vayB1cCB0aGUgZGlyZWN0aXZlIGluIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGVzICovCkBAIC0yNDIsMTMyICsyNDQsMTM4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIHdoaWxlIChjbWQtPm5hbWUubGVuKSB7CisgICAgICAgIGZvciAoIC8qIHZvaWQgKi8gOyBjbWQtPm5hbWUubGVuOyBjbWQrKykgewogCi0gICAgICAgICAgICBpZiAobmFtZS0+bGVuID09IGNtZC0+bmFtZS5sZW4KLSAgICAgICAgICAgICAgICAmJiBuZ3hfc3RyY21wKG5hbWUtPmRhdGEsIGNtZC0+bmFtZS5kYXRhKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlzIHRoZSBkaXJlY3RpdmUncyBsb2NhdGlvbiByaWdodCA/ICovCisgICAgICAgICAgICBpZiAobmFtZS0+bGVuICE9IGNtZC0+bmFtZS5sZW4pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghKGNtZC0+dHlwZSAmIGNmLT5jbWRfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiV1aSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbGxvd2VkIGhlcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgaWYgKG5neF9zdHJjbXAobmFtZS0+ZGF0YSwgY21kLT5uYW1lLmRhdGEpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aXZlJ3MgbG9jYXRpb24gcmlnaHQgPyAqLworCisgICAgICAgICAgICBpZiAoIShjbWQtPnR5cGUgJiBjZi0+Y21kX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNtZC0+dHlwZSAmIE5HWF9DT05GX01VTFRJKSB7CisgICAgICAgICAgICAgICAgICAgIG11bHRpID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKCEoY21kLT50eXBlICYgTkdYX0NPTkZfQkxPQ0spICYmIGxhc3QgIT0gTkdYX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgdGVybWluYXRlZCBieSBcIjtcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YtPmNvbmZfZmlsZS0+bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gbm90X2FsbG93ZWQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoKGNtZC0+dHlwZSAmIE5HWF9DT05GX0JMT0NLKQotICAgICAgICAgICAgICAgICAgICAmJiBsYXN0ICE9IE5HWF9DT05GX0JMT0NLX1NUQVJUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiV1aSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgdGhlIG9wZW5pbmcgXCJ7XCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGNtZC0+dHlwZSAmIE5HWF9DT05GX0JMT0NLKSAmJiBsYXN0ICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgXCIlc1wiIGluICVzOiV1aSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IHRlcm1pbmF0ZWQgYnkgXCI7XCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLyogaXMgdGhlIGRpcmVjdGl2ZSdzIGFyZ3VtZW50IGNvdW50IHJpZ2h0ID8gKi8KKyAgICAgICAgICAgIGlmICgoY21kLT50eXBlICYgTkdYX0NPTkZfQkxPQ0spICYmIGxhc3QgIT0gTkdYX0NPTkZfQkxPQ0tfU1RBUlQpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgdGhlIG9wZW5pbmcgXCJ7XCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNtZC0+dHlwZSAmIE5HWF9DT05GX0FOWSkgewotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7CisgICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aXZlJ3MgYXJndW1lbnQgY291bnQgcmlnaHQgPyAqLwogCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl9GTEFHKSB7CisgICAgICAgICAgICBpZiAoIShjbWQtPnR5cGUgJiBOR1hfQ09ORl9BTlkpKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNtZC0+dHlwZSAmIE5HWF9DT05GX0ZMQUcpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQtPnR5cGUgJiBOR1hfQ09ORl8xTU9SRSkgewogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjZi0+YXJncy0+bmVsdHMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjZi0+YXJncy0+bmVsdHMgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT50eXBlICYgTkdYX0NPTkZfMk1PUkUpIHsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY2YtPmFyZ3MtPm5lbHRzIDwgMykgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmLT5hcmdzLT5uZWx0cyA8PSBOR1hfQ09ORl9NQVhfQVJHUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNtZC0+dHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXJndW1lbnRfbnVtYmVyW2NmLT5hcmdzLT5uZWx0cyAtIDFdKSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmLT5hcmdzLT5uZWx0cyA+IE5HWF9DT05GX01BWF9BUkdTKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOworCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGNtZC0+dHlwZSAmIGFyZ3VtZW50X251bWJlcltjZi0+YXJncy0+bmVsdHMgLSAxXSkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIXZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBudW1iZXIgYXJndW1lbnRzIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPmRhdGEsIGNmLT5jb25mX2ZpbGUtPmZpbGUubmFtZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgLyogc2V0IHVwIHRoZSBkaXJlY3RpdmUncyBjb25maWd1cmF0aW9uIGNvbnRleHQgKi8KKworICAgICAgICAgICAgY29uZiA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChjbWQtPnR5cGUgJiBOR1hfRElSRUNUX0NPTkYpIHsKKyAgICAgICAgICAgICAgICBjb25mID0gKCh2b2lkICoqKSBjZi0+Y3R4KVtuZ3hfbW9kdWxlc1tpXS0+aW5kZXhdOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNtZC0+dHlwZSAmIE5HWF9NQUlOX0NPTkYpIHsKKyAgICAgICAgICAgICAgICBjb25mID0gJigoKHZvaWQgKiopIGNmLT5jdHgpW25neF9tb2R1bGVzW2ldLT5pbmRleF0pOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNmLT5jdHgpIHsKKyAgICAgICAgICAgICAgICBjb25mcCA9ICoodm9pZCAqKikgKChjaGFyICopIGNmLT5jdHggKyBjbWQtPmNvbmYpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbmZwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmYgPSBjb25mcFtuZ3hfbW9kdWxlc1tpXS0+Y3R4X2luZGV4XTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvKiBzZXQgdXAgdGhlIGRpcmVjdGl2ZSdzIGNvbmZpZ3VyYXRpb24gY29udGV4dCAqLworICAgICAgICAgICAgcnYgPSBjbWQtPnNldChjZiwgY21kLCBjb25mKTsKIAotICAgICAgICAgICAgICAgIGNvbmYgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChjbWQtPnR5cGUgJiBOR1hfRElSRUNUX0NPTkYpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZiA9ICgodm9pZCAqKikgY2YtPmN0eClbbmd4X21vZHVsZXNbaV0tPmluZGV4XTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21kLT50eXBlICYgTkdYX01BSU5fQ09ORikgewotICAgICAgICAgICAgICAgICAgICBjb25mID0gJigoKHZvaWQgKiopIGNmLT5jdHgpW25neF9tb2R1bGVzW2ldLT5pbmRleF0pOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjZi0+Y3R4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZwID0gKih2b2lkICoqKSAoKGNoYXIgKikgY2YtPmN0eCArIGNtZC0+Y29uZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gY29uZnBbbmd4X21vZHVsZXNbaV0tPmN0eF9pbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBydiA9IGNtZC0+c2V0KGNmLCBjbWQsIGNvbmYpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBcIiVzXCIgZGlyZWN0aXZlICVzIGluICVzOiV1aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBydiwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKLQorICAgICAgICAgICAgaWYgKHJ2ID09IE5HWF9DT05GX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY21kKys7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCIlc1wiIGRpcmVjdGl2ZSAlcyBpbiAlczoldWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBydiwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5jb25mX2ZpbGUtPmxpbmUpOworCisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKG11bHRpID09IDApIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGRpcmVjdGl2ZSBcIiVzXCIgaW4gJXM6JXVpIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5kYXRhLCBjZi0+Y29uZl9maWxlLT5maWxlLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKKworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworbm90X2FsbG93ZWQ6CisKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAidW5rbm93biBkaXJlY3RpdmUgXCIlc1wiIGluICVzOiV1aSIsCisgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkgIgorICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbGxvd2VkIGhlcmUiLAorICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKKyAgICByZXR1cm4gTkdYX0VSUk9SOworCitpbnZhbGlkOgorCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgImludmFsaWQgbnVtYmVyIGFyZ3VtZW50cyBpbiAiCisgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlIFwiJXNcIiBpbiAlczoldWkiLAogICAgICAgICAgICAgICAgICAgbmFtZS0+ZGF0YSwgY2YtPmNvbmZfZmlsZS0+ZmlsZS5uYW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICBjZi0+Y29uZl9maWxlLT5saW5lKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCmluZGV4IGExODNhNTcuLjM3ZDM2ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICNkZWZpbmUgTkdYX0NPTkZfQU5ZICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBOR1hfQ09ORl8xTU9SRSAgICAgICAweDAwMDAwODAwCiAjZGVmaW5lIE5HWF9DT05GXzJNT1JFICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTkdYX0NPTkZfTVVMVEkgICAgICAgMHgwMDAwMjAwMAogCiAjZGVmaW5lIE5HWF9ESVJFQ1RfQ09ORiAgICAgIDB4MDAwMTAwMDAKIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2xvZy5oIGIvc3JjL2NvcmUvbmd4X2xvZy5oCmluZGV4IDI5MGNhNzQuLmQ0OWY5ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9sb2cuaAorKysgYi9zcmMvY29yZS9uZ3hfbG9nLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgTkdYX0xPR19ERUJVR19FVkVOVCAgICAgICAweDA4MAogI2RlZmluZSBOR1hfTE9HX0RFQlVHX0hUVFAgICAgICAgIDB4MTAwCiAjZGVmaW5lIE5HWF9MT0dfREVCVUdfSU1BUCAgICAgICAgMHgyMDAKKyNkZWZpbmUgTkdYX0xPR19ERUJVR19NWVNRTCAgICAgICAweDQwMAogCiAvKgogICogZG8gbm90IGZvcmdldCB0byB1cGRhdGUgZGVidWdfbGV2ZWxzW10gaW4gc3JjL2NvcmUvbmd4X2xvZy5jCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FkZGl0aW9uX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZS5jCmluZGV4IDg0MjEyNGQuLjE1MjMxY2UgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWRkaXRpb25fZmlsdGVyX21vZHVsZS5jCkBAIC0xNDMsNyArMTQzLDkgQEAKICAgICAgICAgY3R4LT5iZWZvcmVfYm9keV9zZW50ID0gMTsKIAogICAgICAgICBpZiAoY29uZi0+YmVmb3JlX2JvZHkubGVuKSB7Ci0gICAgICAgICAgICBpZiAobmd4X2h0dHBfc3VicmVxdWVzdChyLCAmY29uZi0+YmVmb3JlX2JvZHksIE5VTEwsIDApICE9IE5HWF9PSykgeworICAgICAgICAgICAgaWYgKG5neF9odHRwX3N1YnJlcXVlc3QociwgJmNvbmYtPmJlZm9yZV9ib2R5LCBOVUxMLCAwKQorICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjUsNyArMTY3LDcgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIGlmIChuZ3hfaHR0cF9zdWJyZXF1ZXN0KHIsICZjb25mLT5hZnRlcl9ib2R5LCBOVUxMLCAwKSAhPSBOR1hfT0spIHsKKyAgICBpZiAobmd4X2h0dHBfc3VicmVxdWVzdChyLCAmY29uZi0+YWZ0ZXJfYm9keSwgTlVMTCwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCmluZGV4IGUxYTBlODYuLmIxYmExNzggMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICAgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKICAgICB9CiAKLSAgICBpZiAoci0+bWV0aG9kICE9IE5HWF9IVFRQX0dFVCAmJiByLT5tZXRob2QgIT0gTkdYX0hUVFBfSEVBRCkgeworICAgIGlmICghKHItPm1ldGhvZCAmIChOR1hfSFRUUF9HRVR8TkdYX0hUVFBfSEVBRCkpKSB7CiAgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2VtcHR5X2dpZl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZW1wdHlfZ2lmX21vZHVsZS5jCmluZGV4IGQ3Mjk4M2EuLjgyYmY4YzUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZW1wdHlfZ2lmX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZW1wdHlfZ2lmX21vZHVsZS5jCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICBuZ3hfYnVmX3QgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICBvdXQ7CiAKLSAgICBpZiAoci0+bWV0aG9kICE9IE5HWF9IVFRQX0dFVCAmJiByLT5tZXRob2QgIT0gTkdYX0hUVFBfSEVBRCkgeworICAgIGlmICghKHItPm1ldGhvZCAmIChOR1hfSFRUUF9HRVR8TkdYX0hUVFBfSEVBRCkpKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9OT1RfQUxMT1dFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X21vZHVsZS5jCmluZGV4IDQzMjZlNzMuLmQ0YmVkNDUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9tb2R1bGUuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CiAgICAgfQogCi0gICAgaWYgKHItPm1ldGhvZCAhPSBOR1hfSFRUUF9HRVQgJiYgci0+bWV0aG9kICE9IE5HWF9IVFRQX0hFQUQpIHsKKyAgICBpZiAoIShyLT5tZXRob2QgJiAoTkdYX0hUVFBfR0VUfE5HWF9IVFRQX0hFQUQpKSkgewogICAgICAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYwppbmRleCAwN2FjMTEzLi4zYWZiNmEzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYwpAQCAtMTI4LDcgKzEyOCw4IEBACiAgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoImFjY2Vzc19sb2ciKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMTIzLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfVEFLRTEyMywKICAgICAgIG5neF9odHRwX2xvZ19zZXRfbG9nLAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbWVtY2FjaGVkX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tZW1jYWNoZWRfbW9kdWxlLmMKaW5kZXggNzNjMDE4ZS4uYWNlODcyMyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tZW1jYWNoZWRfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9tZW1jYWNoZWRfbW9kdWxlLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgIG5neF9odHRwX21lbWNhY2hlZF9jdHhfdCAgICAgICAqY3R4OwogICAgIG5neF9odHRwX21lbWNhY2hlZF9sb2NfY29uZl90ICAqbWxjZjsKIAotICAgIGlmIChyLT5tZXRob2QgIT0gTkdYX0hUVFBfR0VUICYmIHItPm1ldGhvZCAhPSBOR1hfSFRUUF9IRUFEKSB7CisgICAgaWYgKCEoci0+bWV0aG9kICYgKE5HWF9IVFRQX0dFVHxOR1hfSFRUUF9IRUFEKSkpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX05PVF9BTExPV0VEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCmluZGV4IDgyZWU3YWMuLjUwMjRkMDAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKQEAgLTE4OCw2ICsxODgsNyBAQAogCiAjZGVmaW5lICBOR1hfSFRUUF9TU0lfSU5DTFVERV9WSVJUVUFMICAwCiAjZGVmaW5lICBOR1hfSFRUUF9TU0lfSU5DTFVERV9GSUxFICAgICAxCisjZGVmaW5lICBOR1hfSFRUUF9TU0lfSU5DTFVERV9XQUlUICAgICAyCiAKICNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX1ZBUiAgICAgICAgIDAKICNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX0RFRkFVTFQgICAgIDEKQEAgLTIwNCw2ICsyMDUsNyBAQAogc3RhdGljIG5neF9odHRwX3NzaV9wYXJhbV90ICBuZ3hfaHR0cF9zc2lfaW5jbHVkZV9wYXJhbXNbXSA9IHsKICAgICB7IG5neF9zdHJpbmcoInZpcnR1YWwiKSwgTkdYX0hUVFBfU1NJX0lOQ0xVREVfVklSVFVBTCwgMCwgMCB9LAogICAgIHsgbmd4X3N0cmluZygiZmlsZSIpLCBOR1hfSFRUUF9TU0lfSU5DTFVERV9GSUxFLCAwLCAwIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJ3YWl0IiksIE5HWF9IVFRQX1NTSV9JTkNMVURFX1dBSVQsIDAsIDAgfSwKICAgICB7IG5neF9udWxsX3N0cmluZywgMCwgMCwgMCB9CiB9OwogCkBAIC0zNjEsNyArMzYzLDEyIEBACiAKICAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CiAKLSAgICBpZiAoY3R4ID09IE5VTEwgfHwgKGluID09IE5VTEwgJiYgY3R4LT5pbiA9PSBOVUxMICYmIGN0eC0+YnVzeSA9PSBOVUxMKSkgeworICAgIGlmIChjdHggPT0gTlVMTAorICAgICAgICB8fCAoaW4gPT0gTlVMTAorICAgICAgICAgICAgJiYgY3R4LT5idWYgPT0gTlVMTAorICAgICAgICAgICAgJiYgY3R4LT5pbiA9PSBOVUxMCisgICAgICAgICAgICAmJiBjdHgtPmJ1c3kgPT0gTlVMTCkpCisgICAgewogICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBpbik7CiAgICAgfQogCkBAIC0zNzMsNiArMzgwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoY3R4LT53YWl0KSB7CisgICAgICAgIGlmIChyLT5jb25uZWN0aW9uLT5kYXRhICE9IHIpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgc3NpIGZpbHRlciBcIiVWXCIgd2FpdCIsICZyLT51cmkpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBzc2kgZmlsdGVyIFwiJVZcIiBjb250aW51ZSIsICZyLT51cmkpOworCisgICAgICAgIGN0eC0+d2FpdCA9IDA7CisgICAgfQorCiAgICAgc2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUpOwogCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCkBAIC02MzIsNiArNjUyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzgyLDggKzgwNiwxMyBAQAogCiAgICAgICAgIGNsID0gY3R4LT5idXN5OwogICAgICAgICBjdHgtPmJ1c3kgPSBjbC0+bmV4dDsKLSAgICAgICAgY2wtPm5leHQgPSBjdHgtPmZyZWU7Ci0gICAgICAgIGN0eC0+ZnJlZSA9IGNsOworCisgICAgICAgIGlmIChuZ3hfYnVmX2luX21lbW9yeShiKSB8fCBiLT5pbl9maWxlKSB7CisgICAgICAgICAgICAvKiBhZGQgZGF0YSBidWZzIG9ubHkgdG8gdGhlIGZyZWUgYnVmIGNoYWluICovCisKKyAgICAgICAgICAgIGNsLT5uZXh0ID0gY3R4LT5mcmVlOworICAgICAgICAgICAgY3R4LT5mcmVlID0gY2w7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmM7CkBAIC0xNjI2LDExICsxNjU1LDEzIEBACiBuZ3hfaHR0cF9zc2lfaW5jbHVkZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAogICAgIG5neF9zdHJfdCAqKnBhcmFtcykKIHsKLSAgICBuZ3hfc3RyX3QgICAqdXJpLCAqZmlsZSwgYXJnczsKKyAgICBuZ3hfaW50X3QgICAgcmM7CisgICAgbmd4X3N0cl90ICAgKnVyaSwgKmZpbGUsICp3YWl0LCBhcmdzOwogICAgIG5neF91aW50X3QgICBmbGFnczsKIAogICAgIHVyaSA9IHBhcmFtc1tOR1hfSFRUUF9TU0lfSU5DTFVERV9WSVJUVUFMXTsKICAgICBmaWxlID0gcGFyYW1zW05HWF9IVFRQX1NTSV9JTkNMVURFX0ZJTEVdOworICAgIHdhaXQgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0lOQ0xVREVfV0FJVF07CiAKICAgICBpZiAodXJpICYmIGZpbGUpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLApAQCAtMTY0NSw2ICsxNjc2LDI2IEBACiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CiAgICAgfQogCisgICAgaWYgKHdhaXQpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIndhaXRcIiBtYXkgbm90IGJlIHVzZWQgd2l0aCBmaWxlPVwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdhaXQtPmxlbiA9PSAyICYmIG5neF9zdHJuY2FzZWNtcCh3YWl0LT5kYXRhLCAibm8iLCAyKSA9PSAwKSB7CisgICAgICAgICAgICB3YWl0ID0gTlVMTDsKKworICAgICAgICB9IGVsc2UgaWYgKHdhaXQtPmxlbiAhPSAzIHx8IG5neF9zdHJuY2FzZWNtcCh3YWl0LT5kYXRhLCAieWVzIiwgMykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YWx1ZSBcIiVWXCIgaW4gdGhlIFwid2FpdFwiIHBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YWl0KTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAodXJpID09IE5VTEwpIHsKICAgICAgICAgdXJpID0gZmlsZTsKICAgICB9CkBAIC0xNjY2LDExICsxNzE3LDIxIEBACiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG5neF9odHRwX3N1YnJlcXVlc3QociwgdXJpLCAmYXJncywgZmxhZ3MpICE9IE5HWF9PSykgeworICAgIHJjID0gbmd4X2h0dHBfc3VicmVxdWVzdChyLCB1cmksICZhcmdzLCBmbGFncyk7CisKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CiAgICAgfQogCi0gICAgcmV0dXJuIE5HWF9PSzsKKyAgICBpZiAod2FpdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICBjdHgtPndhaXQgPSAxOworICAgIH0KKworICAgIHJldHVybiByYzsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmggYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmgKaW5kZXggZWZmMjM2MC4uMGQ5NjE4YiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuaApAQCAtNjEsNiArNjEsNyBAQAogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWw6MjsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIG91dHB1dDoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgb3V0cHV0X2Nob3NlbjoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgd2FpdDoxOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICp2YWx1ZV9idWY7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICB0aW1lZm10OwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwppbmRleCAzMzk5ZTUwLi5hZDA4ODUyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwpAQCAtODYsNyArODYsNyBAQAogICAgIG5neF9wb29sX2NsZWFudXBfZmlsZV90ICAgKmNsbmY7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAotICAgIGlmIChyLT5tZXRob2QgIT0gTkdYX0hUVFBfR0VUICYmIHItPm1ldGhvZCAhPSBOR1hfSFRUUF9IRUFEKSB7CisgICAgaWYgKCEoci0+bWV0aG9kICYgKE5HWF9IVFRQX0dFVHxOR1hfSFRUUF9IRUFEKSkpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX05PVF9BTExPV0VEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnBtIGIvc3JjL2h0dHAvbW9kdWxlcy9wZXJsL25naW54LnBtCmluZGV4IGQ4N2IyZWMuLmJhZGQ0OTQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvcGVybC9uZ2lueC5wbQorKysgYi9zcmMvaHR0cC9tb2R1bGVzL3BlcmwvbmdpbngucG0KQEAgLTE3LDcgKzE3LDcgQEAKICAgICBIVFRQX1NFUlZFUl9FUlJPUgogKTsKIAotb3VyICRWRVJTSU9OID0gJzAuMy4yMyc7CitvdXIgJFZFUlNJT04gPSAnMC4zLjQzJzsKIAogcmVxdWlyZSBYU0xvYWRlcjsKIFhTTG9hZGVyOjpsb2FkKCduZ2lueCcsICRWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IDYyNzlmMzQuLjkzMWJlODggMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAogICAgIHNyID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlcXVlc3RfdCkpOwogICAgIGlmIChzciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgc3ItPnNpZ25hdHVyZSA9IE5HWF9IVFRQX01PRFVMRTsKQEAgLTExNzgsMTQgKzExNzgsMTQgQEAKIAogICAgIHNyLT5jdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yodm9pZCAqKSAqIG5neF9odHRwX21heF9tb2R1bGUpOwogICAgIGlmIChzci0+Y3R4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICBpZiAobmd4X2xpc3RfaW5pdCgmc3ItPmhlYWRlcnNfb3V0LmhlYWRlcnMsIHItPnBvb2wsIDIwLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKQogICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAogICAgIGNzY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX3Nydl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKQEAgLTEyMjgsNyArMTIyOCw3IEBACiAgICAgc3ItPmh0dHBfcHJvdG9jb2wgPSByLT5odHRwX3Byb3RvY29sOwogCiAgICAgaWYgKG5neF9odHRwX3NldF9leHRlbihzcikgIT0gTkdYX09LKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgc3ItPm1haW4gPSByLT5tYWluOwpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKIAogICAgIHByID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCkpOwogICAgIGlmIChwciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgcHItPnJlcXVlc3QgPSBzcjsKQEAgLTEyNzUsMTAgKzEyNzUsMTggQEAKICAgICBuZ3hfaHR0cF9oYW5kbGVyKHNyKTsKIAogICAgIGlmICghYy0+ZGVzdHJveWVkKSB7Ci0gICAgICAgIHNyLT5mYXN0X3N1YnJlcXVlc3QgPSAwOwotCiAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBzdWJyZXF1ZXN0IGRvbmUgXCIlVj8lVlwiIiwgdXJpLCAmc3ItPmFyZ3MpOworCisgICAgICAgIGlmIChzci0+ZmFzdF9zdWJyZXF1ZXN0KSB7CisgICAgICAgICAgICBzci0+ZmFzdF9zdWJyZXF1ZXN0ID0gMDsKKworICAgICAgICAgICAgaWYgKHNyLT5kb25lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOR1hfQUdBSU47CiAgICAgfQogCiAgICAgcmV0dXJuIE5HWF9PSzsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwppbmRleCBkODAxZTJjLi42ODBiM2JkIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCkBAIC05NTgsNyArOTU4LDcgQEAKICAgICB9CiAKICAgICBpZiAobiA9PSAwIHx8IG4gPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfQkFEX1JFUVVFU1QpOworICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0JBRF9SRVFVRVNUKTsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTE0ODAsMTcgKzE0ODAsMjQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHItPmZhc3Rfc3VicmVxdWVzdCkgeworCisgICAgICAgICAgICAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICAgICAgICAgICAgICByLT5mYXN0X3N1YnJlcXVlc3QgPSAwOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZmFzdCBzdWJyZXF1ZXN0OiBcIiVWPyVWXCIgZG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmci0+dXJpLCAmci0+YXJncyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHdha2UgcGFyZW50IHJlcXVlc3Q6IFwiJVY/JVZcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcHItPnVyaSwgJnByLT5hcmdzKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOR1hfQUdBSU4pIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCB3YWtlIHBhcmVudCByZXF1ZXN0OiBcIiVWPyVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwci0+dXJpLCAmcHItPmFyZ3MpOwogCi0gICAgICAgICAgICBwci0+d3JpdGVfZXZlbnRfaGFuZGxlcihwcik7CisgICAgICAgICAgICAgICAgcHItPndyaXRlX2V2ZW50X2hhbmRsZXIocHIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc3JjL215c3FsL25neF9teXNxbC5jIGIvc3JjL215c3FsL25neF9teXNxbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDA4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbXlzcWwvbmd4X215c3FsLmMKQEAgLTAsMCArMSwxMzYgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfZXZlbnQuaD4KKyNpbmNsdWRlIDxuZ3hfbXlzcWwuaD4KKworCisvKiB0aGUgbGlicmFyeSBzdXBwb3J0cyB0aGUgc3Vic2V0IG9mIHRoZSBNeVNRTCA0LjErIHByb3RvY29sICh2ZXJzaW9uIDEwKSAqLworCisKK25neF9pbnRfdAorbmd4X215c3FsX2Nvbm5lY3Qobmd4X215c3FsX3QgKm0pCit7CisgICAgbmd4X2ludF90ICByYzsKKworI2lmIDAKKyAgICBpZiAoY2FjaGVkKSB7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorI2VuZGlmCisKKyAgICBtLT5wZWVyLmxvZy0+YWN0aW9uID0gImNvbm5lY3RpbmcgdG8gbXlzcWwgc2VydmVyIjsKKworICAgIHJjID0gbmd4X2V2ZW50X2Nvbm5lY3RfcGVlcigmbS0+cGVlcik7CisKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SIHx8IHJjID09IE5HWF9CVVNZIHx8IHJjID09IE5HWF9ERUNMSU5FRCkgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X215c3FsX3JlYWRfc2VydmVyX2dyZWV0aW5nOworICAgIG0tPnBlZXIuY29ubmVjdGlvbi0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfbXlzcWxfZW10cHlfaGFuZGxlcjsKKworICAgIG5neF9hZGRfdGltZXIobS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLCAvKiBTVFVCICovIDUwMDApOworICAgIG5neF9hZGRfdGltZXIobS0+cGVlci5jb25uZWN0aW9uLT53cml0ZSwgLyogU1RVQiAqLyA1MDAwKTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIHZvaWQKK25neF9teXNxbF9yZWFkX3NlcnZlcl9ncmVldGluZyhuZ3hfZXZlbnRfdCAqcmV2KQoreworICAgIHNpemVfdCAgICAgICAgICAgICBsZW47CisgICAgdV9jaGFyICAgICAgICAgICAgKnAsICp0OworICAgIG5neF9teXNxbF90ICAgICAgICptOworICAgIG5neF9jb25uZWN0aW9uX3QgICpjOworCisgICAgYyA9IHJldi0+ZGF0YTsKKyAgICBtID0gYy0+ZGF0YTsKKworICAgIGlmIChyZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHJldi0+bG9nLCBOR1hfRVRJTUVET1VULAorICAgICAgICAgICAgICAgICAgICAgICJteXNxbCBzZXJ2ZXIgJVYgdGltZWQgb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUpOworCisgICAgICAgIG5neF9teXNxbF9jbG9zZShtLCBOR1hfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG0tPmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIG0tPnBlZXIubG9nLT5hY3Rpb24gPSAicmVhZGluZyB0byBteXNxbCBzZXJ2ZXIgZ3JlZXRpbmciOworCisgICAgICAgIG0tPmJ1ZiA9IG5neF9jcmVhdGVfdGVtcChtLT5wb29sLCAvKiBTVFVCICovIDEwMjQpOworICAgICAgICBpZiAobS0+YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9teXNxbF9jbG9zZShtLCBOR1hfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbiA9IG5neF9yZWN2KG0tPnBlZXIuY29ubmVjdGlvbiwgbS0+YnVmLT5wb3MsIC8qIFNUVUIgKi8gMTAyNCk7CisKKyAgICBpZiAobiA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChuIDwgNSkgeworICAgICAgICBuZ3hfbXlzcWxfY2xvc2UobSwgTkdYX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHAgPSBtLT5idWYtPnBvczsKKworICAgIGlmIChuZ3hfbTI0dG9oKHApID4gbiAtIDQpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcmV2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgIm15c3FsIHNlcnZlciAlViBzZW50IGluY29tcGxldGUgZ3JlZXRpbmcgcGFja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUpOworCisgICAgICAgIG5neF9teXNxbF9jbG9zZShtLCBOR1hfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBbNF0pIDwgMTApIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcmV2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgIm15c3FsIHNlcnZlciAlViBzZW50IHVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24gJXVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wZWVyLnBlZXJzLT5wZWVyWzBdLm5hbWUsIHBbNF0pOworCisgICAgICAgIG5neF9teXNxbF9jbG9zZShtLCBOR1hfRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuID0gbmd4X3N0cmxlbigmcFs1XSk7CisgICAgdCA9IHAgKyA1ICsgbGVuICsgMTsKKworICAgIGNhcGFjaXR5ID0gbmd4X20xNnRvaCgoJnRbNCArIDldKSk7CisKKyAgICBuZ3hfbG9nX2RlYnVnOChOR1hfTE9HX0RFQlVHX01ZU1FMLCByZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAibXlzcWwgdmVyc2lvbjogJXVkLCBcIiVzXCIsIHRocmVhZDogJXVkLCBzYWx0OiBcIiVzXCIsICIsCisgICAgICAgICAgICAgICAgICAgImNhcGFjaXR5OiAlWGQsIGNoYXJzZXQ6ICV1ZCwgc3RhdHVzOiAldWQsIHNhbHQgcmVzdCBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgIHBbNF0sICZwWzVdLCBuZ3hfbTMydG9oKHQpLCAmdFs0XSwKKyAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwgdFs0ICsgOSArIDJdLAorICAgICAgICAgICAgICAgICAgIG5neF9tMTZ0b2goKCZ0WzQgKyA5ICsgMiArIDFdKSksCisgICAgICAgICAgICAgICAgICAgdFs0ICsgOSArIDIgKyAxICsgMiArIDEzXSk7CisKKyAgICBjYXBhY2l0eSAmPSBOR1hfTVlTUUxfTE9OR19QQVNTV09SRAorICAgICAgICAgICAgICAgIHwgTkdYX01ZU1FMX0NPTk5FQ1RfV0lUSF9EQgorICAgICAgICAgICAgICAgIHwgTkdYX01ZU1FMX1BST1RPQ09MXzQxOworCit9CisKKworc3RhdGljIHZvaWQKK25neF9teXNxbF9jbG9zZShuZ3hfbXlzcWxfdCAqbSwgbmd4X2ludF90IHJjKQoreworICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24obS0+cGVlci5jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBtLT5zdGF0ZSA9IHJjOworCisgICAgbS0+aGFuZGxlcihtKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9teXNxbC9uZ3hfbXlzcWwuaCBiL3NyYy9teXNxbC9uZ3hfbXlzcWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWYxMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL215c3FsL25neF9teXNxbC5oCkBAIC0wLDAgKzEsMzYgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpZm5kZWYgX05HWF9NWVNRTF9IX0lOQ0xVREVEXworI2RlZmluZSBfTkdYX01ZU1FMX0hfSU5DTFVERURfCisKKworI2luY2x1ZGUgPG5neF9jb25maWcuaD4KKyNpbmNsdWRlIDxuZ3hfY29yZS5oPgorI2luY2x1ZGUgPG5neF9ldmVudC5oPgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfcGVlcl9jb25uZWN0aW9uX3QgICBwZWVyOworfSBuZ3hfbXlzcWxfdDsKKworCisjaWYgKE5HWF9IQVZFX0xJVFRMRV9FTkRJQU4gJiYgTkdYX0hBVkVfTk9OQUxJR05FRCAmJiAwKQorCisjZGVmaW5lIG5neF9tMTZ0b2gobikgICAoKih1aW50MzJfdCAqKSBuICYgMHgwMDAwZmZmZikKKyNkZWZpbmUgbmd4X20yNHRvaChuKSAgICgqKHVpbnQzMl90ICopIG4gJiAweDAwZmZmZmZmKQorI2RlZmluZSBuZ3hfbTMydG9oKG4pICAgKih1aW50MzJfdCAqKSBuCisKKyNlbHNlCisKKyNkZWZpbmUgbmd4X20xNnRvaChuKSAgIChuWzBdIHwgblsxXSA8PCA4KQorI2RlZmluZSBuZ3hfbTI0dG9oKG4pICAgKG5bMF0gfCBuWzFdIDw8IDggfCBuWzJdIDw8IDE2KQorI2RlZmluZSBuZ3hfbTMydG9oKG4pICAgKG5bMF0gfCBuWzFdIDw8IDggfCBuWzJdIDw8IDE2IHwgblszXSA8PCAyNCkKKworI2VuZGlmCisKKworI2VuZGlmIC8qIF9OR1hfTVlTUUxfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9zb2NrZXQuYyBiL3NyYy9vcy91bml4L25neF9zb2NrZXQuYwppbmRleCA2MDg4NWRkLi5hOTM2NzlmIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfc29ja2V0LmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3NvY2tldC5jCkBAIC0xMCw3ICsxMCw3IEBACiAKIC8qCiAgKiBpb2N0bChGSU9OQklPKSBzZXRzIGEgYmxvY2tpbmcgbW9kZSB3aXRoIHRoZSBzaW5nbGUgc3lzY2FsbAotICogd2hpbGUgZmNudGwoRl9TRVRGTCwgfk9fTk9OQkxPQ0spIG5lZWRzIHRvIGxlYXJuIGJlZm9yZQorICogd2hpbGUgZmNudGwoRl9TRVRGTCwgIU9fTk9OQkxPQ0spIG5lZWRzIHRvIGxlYXJuIGJlZm9yZQogICogdGhlIHByZXZpb3VzIHN0YXRlIHVzaW5nIGZjbnRsKEZfR0VURkwpLgogICoKICAqIGlvY3RsKCkgYW5kIGZjbnRsKCkgYXJlIHN5c2NhbGxzIGF0IGxlYXN0IGluIEZyZWVCU0QgMi54LCBMaW51eCAyLjIKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9zb2NrZXQuaCBiL3NyYy9vcy91bml4L25neF9zb2NrZXQuaAppbmRleCBiMzgxOTY3Li45ZTZhODU5IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfc29ja2V0LmgKKysrIGIvc3JjL29zL3VuaXgvbmd4X3NvY2tldC5oCkBAIC0yOSw5ICsyOSwxMiBAQAogCiAjZWxzZQogCi0jZGVmaW5lIG5neF9ub25ibG9ja2luZyhzKSAgZmNudGwocywgRl9TRVRGTCwgT19OT05CTE9DSykKKyNkZWZpbmUgbmd4X25vbmJsb2NraW5nKHMpICBmY250bChzLCBGX1NFVEZMLCBmY250bChzLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spCiAjZGVmaW5lIG5neF9ub25ibG9ja2luZ19uICAgImZjbnRsKE9fTk9OQkxPQ0spIgogCisjZGVmaW5lIG5neF9ibG9ja2luZyhzKSAgICAgZmNudGwocywgRl9TRVRGTCwgZmNudGwocywgRl9HRVRGTCkgJiB+T19OT05CTE9DSykKKyNkZWZpbmUgbmd4X2Jsb2NraW5nX24gICAgICAiZmNudGwoIU9fTk9OQkxPQ0spIgorCiAjZW5kaWYKIAogaW50IG5neF90Y3Bfbm9wdXNoKG5neF9zb2NrZXRfdCBzKTsK