ZGlmZiAtLWdpdCBhL2ludGwvQ2hhbmdlTG9nIGIvaW50bC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzkwODEuLjAwMDAwMDAKLS0tIGEvaW50bC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTIwMDctMTEtMDcgIEdOVSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgotCi0JKiBWZXJzaW9uIDAuMTcgcmVsZWFzZWQuCi0KZGlmZiAtLWdpdCBhL2ludGwvTWFrZWZpbGUuaW4gYi9pbnRsL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmVkMDg1Li4wMDAwMDAwCi0tLSBhL2ludGwvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGxpYnJhcnkgb2YgR05VIGdldHRleHQKLSMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotIyBVU0EuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi10b3BfYnVpbGRkaXIgPSAuLgotCi0jIFRoZSBWUEFUSCB2YXJpYWJsZXMgYWxsb3dzIGJ1aWxkcyB3aXRoICRidWlsZGRpciAhPSAkc3JjZGlyLCBhc3N1bWluZyBhCi0jICdtYWtlJyBwcm9ncmFtIHRoYXQgc3VwcG9ydHMgVlBBVEggKHN1Y2ggYXMgR05VIG1ha2UpLiBUaGlzIGxpbmUgaXMgcmVtb3ZlZAotIyBieSBhdXRvY29uZiBhdXRvbWF0aWNhbGx5IHdoZW4gIiQoc3JjZGlyKSIgPSAiLiIuCi0jIEluIHRoaXMgZGlyZWN0b3J5LCB0aGUgVlBBVEggaGFuZGxpbmcgaXMgcGFydGljdWxhcjoKLSMgMS4gSWYgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVggaXMgJ2wnIChpbmRpY2F0aW5nIGEgYnVpbGQgd2l0aCBsaWJ0b29sKSwKLSMgICAgdGhlIC5jIC0+IC5sbyBydWxlcyBjYXJlZnVsbHkgdXNlICQoc3JjZGlyKSwgc28gdGhhdCBWUEFUSCBjYW4gYmUgb21pdHRlZC4KLSMgMi4gSWYgUEFDS0FHRSA9IGdldHRleHQtdG9vbHMsIFZQQVRIIF9tdXN0XyBiZSBvbWl0dGVkLCBiZWNhdXNlIG90aGVyd2lzZQotIyAgICAnbWFrZScgZG9lcyB0aGUgd3JvbmcgdGhpbmcgaWYgR05VIGdldHRleHQgd2FzIGNvbmZpZ3VyZWQgd2l0aAotIyAgICAiLi9jb25maWd1cmUgLS1zcmNkaXI9YHB3ZGAiLCBuYW1lbHkgaXQgZ2V0cyBjb25mdXNlZCBieSB0aGUgLmxvIGFuZCAubGEKLSMgICAgZmlsZXMgaXQgZmluZHMgaW4gc3JjZGlyID0gLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwuCi1WUEFUSCA9ICQoc3JjZGlyKQotCi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1kYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gJChkYXRhZGlyKS9nZXR0ZXh0L2ludGwKLWFsaWFzcGF0aCA9ICQobG9jYWxlZGlyKQotc3ViZGlyID0gaW50bAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotCi0jIFdlIHVzZSAkKG1rZGlyX3ApLgotIyBJbiBhdXRvbWFrZSA8PSAxLjkueCwgJChta2Rpcl9wKSBpcyBkZWZpbmVkIGVpdGhlciBhcyAibWtkaXIgLXAgLS0iIG9yIGFzCi0jICIkKG1raW5zdGFsbGRpcnMpIiBvciBhcyAiJChpbnN0YWxsX3NoKSAtZCIuIEZvciB0aGVzZSBhdXRvbWFrZSB2ZXJzaW9ucywKLSMgQGluc3RhbGxfc2hAIGRvZXMgbm90IHN0YXJ0IHdpdGggJChTSEVMTCksIHNvIHdlIGFkZCBpdC4KLSMgSW4gYXV0b21ha2UgPj0gMS4xMCwgQG1rZGlyX3BAIGlzIGRlcml2ZWQgZnJvbSAke01LRElSX1B9LCB3aGljaCBpcyBkZWZpbmVkCi0jIGVpdGhlciBhcyAiL3BhdGgvdG8vbWtkaXIgLXAiIG9yICIuLi4vaW5zdGFsbC1zaCAtYyAtZCIuIEZvciB0aGVzZSBhdXRvbWFrZQotIyB2ZXJzaW9ucywgJChta2luc3RhbGxkaXJzKSBhbmQgJChpbnN0YWxsX3NoKSBhcmUgdW51c2VkLgotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpIEBpbnN0YWxsX3NoQCAtZAotaW5zdGFsbF9zaCA9ICQoU0hFTEwpIEBpbnN0YWxsX3NoQAotTUtESVJfUCA9IEBNS0RJUl9QQAotbWtkaXJfcCA9IEBta2Rpcl9wQAotCi1sID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAotCi1BUiA9IGFyCi1DQyA9IEBDQ0AKLUxJQlRPT0wgPSBATElCVE9PTEAKLVJBTkxJQiA9IEBSQU5MSUJACi1ZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKLVlGTEFHUyA9IC0tbmFtZS1wcmVmaXg9X19nZXR0ZXh0Ci1XSU5EUkVTID0gQFdJTkRSRVNACi0KLSMgLURCVUlMRElOR19MSUJJTlRMOiBDaGFuZ2UgZXhwYW5zaW9uIG9mIExJQklOVExfRExMX0VYUE9SVEVEIG1hY3JvLgotIyAtREJVSUxESU5HX0RMTDogQ2hhbmdlIGV4cGFuc2lvbiBvZiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgbWFjcm8uCi1ERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgXAotLURMSUJESVI9XCIkKGxpYmRpcilcIiAtREJVSUxESU5HX0xJQklOVEwgLURCVUlMRElOR19ETEwgLURJTl9MSUJJTlRMIFwKLS1ERU5BQkxFX1JFTE9DQVRBQkxFPTEgLURJTl9MSUJSQVJZIC1ESU5TVEFMTERJUj1cIiQobGliZGlyKVwiIC1ETk9fWE1BTExPQyBcCi0tRHNldF9yZWxvY2F0aW9uX3ByZWZpeD1saWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBcCi0tRHJlbG9jYXRlPWxpYmludGxfcmVsb2NhdGUgXAotLURERVBFTkRTX09OX0xJQklDT05WPTEgQERFRlNACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNGTEFHUyA9IEBDRkxBR1NAIEBDRkxBR19WSVNJQklMSVRZQAotTERGTEFHUyA9IEBMREZMQUdTQCAkKExERkxBR1NfQFdPRTMyRExMQCkKLUxERkxBR1NfeWVzID0gLVdsLC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1MREZMQUdTX25vID0KLUxJQlMgPSBATElCU0AKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotSEVBREVSUyA9IFwKLSAgZ21vLmggXAotICBnZXR0ZXh0UC5oIFwKLSAgaGFzaC1zdHJpbmcuaCBcCi0gIGxvYWRpbmZvLmggXAotICBwbHVyYWwtZXhwLmggXAotICBldmFsLXBsdXJhbC5oIFwKLSAgbG9jYWxjaGFyc2V0LmggXAotICBsb2NrLmggXAotICByZWxvY2F0YWJsZS5oIFwKLSAgdHNlYXJjaC5oIHRzZWFyY2guYyBcCi0gIHhzaXplLmggXAotICBwcmludGYtYXJncy5oIHByaW50Zi1hcmdzLmMgXAotICBwcmludGYtcGFyc2UuaCB3cHJpbnRmLXBhcnNlLmggcHJpbnRmLXBhcnNlLmMgXAotICB2YXNucHJpbnRmLmggdmFzbndwcmludGYuaCB2YXNucHJpbnRmLmMgXAotICBvczJjb21wYXQuaCBcCi0gIGxpYmdudWludGwuaC5pbgotU09VUkNFUyA9IFwKLSAgYmluZHRleHRkb20uYyBcCi0gIGRjZ2V0dGV4dC5jIFwKLSAgZGdldHRleHQuYyBcCi0gIGdldHRleHQuYyBcCi0gIGZpbmRkb21haW4uYyBcCi0gIGhhc2gtc3RyaW5nLmMgXAotICBsb2FkbXNnY2F0LmMgXAotICBsb2NhbGVhbGlhcy5jIFwKLSAgdGV4dGRvbWFpbi5jIFwKLSAgbDEwbmZsaXN0LmMgXAotICBleHBsb2RlbmFtZS5jIFwKLSAgZGNpZ2V0dGV4dC5jIFwKLSAgZGNuZ2V0dGV4dC5jIFwKLSAgZG5nZXR0ZXh0LmMgXAotICBuZ2V0dGV4dC5jIFwKLSAgcGx1cmFsLnkgXAotICBwbHVyYWwtZXhwLmMgXAotICBsb2NhbGNoYXJzZXQuYyBcCi0gIGxvY2suYyBcCi0gIHJlbG9jYXRhYmxlLmMgXAotICBsYW5ncHJlZnMuYyBcCi0gIGxvY2FsZW5hbWUuYyBcCi0gIGxvZy5jIFwKLSAgcHJpbnRmLmMgXAotICB2ZXJzaW9uLmMgXAotICBvc2RlcC5jIFwKLSAgb3MyY29tcGF0LmMgXAotICBpbnRsLWV4cG9ydHMuYyBcCi0gIGludGwtY29tcGF0LmMKLU9CSkVDVFMgPSBcCi0gIGJpbmR0ZXh0ZG9tLiRsbyBcCi0gIGRjZ2V0dGV4dC4kbG8gXAotICBkZ2V0dGV4dC4kbG8gXAotICBnZXR0ZXh0LiRsbyBcCi0gIGZpbmRkb21haW4uJGxvIFwKLSAgaGFzaC1zdHJpbmcuJGxvIFwKLSAgbG9hZG1zZ2NhdC4kbG8gXAotICBsb2NhbGVhbGlhcy4kbG8gXAotICB0ZXh0ZG9tYWluLiRsbyBcCi0gIGwxMG5mbGlzdC4kbG8gXAotICBleHBsb2RlbmFtZS4kbG8gXAotICBkY2lnZXR0ZXh0LiRsbyBcCi0gIGRjbmdldHRleHQuJGxvIFwKLSAgZG5nZXR0ZXh0LiRsbyBcCi0gIG5nZXR0ZXh0LiRsbyBcCi0gIHBsdXJhbC4kbG8gXAotICBwbHVyYWwtZXhwLiRsbyBcCi0gIGxvY2FsY2hhcnNldC4kbG8gXAotICBsb2NrLiRsbyBcCi0gIHJlbG9jYXRhYmxlLiRsbyBcCi0gIGxhbmdwcmVmcy4kbG8gXAotICBsb2NhbGVuYW1lLiRsbyBcCi0gIGxvZy4kbG8gXAotICBwcmludGYuJGxvIFwKLSAgdmVyc2lvbi4kbG8gXAotICBvc2RlcC4kbG8gXAotICBpbnRsLWNvbXBhdC4kbG8KLU9CSkVDVFNfUkVTX3llcyA9IGxpYmludGwucmVzCi1PQkpFQ1RTX1JFU19ubyA9Ci1ESVNURklMRVMuY29tbW9uID0gTWFrZWZpbGUuaW4gXAotY29uZmlnLmNoYXJzZXQgbG9jYWxlLmFsaWFzIHJlZi1hZGQuc2luIHJlZi1kZWwuc2luIGV4cG9ydC5oIGxpYmludGwucmMgXAotJChIRUFERVJTKSAkKFNPVVJDRVMpCi1ESVNURklMRVMuZ2VuZXJhdGVkID0gcGx1cmFsLmMKLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi1ESVNURklMRVMuZ2V0dGV4dCA9IENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgbGliaW50bC5nbGliYyBSRUFETUUud29lMzIKLURJU1RGSUxFUy5vYnNvbGV0ZSA9IHhvcGVuLW1zZy5zZWQgbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIGNhdC1jb21wYXQuYyBcCi1DT1BZSU5HLkxJQi0yIGdldHRleHQuaCBsaWJnZXR0ZXh0LmggcGx1cmFsLWV2YWwuYyBsaWJnbnVpbnRsLmggXAotbGliZ251aW50bC5oX3ZtcyBNYWtlZmlsZS52bXMgbGliZ251aW50bC5oLm1zdmMtc3RhdGljIFwKLWxpYmdudWludGwuaC5tc3ZjLXNoYXJlZCBNYWtlZmlsZS5tc3ZjCi0KLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKLWFsbC15ZXM6IGxpYmludGwuJGxhIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCi1hbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKLWFsbC1uby15ZXM6IGxpYmdudWludGwuJGxhCi1hbGwtbm8tbm86Ci0KLWxpYmludGwuYSBsaWJnbnVpbnRsLmE6ICQoT0JKRUNUUykKLQlybSAtZiAkQAotCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0JJChSQU5MSUIpICRACi0KLWxpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKSAkKE9CSkVDVFNfUkVTX0BXT0UzMkApCi0JJChMSUJUT09MKSAtLW1vZGU9bGluayBcCi0JICAkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIFwKLQkgICQoT0JKRUNUUykgQExUTElCSUNPTlZAIEBJTlRMX01BQ09TWF9MSUJTQCAkKExJQlMpIEBMVExJQlRIUkVBREAgQExUTElCQ0AgXAotCSAgJChPQkpFQ1RTX1JFU19AV09FMzJAKSBcCi0JICAtdmVyc2lvbi1pbmZvICQoTFRWX0NVUlJFTlQpOiQoTFRWX1JFVklTSU9OKTokKExUVl9BR0UpIFwKLQkgIC1ycGF0aCAkKGxpYmRpcikgXAotCSAgLW5vLXVuZGVmaW5lZAotCi0jIExpYnRvb2wncyBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmludGwuCi0jIEJlZm9yZSBtYWtpbmcgYSBnZXR0ZXh0IHJlbGVhc2UsIHRoZSBnZXR0ZXh0IG1haW50YWluZXIgbXVzdCBjaGFuZ2UgdGhpcwotIyBhY2NvcmRpbmcgdG8gdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiLgotIyBNYWludGFpbmVycyBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIGludGwgZGlyZWN0b3J5IG11c3QgKm5vdCoKLSMgY2hhbmdlIHRoZXNlIHZhbHVlcy4KLUxUVl9DVVJSRU5UPTgKLUxUVl9SRVZJU0lPTj0yCi1MVFZfQUdFPTAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAueSAubyAubG8gLnNpbiAuc2VkCi0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ueS5jOgotCSQoWUFDQykgJChZRkxBR1MpIC0tb3V0cHV0ICRAICQ8Ci0Jcm0gLWYgJCouaAotCi1iaW5kdGV4dGRvbS5sbzogJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2JpbmR0ZXh0ZG9tLmMKLWRjZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY2dldHRleHQuYwotZGdldHRleHQubG86ICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kZ2V0dGV4dC5jCi1nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9nZXR0ZXh0LmMKLWZpbmRkb21haW4ubG86ICQoc3JjZGlyKS9maW5kZG9tYWluLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2ZpbmRkb21haW4uYwotaGFzaC1zdHJpbmcubG86ICQoc3JjZGlyKS9oYXNoLXN0cmluZy5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9oYXNoLXN0cmluZy5jCi1sb2FkbXNnY2F0LmxvOiAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKLWxvY2FsZWFsaWFzLmxvOiAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwotdGV4dGRvbWFpbi5sbzogJChzcmNkaXIpL3RleHRkb21haW4uYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCi1sMTBuZmxpc3QubG86ICQoc3JjZGlyKS9sMTBuZmxpc3QuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbDEwbmZsaXN0LmMKLWV4cGxvZGVuYW1lLmxvOiAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYwotZGNpZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjaWdldHRleHQuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCi1kY25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKLWRuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RuZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kbmdldHRleHQuYwotbmdldHRleHQubG86ICQoc3JjZGlyKS9uZ2V0dGV4dC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9uZ2V0dGV4dC5jCi1wbHVyYWwubG86ICQoc3JjZGlyKS9wbHVyYWwuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLmMKLXBsdXJhbC1leHAubG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC1leHAuYwotbG9jYWxjaGFyc2V0LmxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCi1sb2NrLmxvOiAkKHNyY2RpcikvbG9jay5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NrLmMKLXJlbG9jYXRhYmxlLmxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcmVsb2NhdGFibGUuYwotbGFuZ3ByZWZzLmxvOiAkKHNyY2RpcikvbGFuZ3ByZWZzLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xhbmdwcmVmcy5jCi1sb2NhbGVuYW1lLmxvOiAkKHNyY2RpcikvbG9jYWxlbmFtZS5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKLWxvZy5sbzogJChzcmNkaXIpL2xvZy5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2cuYwotcHJpbnRmLmxvOiAkKHNyY2RpcikvcHJpbnRmLmMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3ByaW50Zi5jCi12ZXJzaW9uLmxvOiAkKHNyY2RpcikvdmVyc2lvbi5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS92ZXJzaW9uLmMKLW9zZGVwLmxvOiAkKHNyY2Rpcikvb3NkZXAuYwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2Rpcikvb3NkZXAuYwotaW50bC1jb21wYXQubG86ICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCi0KLSMgVGhpcyBydWxlIGlzIGV4ZWN1dGVkIG9ubHkgb24gV29lMzIgc3lzdGVtcy4KLSMgVGhlIGZvbGxvd2luZyBzZWQgZXhwcmVzc2lvbnMgY29tZSBmcm9tIHRoZSB3aW5kcmVzLW9wdGlvbnMgc2NyaXB0LiBUaGV5IGFyZQotIyBpbmxpbmVkIGhlcmUsIHNvIHRoYXQgdGhleSBjYW4gYmUgd3JpdHRlbiBpbiBhIE1ha2VmaWxlIHdpdGhvdXQgcmVxdWlyaW5nIGEKLSMgdGVtcG9yYXJ5IGZpbGUuIFRoZXkgbXVzdCBjb250YWluIGxpdGVyYWwgbmV3bGluZXMgcmF0aGVyIHRoYW4gc2VtaWNvbG9ucywKLSMgc28gdGhhdCB0aGV5IHdvcmsgd2l0aCB0aGUgc2VkLTMuMDIgdGhhdCBpcyBzaGlwcGVkIHdpdGggTVNZUy4gV2UgY2FuIHVzZQotIyBHTlUgYmFzaCdzICQnXG4nIHN5bnRheCB0byBvYnRhaW4gc3VjaCBhIG5ld2xpbmUuCi1saWJpbnRsLnJlczogJChzcmNkaXIpL2xpYmludGwucmMKLQlubD0kJCdcbic7IFwKLQlzZWRfZXh0cmFjdF9tYWpvcj0nL15bMC05XS97JyQke25sfSdzL15cKFswLTldKlwpLiovXDEvcCckJHtubH1xJCR7bmx9J30nJCR7bmx9J2NcJyQke25sfTAkJHtubH1xOyBcCi0Jc2VkX2V4dHJhY3RfbWlub3I9Jy9eWzAtOV1bMC05XSpbLl1bMC05XS97JyQke25sfSdzL15bMC05XSpbLl1cKFswLTldKlwpLiovXDEvcCckJHtubH1xJCR7bmx9J30nJCR7bmx9J2NcJyQke25sfTAkJHtubH1xOyBcCi0Jc2VkX2V4dHJhY3Rfc3VibWlub3I9Jy9eWzAtOV1bMC05XSpbLl1bMC05XVswLTldKlsuXVswLTldL3snJCR7bmx9J3MvXlswLTldKlsuXVswLTldKlsuXVwoWzAtOV0qXCkuKi9cMS9wJyQke25sfXEkJHtubH0nfSckJHtubH0nY1wnJCR7bmx9MCQke25sfXE7IFwKLQkkKFdJTkRSRVMpIFwKLQkgICItRFBBQ0tBR0VfVkVSU0lPTl9TVFJJTkc9XFxcIiQoVkVSU0lPTilcXFwiIiBcCi0JICAiLURQQUNLQUdFX1ZFUlNJT05fTUFKT1I9ImBlY2hvICckKFZFUlNJT04pJyB8IHNlZCAtbiAtZSAiJCRzZWRfZXh0cmFjdF9tYWpvciJgIFwKLQkgICItRFBBQ0tBR0VfVkVSU0lPTl9NSU5PUj0iYGVjaG8gJyQoVkVSU0lPTiknIHwgc2VkIC1uIC1lICIkJHNlZF9leHRyYWN0X21pbm9yImAgXAotCSAgIi1EUEFDS0FHRV9WRVJTSU9OX1NVQk1JTk9SPSJgZWNobyAnJChWRVJTSU9OKScgfCBzZWQgLW4gLWUgIiQkc2VkX2V4dHJhY3Rfc3VibWlub3IiYCBcCi0JICAtaSAkKHNyY2RpcikvbGliaW50bC5yYyAtbyBsaWJpbnRsLnJlcyAtLW91dHB1dC1mb3JtYXQ9Y29mZgotCi1yZWYtYWRkLnNlZDogJChzcmNkaXIpL3JlZi1hZGQuc2luCi0Jc2VkIC1lICcvXiMvZCcgLWUgJ3MvQCcnUEFDS0FHRScnQC9AUEFDS0FHRUAvZycgJChzcmNkaXIpL3JlZi1hZGQuc2luID4gdC1yZWYtYWRkLnNlZAotCW12IHQtcmVmLWFkZC5zZWQgcmVmLWFkZC5zZWQKLXJlZi1kZWwuc2VkOiAkKHNyY2RpcikvcmVmLWRlbC5zaW4KLQlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWRlbC5zaW4gPiB0LXJlZi1kZWwuc2VkCi0JbXYgdC1yZWYtZGVsLnNlZCByZWYtZGVsLnNlZAotCi1JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uCi0KLWxpYmdudWludGwuaDogJChzcmNkaXIpL2xpYmdudWludGwuaC5pbgotCXNlZCAtZSAnL0lOX0xJQkdMT0NBTEUvZCcgXAotCSAgICAtZSAncyxAJydIQVZFX1BPU0lYX1BSSU5URicnQCxASEFWRV9QT1NJWF9QUklOVEZALGcnIFwKLQkgICAgLWUgJ3MsQCcnSEFWRV9BU1BSSU5URicnQCxASEFWRV9BU1BSSU5URkAsZycgXAotCSAgICAtZSAncyxAJydIQVZFX1NOUFJJTlRGJydALEBIQVZFX1NOUFJJTlRGQCxnJyBcCi0JICAgIC1lICdzLEAnJ0hBVkVfV1BSSU5URicnQCxASEFWRV9XUFJJTlRGQCxnJyBcCi0JICA8ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4gXAotCXwgaWYgdGVzdCAnQFdPRTMyRExMQCcgPSB5ZXM7IHRoZW4gXAotCSAgICBzZWQgLWUgJ3MvZXh0ZXJuIFwoW14oKV0qXCk7L2V4dGVybiBfX2RlY2xzcGVjIChkbGxpbXBvcnQpIFwxOy8nOyBcCi0JICBlbHNlIFwKLQkgICAgY2F0OyBcCi0JICBmaSBcCi0JfCBzZWQgLWUgJ3MvZXh0ZXJuIFwoW14iXVwpL2V4dGVybiBMSUJJTlRMX0RMTF9FWFBPUlRFRCBcMS8nIFwKLQkgICAgICAtZSAiLyNkZWZpbmUgX0xJQklOVExfSC9yICQoc3JjZGlyKS9leHBvcnQuaCIgXAotCXwgc2VkIC1lICdzLEAnJ0hBVkVfVklTSUJJTElUWScnQCxASEFWRV9WSVNJQklMSVRZQCxnJyBcCi0JICA+IGxpYmdudWludGwuaAotCi1saWJpbnRsLmg6ICQoc3JjZGlyKS9saWJnbnVpbnRsLmguaW4KLQlzZWQgLWUgJy9JTl9MSUJHTE9DQUxFL2QnIFwKLQkgICAgLWUgJ3MsQCcnSEFWRV9QT1NJWF9QUklOVEYnJ0AsQEhBVkVfUE9TSVhfUFJJTlRGQCxnJyBcCi0JICAgIC1lICdzLEAnJ0hBVkVfQVNQUklOVEYnJ0AsQEhBVkVfQVNQUklOVEZALGcnIFwKLQkgICAgLWUgJ3MsQCcnSEFWRV9TTlBSSU5URicnQCxASEFWRV9TTlBSSU5URkAsZycgXAotCSAgICAtZSAncyxAJydIQVZFX1dQUklOVEYnJ0AsQEhBVkVfV1BSSU5URkAsZycgXAotCSAgPCAkKHNyY2RpcikvbGliZ251aW50bC5oLmluID4gbGliaW50bC5oCi0KLWNoYXJzZXQuYWxpYXM6ICQoc3JjZGlyKS9jb25maWcuY2hhcnNldAotCSQoU0hFTEwpICQoc3JjZGlyKS9jb25maWcuY2hhcnNldCAnQGhvc3RAJyA+IHQtJEAKLQltdiB0LSRAICRACi0KLWNoZWNrOiBhbGwKLQotIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0jIHN5c3RlbSB3aGljaCBoYXMgdGhlIEdOVSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCi0jIHNlcGFyYXRlIGxpYnJhcnkuCi0jIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQotIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6IGFsbAotCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCi0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYmludGwuaDsgXAotCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwuJGxhOyBcCi0JICBpZiB0ZXN0ICJAUkVMT0NBVEFCTEVAIiA9IHllczsgdGhlbiBcCi0JICAgIGRlcGVuZGVuY2llcz1gc2VkIC1uIC1lICdzLF5kZXBlbmRlbmN5X2xpYnM9XCguKlwpLFwxLHAnIDwgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhIHwgc2VkIC1lICJzLF4nLCwiIC1lICJzLCdcJCQsLCJgOyBcCi0JICAgIGlmIHRlc3QgLW4gIiQkZGVwZW5kZW5jaWVzIjsgdGhlbiBcCi0JICAgICAgcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLmxhOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiIFwKLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IG5vIFwKLQkgICAmJiB0ZXN0IEBHTElCQzJAICE9IG5vOyB0aGVuIFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQobGliZGlyKTsgXAotCSAgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSBsaWJnbnVpbnRsLiRsYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuc28gJChERVNURElSKSQobGliZGlyKS9wcmVsb2FkYWJsZV9saWJpbnRsLnNvOyBcCi0JICAkKExJQlRPT0wpIC0tbW9kZT11bmluc3RhbGwgXAotCSAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmdudWludGwuJGxhOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAotCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2Rpcl9wKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCi0JICB0ZW1wPSQoREVTVERJUikkKGxpYmRpcikvdC1jaGFyc2V0LmFsaWFzOyBcCi0JICBkZXN0PSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAotCSAgaWYgdGVzdCAtZiAkKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IHRoZW4gXAotCSAgICBvcmlnPSQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgXAotCSAgICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCi0JICAgIHJtIC1mICQkdGVtcDsgXAotCSAgZWxzZSBcCi0JICAgIGlmIHRlc3QgQEdMSUJDMjFAID0gbm87IHRoZW4gXAotCSAgICAgIG9yaWc9Y2hhcnNldC5hbGlhczsgXAotCSAgICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotCSAgICAgIHJtIC1mICQkdGVtcDsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAotCSAgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCi0JICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAotCSAgICB8fCBvcmlnPSQoc3JjZGlyKS9sb2NhbGUuYWxpYXM7IFwKLQkgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAotCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAotCSAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAotCSAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKLQkgIHJtIC1mICQkdGVtcDsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCi0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCi0JICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCi0JICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCi0JICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCi0JCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKLQkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCi0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi1pbnN0YWxsLXN0cmlwOiBpbnN0YWxsCi0KLWluc3RhbGwtZHZpIGluc3RhbGwtaHRtbCBpbnN0YWxsLWluZm8gaW5zdGFsbC1wcyBpbnN0YWxsLXBkZjoKLQotaW5zdGFsbGRpcnM6Ci0JaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubyBcCi0JICAgJiYgdGVzdCBAR0xJQkMyQCAhPSBubzsgdGhlbiBcCi0JICAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcik7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0JICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKGxpYmRpcik7IFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgICQobWtkaXJfcCkgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgotaW5zdGFsbGNoZWNrOgotCi11bmluc3RhbGw6Ci0JaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKLQkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0JICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLQkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCi0JICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCi0JICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubyBcCi0JICAgJiYgdGVzdCBAR0xJQkMyQCAhPSBubzsgdGhlbiBcCi0JICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCi0JICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCi0JICAgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKLQkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKLQkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAotCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAotCSAgICAgIHJtIC1mICQkZGVzdDsgXAotCSAgICBlbHNlIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotCSAgICBmaTsgXAotCSAgICBybSAtZiAkJHRlbXA7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKLQkgICAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCi0JICAgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKLQkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAotCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAotCSAgICAgIHJtIC1mICQkZGVzdDsgXAotCSAgICBlbHNlIFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAotCSAgICBmaTsgXAotCSAgICBybSAtZiAkJHRlbXA7IFwKLQkgIGZpOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKLQkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLWluZm8gZHZpIHBzIHBkZiBodG1sOgotCi0kKE9CSkVDVFMpOiAuLi9jb25maWcuaCBsaWJnbnVpbnRsLmgKLWJpbmR0ZXh0ZG9tLiRsbyBkY2dldHRleHQuJGxvIGRjaWdldHRleHQuJGxvIGRjbmdldHRleHQuJGxvIGRnZXR0ZXh0LiRsbyBkbmdldHRleHQuJGxvIGZpbmRkb21haW4uJGxvIGdldHRleHQuJGxvIGludGwtY29tcGF0LiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gbmdldHRleHQuJGxvIHRleHRkb21haW4uJGxvOiAkKHNyY2RpcikvZ2V0dGV4dFAuaCAkKHNyY2RpcikvZ21vLmggJChzcmNkaXIpL2xvYWRpbmZvLmgKLWhhc2gtc3RyaW5nLiRsbyBkY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbzogJChzcmNkaXIpL2hhc2gtc3RyaW5nLmgKLWV4cGxvZGVuYW1lLiRsbyBsMTBuZmxpc3QuJGxvOiAkKHNyY2RpcikvbG9hZGluZm8uaAotZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG8gcGx1cmFsLiRsbyBwbHVyYWwtZXhwLiRsbzogJChzcmNkaXIpL3BsdXJhbC1leHAuaAotZGNpZ2V0dGV4dC4kbG86ICQoc3JjZGlyKS9ldmFsLXBsdXJhbC5oCi1sb2NhbGNoYXJzZXQuJGxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmgKLWJpbmR0ZXh0ZG9tLiRsbyBkY2lnZXR0ZXh0LiRsbyBmaW5kZG9tYWluLiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gbG9jay4kbG8gbG9nLiRsbzogJChzcmNkaXIpL2xvY2suaAotbG9jYWxlYWxpYXMuJGxvIGxvY2FsY2hhcnNldC4kbG8gcmVsb2NhdGFibGUuJGxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuaAotcHJpbnRmLiRsbzogJChzcmNkaXIpL3ByaW50Zi1hcmdzLmggJChzcmNkaXIpL3ByaW50Zi1hcmdzLmMgJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS93cHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3hzaXplLmggJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5jICQoc3JjZGlyKS92YXNucHJpbnRmLmggJChzcmNkaXIpL3Zhc253cHJpbnRmLmggJChzcmNkaXIpL3Zhc25wcmludGYuYwotCi0jIEEgYmlzb24tMi4xIGdlbmVyYXRlZCBwbHVyYWwuYyBpbmNsdWRlcyA8bGliaW50bC5oPiBpZiBFTkFCTEVfTkxTLgotUExVUkFMX0RFUFNfeWVzID0gbGliaW50bC5oCi1QTFVSQUxfREVQU19ubyA9Ci1wbHVyYWwuJGxvOiAkKFBMVVJBTF9ERVBTX0BVU0VfSU5DTFVERURfTElCSU5UTEApCi0KLXRhZ3M6IFRBR1MKLQotVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGV0YWdzIC1vICQkaGVyZS9UQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQotCi1jdGFnczogQ1RBR1MKLQotQ1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBjdGFncyAtbyAkJGhlcmUvQ1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLWlkOiBJRAotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIG1raWQgLWYkJGhlcmUvSUQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgKi5hICoubGEgKi5vICoub2JqICoubG8gbGliaW50bC5yZXMgY29yZSBjb3JlLioKLQlybSAtZiBsaWJnbnVpbnRsLmggbGliaW50bC5oIGNoYXJzZXQuYWxpYXMgcmVmLWFkZC5zZWQgcmVmLWRlbC5zZWQKLQlybSAtZiAtciAubGlicyBfbGlicwotCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQotZGlzdGNsZWFuOiBjbGVhbgotCXJtIC1mIE1ha2VmaWxlIElEIFRBR1MKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKLQkgIHJtIC1mIENoYW5nZUxvZy5pbnN0ICQoRElTVEZJTEVTLm5vcm1hbCk7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLQotIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKLSMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IE1ha2VmaWxlCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAotCSAgOiA7IFwKLQllbHNlIFwKLQkgIGlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSI7IHRoZW4gXAotCSAgICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKLQkgIGVsc2UgXAotCSAgICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5ub3JtYWwpIjsgXAotCSAgZmk7IFwKLQkgICQoTUFLRSkgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgXAotCSAgZm9yIGZpbGUgaW4gQ2hhbmdlTG9nICQoRElTVEZJTEVTLmNvbW1vbikgJChESVNURklMRVMuZ2VuZXJhdGVkKSAkJGFkZGl0aW9uYWw7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZGlyPS47IGVsc2UgZGlyPSQoc3JjZGlyKTsgZmk7IFwKLQkgICAgY3AgLXAgJCRkaXIvJCRmaWxlICQoZGlzdGRpcikgfHwgdGVzdCAkJGZpbGUgPSBNYWtlZmlsZS5pbiB8fCBleGl0IDE7IFwKLQkgIGRvbmU7IFwKLQlmaQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotIyBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgZG9lc24ndCB3b3JrIGFueSBtb3JlIHdpdGggYXV0b2NvbmYtMi41NywKLSMgd2hlbiBBQ19DT05GSUdfRklMRVMoW2ludGwvTWFrZWZpbGU6c29tZWRpci9NYWtlZmlsZS5pbl0pIGlzIHVzZWQuCi0jCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2ludGwvVkVSU0lPTiBiL2ludGwvVkVSU0lPTgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5ZDRlOS4uMDAwMDAwMAotLS0gYS9pbnRsL1ZFUlNJT04KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HTlUgZ2V0dGV4dCBsaWJyYXJ5IGZyb20gZ2V0dGV4dC0wLjE3CmRpZmYgLS1naXQgYS9pbnRsL2JpbmR0ZXh0ZG9tLmMgYi9pbnRsL2JpbmR0ZXh0ZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVkNGYuLjAwMDAwMDAKLS0tIGEvaW50bC9iaW5kdGV4dGRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lCi0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrIF9fbGliY19yd2xvY2tfdW5sb2NrCi0jZWxzZQotIyBpbmNsdWRlICJsb2NrLmgiCi0jZW5kaWYKLQotLyogU29tZSBjb21waWxlcnMsIGxpa2UgU3VuT1M0IGNjLCBkb24ndCBoYXZlIG9mZnNldG9mIGluIDxzdGRkZWYuaD4uICAqLwotI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YodHlwZSxpZGVudCkgKChzaXplX3QpJigoKHR5cGUqKTApLT5pZGVudCkpCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KLWdsX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KLSMgZGVmaW5lIEJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKLSMgaWZuZGVmIHN0cmR1cAotIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgQklORFRFWFRET01BSU4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgotIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAotI2VuZGlmCi0KLS8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCi0gICB0byBiZSB1c2VkIGZvciB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cuCi0gICBJZiAqRElSTkFNRVAgb3IgKkNPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBub3QKLSAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgotICAgSWYgRElSTkFNRVAgb3IgQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5laXRoZXIKLSAgIG1vZGlmaWVkIG5vciByZXR1cm5lZC4gICovCi1zdGF0aWMgdm9pZAotc2V0X2JpbmRpbmdfdmFsdWVzIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotCQkgICAgY29uc3QgY2hhciAqKmRpcm5hbWVwLCBjb25zdCBjaGFyICoqY29kZXNldHApCi17Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotICBpbnQgbW9kaWZpZWQ7Ci0KLSAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgewotICAgICAgaWYgKGRpcm5hbWVwKQotCSpkaXJuYW1lcCA9IE5VTEw7Ci0gICAgICBpZiAoY29kZXNldHApCi0JKmNvZGVzZXRwID0gTlVMTDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZ2xfcndsb2NrX3dybG9jayAoX25sX3N0YXRlX2xvY2spOwotCi0gIG1vZGlmaWVkID0gMDsKLQotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZGlybmFtZXApCi0JewotCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKLQotCSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKLQkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotCSAgICAqZGlybmFtZXAgPSBiaW5kaW5nLT5kaXJuYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotCQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotCQkgb2xkIGJpbmRpbmcuICAqLwotCSAgICAgIGNoYXIgKnJlc3VsdCA9IGJpbmRpbmctPmRpcm5hbWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgcmVzdWx0KSAhPSAwKQotCQl7Ci0JCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQkJICAgIHJlc3VsdCA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0JCSAgZWxzZQotCQkgICAgewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCQkgICAgICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOwotI2Vsc2UKLQkJICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCQkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCi0JCQltZW1jcHkgKHJlc3VsdCwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCQkgICAgfQotCi0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGJpbmRpbmctPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKLQkJCWZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotCi0JCSAgICAgIGJpbmRpbmctPmRpcm5hbWUgPSByZXN1bHQ7Ci0JCSAgICAgIG1vZGlmaWVkID0gMTsKLQkJICAgIH0KLQkJfQotCSAgICAgICpkaXJuYW1lcCA9IHJlc3VsdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGNvZGVzZXRwKQotCXsKLQkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7Ci0KLQkgIGlmIChjb2Rlc2V0ID09IE5VTEwpCi0JICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KLQkgICAgKmNvZGVzZXRwID0gYmluZGluZy0+Y29kZXNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLQkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKLQkJIG9sZCBiaW5kaW5nLiAgKi8KLQkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5jb2Rlc2V0OwotCSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBzdHJjbXAgKGNvZGVzZXQsIHJlc3VsdCkgIT0gMCkKLQkJewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCQkgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7Ci0jZWxzZQotCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKLQkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKLQkJICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOwotI2VuZGlmCi0KLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQotCQkgICAgewotCQkgICAgICBpZiAoYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQotCQkJZnJlZSAoYmluZGluZy0+Y29kZXNldCk7Ci0KLQkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKLQkJICAgICAgbW9kaWZpZWQgPSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgKmNvZGVzZXRwID0gcmVzdWx0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKGRpcm5hbWVwID09IE5VTEwgfHwgKmRpcm5hbWVwID09IE5VTEwpCi0JICAgJiYgKGNvZGVzZXRwID09IE5VTEwgfHwgKmNvZGVzZXRwID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIFNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChkaXJuYW1lcCkKLQkqZGlybmFtZXAgPSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotICAgICAgaWYgKGNvZGVzZXRwKQotCSpjb2Rlc2V0cCA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQotCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOwotCi0gICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2JpbmRpbmcgPT0gTlVMTCwgMCkpCi0JZ290byBmYWlsZWQ7Ci0KLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0KLSAgICAgIGlmIChkaXJuYW1lcCkKLQl7Ci0JICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOwotCi0JICBpZiAoZGlybmFtZSA9PSBOVUxMKQotCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCi0JICAgIGRpcm5hbWUgPSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQkJZGlybmFtZSA9IF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzdWx0OwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCQkgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0jZWxzZQotCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKLQkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7Ci0JCSAgbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQkJICBkaXJuYW1lID0gcmVzdWx0OwotCQl9Ci0JICAgIH0KLQkgICpkaXJuYW1lcCA9IGRpcm5hbWU7Ci0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7Ci0JfQotICAgICAgZWxzZQotCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0KLSAgICAgIGlmIChjb2Rlc2V0cCkKLQl7Ci0JICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOwotCi0JICBpZiAoY29kZXNldCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcmVzdWx0OwotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKLQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQotCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OwotI2Vsc2UKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7Ci0JICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCi0JCWdvdG8gZmFpbGVkX2NvZGVzZXQ7Ci0JICAgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7Ci0jZW5kaWYKLQkgICAgICBjb2Rlc2V0ID0gcmVzdWx0OwotCSAgICB9Ci0JICAqY29kZXNldHAgPSBjb2Rlc2V0OwotCSAgbmV3X2JpbmRpbmctPmNvZGVzZXQgPSAoY2hhciAqKSBjb2Rlc2V0OwotCX0KLSAgICAgIGVsc2UKLQluZXdfYmluZGluZy0+Y29kZXNldCA9IE5VTEw7Ci0KLSAgICAgIC8qIE5vdyBlbnF1ZXVlIGl0LiAgKi8KLSAgICAgIGlmIChfbmxfZG9tYWluX2JpbmRpbmdzID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoZG9tYWlubmFtZSwgX25sX2RvbWFpbl9iaW5kaW5ncy0+ZG9tYWlubmFtZSkgPCAwKQotCXsKLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLQkgIF9ubF9kb21haW5fYmluZGluZ3MgPSBuZXdfYmluZGluZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICB3aGlsZSAoYmluZGluZy0+bmV4dCAhPSBOVUxMCi0JCSAmJiBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPm5leHQtPmRvbWFpbm5hbWUpID4gMCkKLQkgICAgYmluZGluZyA9IGJpbmRpbmctPm5leHQ7Ci0KLQkgIG5ld19iaW5kaW5nLT5uZXh0ID0gYmluZGluZy0+bmV4dDsKLQkgIGJpbmRpbmctPm5leHQgPSBuZXdfYmluZGluZzsKLQl9Ci0KLSAgICAgIG1vZGlmaWVkID0gMTsKLQotICAgICAgLyogSGVyZSB3ZSBkZWFsIHdpdGggbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMuICAqLwotICAgICAgaWYgKDApCi0JewotCWZhaWxlZF9jb2Rlc2V0OgotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0JICAgIGZyZWUgKG5ld19iaW5kaW5nLT5kaXJuYW1lKTsKLQlmYWlsZWRfZGlybmFtZToKLQkgIGZyZWUgKG5ld19iaW5kaW5nKTsKLQlmYWlsZWQ6Ci0JICBpZiAoZGlybmFtZXApCi0JICAgICpkaXJuYW1lcCA9IE5VTEw7Ci0JICBpZiAoY29kZXNldHApCi0JICAgICpjb2Rlc2V0cCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBtb2RpZmllZCBhbnkgYmluZGluZywgd2UgZmx1c2ggdGhlIGNhY2hlcy4gICovCi0gIGlmIChtb2RpZmllZCkKLSAgICArK19ubF9tc2dfY2F0X2NudHI7Ci0KLSAgZ2xfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOwotfQotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWNoYXIgKgotQklORFRFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUpCi17Ci0gIHNldF9iaW5kaW5nX3ZhbHVlcyAoZG9tYWlubmFtZSwgJmRpcm5hbWUsIE5VTEwpOwotICByZXR1cm4gKGNoYXIgKikgZGlybmFtZTsKLX0KLQotLyogU3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHdoaWNoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZQotICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCi1jaGFyICoKLUJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpjb2Rlc2V0KQotewotICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsIE5VTEwsICZjb2Rlc2V0KTsKLSAgcmV0dXJuIChjaGFyICopIGNvZGVzZXQ7Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXNlcyBmb3IgZnVuY3Rpb24gbmFtZXMgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2JpbmR0ZXh0ZG9tYWluLCBiaW5kdGV4dGRvbWFpbik7Ci13ZWFrX2FsaWFzIChfX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0LCBiaW5kX3RleHRkb21haW5fY29kZXNldCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvY29uZmlnLmNoYXJzZXQgYi9pbnRsL2NvbmZpZy5jaGFyc2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGMyNThiLi4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlnLmNoYXJzZXQKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLgotIwotIyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotIyAgIFVTQS4KLSMKLSMgVGhlIHRhYmxlIGNvbnNpc3RzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCi0jICAgIEFMSUFTICBDQU5PTklDQUwKLSMKLSMgQUxJQVMgaXMgdGhlIChzeXN0ZW0gZGVwZW5kZW50KSByZXN1bHQgb2YgIm5sX2xhbmdpbmZvIChDT0RFU0VUKSIuCi0jIEFMSUFTIGlzIGNvbXBhcmVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5LgotIwotIyBDQU5PTklDQUwgaXMgdGhlIEdOVSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0jIEl0IG11c3QgYmUgYW4gZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IGxpYmljb252LiBTdXBwb3J0IGJ5IEdOVSBsaWJjIGlzCi0jIGFsc28gZGVzaXJhYmxlLiBDQU5PTklDQUwgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXN1YWxseSBhbiB1cHBlciBjYXNlCi0jIE1JTUUgY2hhcnNldCBuYW1lIGlzIHByZWZlcnJlZC4KLSMgVGhlIGN1cnJlbnQgbGlzdCBvZiBHTlUgY2Fub25pY2FsIGNoYXJzZXQgbmFtZXMgaXMgYXMgZm9sbG93cy4KLSMKLSMgICAgICAgbmFtZSAgICAgICAgICAgICAgTUlNRT8gICAgICAgICAgICAgdXNlZCBieSB3aGljaCBzeXN0ZW1zCi0jICAgQVNDSUksIEFOU0lfWDMuNC0xOTY4ICAgICAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktMSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktMiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktMyAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMKLSMgICBJU08tODg1OS00ICAgICAgICAgICAgICBZICAgb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktNSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktNiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IHNvbGFyaXMKLSMgICBJU08tODg1OS03ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBuZXRic2QgZGFyd2luCi0jICAgSVNPLTg4NTktOCAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCi0jICAgSVNPLTg4NTktOSAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZGFyd2luCi0jICAgSVNPLTg4NTktMTMgICAgICAgICAgICAgICAgIGdsaWJjIG5ldGJzZCBkYXJ3aW4KLSMgICBJU08tODg1OS0xNCAgICAgICAgICAgICAgICAgZ2xpYmMKLSMgICBJU08tODg1OS0xNSAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCi0jICAgS09JOC1SICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgS09JOC1VICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGZyZWVic2QgbmV0YnNkIGRhcndpbgotIyAgIEtPSTgtVCAgICAgICAgICAgICAgICAgICAgICBnbGliYwotIyAgIENQNDM3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDc3NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NTAgICAgICAgICAgICAgICAgICAgICAgIGFpeCBvc2YgZG9zCi0jICAgQ1A4NTIgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODU1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg1NiAgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0jICAgQ1A4NTcgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODYxICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg2MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCi0jICAgQ1A4NjQgICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQODY1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg2NiAgICAgICAgICAgICAgICAgICAgICAgZnJlZWJzZCBuZXRic2QgZGFyd2luIGRvcwotIyAgIENQODY5ICAgICAgICAgICAgICAgICAgICAgICBkb3MKLSMgICBDUDg3NCAgICAgICAgICAgICAgICAgICAgICAgd29lMzIgZG9zCi0jICAgQ1A5MjIgICAgICAgICAgICAgICAgICAgICAgIGFpeAotIyAgIENQOTMyICAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIgZG9zCi0jICAgQ1A5NDMgICAgICAgICAgICAgICAgICAgICAgIGFpeAotIyAgIENQOTQ5ICAgICAgICAgICAgICAgICAgICAgICBvc2Ygd29lMzIgZG9zCi0jICAgQ1A5NTAgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcwotIyAgIENQMTA0NiAgICAgICAgICAgICAgICAgICAgICBhaXgKLSMgICBDUDExMjQgICAgICAgICAgICAgICAgICAgICAgYWl4Ci0jICAgQ1AxMTI1ICAgICAgICAgICAgICAgICAgICAgIGRvcwotIyAgIENQMTEyOSAgICAgICAgICAgICAgICAgICAgICBhaXgKLSMgICBDUDEyNTAgICAgICAgICAgICAgICAgICAgICAgd29lMzIKLSMgICBDUDEyNTEgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBuZXRic2QgZGFyd2luIHdvZTMyCi0jICAgQ1AxMjUyICAgICAgICAgICAgICAgICAgICAgIGFpeCB3b2UzMgotIyAgIENQMTI1MyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NSAgICAgICAgICAgICAgICAgICAgICBnbGliYyB3b2UzMgotIyAgIENQMTI1NiAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIENQMTI1NyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgotIyAgIEdCMjMxMiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgRVVDLUpQICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgRVVDLUtSICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBuZXRic2QgZGFyd2luCi0jICAgRVVDLVRXICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgbmV0YnNkCi0jICAgQklHNSAgICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgbmV0YnNkIGRhcndpbgotIyAgIEJJRzUtSEtTQ1MgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCi0jICAgR0JLICAgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBvc2Ygc29sYXJpcyB3b2UzMiBkb3MKLSMgICBHQjE4MDMwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBuZXRic2QKLSMgICBTSElGVF9KSVMgICAgICAgICAgICAgICBZICAgaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIG5ldGJzZCBkYXJ3aW4KLSMgICBKT0hBQiAgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyB3b2UzMgotIyAgIFRJUy02MjAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcwotIyAgIFZJU0NJSSAgICAgICAgICAgICAgICAgIFkgICBnbGliYwotIyAgIFRDVk41NzEyLTEgICAgICAgICAgICAgICAgICBnbGliYwotIyAgIEdFT1JHSUFOLVBTICAgICAgICAgICAgICAgICBnbGliYwotIyAgIEhQLVJPTUFOOCAgICAgICAgICAgICAgICAgICBocHV4Ci0jICAgSFAtQVJBQklDOCAgICAgICAgICAgICAgICAgIGhwdXgKLSMgICBIUC1HUkVFSzggICAgICAgICAgICAgICAgICAgaHB1eAotIyAgIEhQLUhFQlJFVzggICAgICAgICAgICAgICAgICBocHV4Ci0jICAgSFAtVFVSS0lTSDggICAgICAgICAgICAgICAgIGhwdXgKLSMgICBIUC1LQU5BOCAgICAgICAgICAgICAgICAgICAgaHB1eAotIyAgIERFQy1LQU5KSSAgICAgICAgICAgICAgICAgICBvc2YKLSMgICBERUMtSEFOWVUgICAgICAgICAgICAgICAgICAgb3NmCi0jICAgVVRGLTggICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzIG5ldGJzZCBkYXJ3aW4KLSMKLSMgTm90ZTogTmFtZXMgd2hpY2ggYXJlIG5vdCBtYXJrZWQgYXMgYmVpbmcgYSBNSU1FIG5hbWUgc2hvdWxkIG5vdCBiZSB1c2VkIGluCi0jIEludGVybmV0IHByb3RvY29scyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2UgKG1haWwsIG5ld3MsIGV0Yy4pLgotIwotIyBOb3RlOiBBU0NJSSBhbmQgQU5TSV9YMy40LTE5NjggYXJlIHN5bm9ueW1vdXMgY2Fub25pY2FsIG5hbWVzLiBBcHBsaWNhdGlvbnMKLSMgbXVzdCB1bmRlcnN0YW5kIGJvdGggbmFtZXMgYW5kIHRyZWF0IHRoZW0gYXMgZXF1aXZhbGVudC4KLSMKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCi0jICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCi0jIG9yCi0jICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQotCi1ob3N0PSIkMSIKLW9zPWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvXlteLV0qLVteLV0qLVwoLipcKSQvXDEvJ2AKLWVjaG8gIiMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFsaWFzZXMsIgotZWNobyAiIyBzdWl0YWJsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSAnJHtvc30nLiIKLWVjaG8gIiMgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gY29uZmlnLmNoYXJzZXQuIgotIyBMaXN0IG9mIHJlZmVyZW5jZXMsIHVwZGF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbjoKLWVjaG8gIiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAiCi1jYXNlICIkb3MiIGluCi0gICAgbGludXgtZ251bGliYzEqKQotCSMgTGludXggbGliYzUgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQllY2hvICJDIEFTQ0lJIgotCWVjaG8gIlBPU0lYIEFTQ0lJIgotCWZvciBsIGluIGFmIGFmX1pBIGNhIGNhX0VTIGRhIGRhX0RLIGRlIGRlX0FUIGRlX0JFIGRlX0NIIGRlX0RFIGRlX0xVIFwKLQkgICAgICAgICBlbiBlbl9BVSBlbl9CVyBlbl9DQSBlbl9ESyBlbl9HQiBlbl9JRSBlbl9OWiBlbl9VUyBlbl9aQSBcCi0JICAgICAgICAgZW5fWlcgZXMgZXNfQVIgZXNfQk8gZXNfQ0wgZXNfQ08gZXNfRE8gZXNfRUMgZXNfRVMgZXNfR1QgXAotCSAgICAgICAgIGVzX0hOIGVzX01YIGVzX1BBIGVzX1BFIGVzX1BZIGVzX1NWIGVzX1VTIGVzX1VZIGVzX1ZFIGV0IFwKLQkgICAgICAgICBldF9FRSBldSBldV9FUyBmaSBmaV9GSSBmbyBmb19GTyBmciBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBcCi0JICAgICAgICAgZnJfTFUgZ2EgZ2FfSUUgZ2wgZ2xfRVMgaWQgaWRfSUQgaW4gaW5fSUQgaXMgaXNfSVMgaXQgaXRfQ0ggXAotCSAgICAgICAgIGl0X0lUIGtsIGtsX0dMIG5sIG5sX0JFIG5sX05MIG5vIG5vX05PIHB0IHB0X0JSIHB0X1BUIHN2IFwKLQkgICAgICAgICBzdl9GSSBzdl9TRTsgZG8KLQkgIGVjaG8gIiRsIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5pc28tODg1OS0xIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5pc28tODg1OS0xNSBJU08tODg1OS0xNSIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTE1QGV1cm8gSVNPLTg4NTktMTUiCi0JICBlY2hvICIkbEBldXJvIElTTy04ODU5LTE1IgotCSAgZWNobyAiJGwuY3AtNDM3IENQNDM3IgotCSAgZWNobyAiJGwuY3AtODUwIENQODUwIgotCSAgZWNobyAiJGwuY3AtMTI1MiBDUDEyNTIiCi0JICBlY2hvICIkbC5jcC0xMjUyQGV1cm8gQ1AxMjUyIgotCSAgI2VjaG8gIiRsLmF0YXJpLXN0IEFUQVJJLVNUIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gY3MgY3NfQ1ogaHIgaHJfSFIgaHUgaHVfSFUgcGwgcGxfUEwgcm8gcm9fUk8gc2sgc2tfU0sgc2wgXAotCSAgICAgICAgIHNsX1NJIHNyIHNyX0NTIHNyX1lVOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktMiIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTIgSVNPLTg4NTktMiIKLQkgIGVjaG8gIiRsLmNwLTg1MiBDUDg1MiIKLQkgIGVjaG8gIiRsLmNwLTEyNTAgQ1AxMjUwIgotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCWZvciBsIGluIG1rIG1rX01LIHJ1IHJ1X1JVOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktNSIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTUgSVNPLTg4NTktNSIKLQkgIGVjaG8gIiRsLmtvaTgtciBLT0k4LVIiCi0JICBlY2hvICIkbC5jcC04NjYgQ1A4NjYiCi0JICBlY2hvICIkbC5jcC0xMjUxIENQMTI1MSIKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCWRvbmUKLQlmb3IgbCBpbiBhciBhcl9TQTsgZG8KLQkgIGVjaG8gIiRsIElTTy04ODU5LTYiCi0JICBlY2hvICIkbC5pc28tODg1OS02IElTTy04ODU5LTYiCi0JICBlY2hvICIkbC5jcC04NjQgQ1A4NjQiCi0JICAjZWNobyAiJGwuY3AtODY4IENQODY4IiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKLQkgIGVjaG8gIiRsLmNwLTEyNTYgQ1AxMjU2IgotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCWZvciBsIGluIGVsIGVsX0dSIGdyIGdyX0dSOyBkbwotCSAgZWNobyAiJGwgSVNPLTg4NTktNyIKLQkgIGVjaG8gIiRsLmlzby04ODU5LTcgSVNPLTg4NTktNyIKLQkgIGVjaG8gIiRsLmNwLTg2OSBDUDg2OSIKLQkgIGVjaG8gIiRsLmNwLTEyNTMgQ1AxMjUzIgotCSAgZWNobyAiJGwuY3AtMTI1M0BldXJvIENQMTI1MyIKLQkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgotCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gaGUgaGVfSUwgaXcgaXdfSUw7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS04IgotCSAgZWNobyAiJGwuaXNvLTg4NTktOCBJU08tODg1OS04IgotCSAgZWNobyAiJGwuY3AtODYyIENQODYyIgotCSAgZWNobyAiJGwuY3AtMTI1NSBDUDEyNTUiCi0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gdHIgdHJfVFI7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS05IgotCSAgZWNobyAiJGwuaXNvLTg4NTktOSBJU08tODg1OS05IgotCSAgZWNobyAiJGwuY3AtODU3IENQODU3IgotCSAgZWNobyAiJGwuY3AtMTI1NCBDUDEyNTQiCi0JICBlY2hvICIkbC51dGYtOCBVVEYtOCIKLQlkb25lCi0JZm9yIGwgaW4gbHQgbHRfTFQgbHYgbHZfTFY7IGRvCi0JICAjZWNobyAiJGwgQkFMVElDIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKLQkgIGVjaG8gIiRsIElTTy04ODU5LTEzIgotCWRvbmUKLQlmb3IgbCBpbiBydV9VQSB1ayB1a19VQTsgZG8KLQkgIGVjaG8gIiRsIEtPSTgtVSIKLQlkb25lCi0JZm9yIGwgaW4gemggemhfQ047IGRvCi0JICAjZWNobyAiJGwgR0JfMjMxMi04MCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCi0JICBlY2hvICIkbCBHQjIzMTIiCi0JZG9uZQotCWZvciBsIGluIGphIGphX0pQIGphX0pQLkVVQzsgZG8KLQkgIGVjaG8gIiRsIEVVQy1KUCIKLQlkb25lCi0JZm9yIGwgaW4ga28ga29fS1I7IGRvCi0JICBlY2hvICIkbCBFVUMtS1IiCi0JZG9uZQotCWZvciBsIGluIHRoIHRoX1RIOyBkbwotCSAgZWNobyAiJGwgVElTLTYyMCIKLQlkb25lCi0JZm9yIGwgaW4gZmEgZmFfSVI7IGRvCi0JICAjZWNobyAiJGwgSVNJUkktMzM0MiIgIyBhIGJyb2tlbiBlbmNvZGluZwotCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCi0JZG9uZQotCTs7Ci0gICAgbGludXgqIHwgKi1nbnUqKQotCSMgV2l0aCBnbGliYy0yLjEgb3IgbmV3ZXIsIHdlIGRvbid0IG5lZWQgYW55IGNhbm9uaWNhbGl6YXRpb24sCi0JIyBiZWNhdXNlIGdsaWJjIGhhcyBpY29udiBhbmQgYm90aCBnbGliYyBhbmQgbGliaWNvbnYgc3VwcG9ydCBhbGwKLQkjIEdOVSBjYW5vbmljYWwgbmFtZXMgZGlyZWN0bHkuIFRoZXJlZm9yZSwgdGhlIE1ha2VmaWxlIGRvZXMgbm90Ci0JIyBuZWVkIHRvIGluc3RhbGwgdGhlIGFsaWFzIGZpbGUgYXQgYWxsLgotCSMgVGhlIGZvbGxvd2luZyBhcHBsaWVzIG9ubHkgdG8gZ2xpYmMtMi4wLnggYW5kIG9sZGVyIGxpYmNzLgotCWVjaG8gIklTT182NDYuSVJWOjE5ODMgQVNDSUkiCi0JOzsKLSAgICBhaXgqKQotCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgotCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgotCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCi0JZWNobyAiSUJNLTg1MCBDUDg1MCIKLQllY2hvICJJQk0tODU2IENQODU2IgotCWVjaG8gIklCTS05MjEgSVNPLTg4NTktMTMiCi0JZWNobyAiSUJNLTkyMiBDUDkyMiIKLQllY2hvICJJQk0tOTMyIENQOTMyIgotCWVjaG8gIklCTS05NDMgQ1A5NDMiCi0JZWNobyAiSUJNLTEwNDYgQ1AxMDQ2IgotCWVjaG8gIklCTS0xMTI0IENQMTEyNCIKLQllY2hvICJJQk0tMTEyOSBDUDExMjkiCi0JZWNobyAiSUJNLTEyNTIgQ1AxMjUyIgotCWVjaG8gIklCTS1ldWNDTiBHQjIzMTIiCi0JZWNobyAiSUJNLWV1Y0pQIEVVQy1KUCIKLQllY2hvICJJQk0tZXVjS1IgRVVDLUtSIgotCWVjaG8gIklCTS1ldWNUVyBFVUMtVFciCi0JZWNobyAiYmlnNSBCSUc1IgotCWVjaG8gIkdCSyBHQksiCi0JZWNobyAiVElTLTYyMCBUSVMtNjIwIgotCWVjaG8gIlVURi04IFVURi04IgotCTs7Ci0gICAgaHB1eCopCi0JZWNobyAiaXNvODg1OTEgSVNPLTg4NTktMSIKLQllY2hvICJpc284ODU5MiBJU08tODg1OS0yIgotCWVjaG8gImlzbzg4NTk1IElTTy04ODU5LTUiCi0JZWNobyAiaXNvODg1OTYgSVNPLTg4NTktNiIKLQllY2hvICJpc284ODU5NyBJU08tODg1OS03IgotCWVjaG8gImlzbzg4NTk4IElTTy04ODU5LTgiCi0JZWNobyAiaXNvODg1OTkgSVNPLTg4NTktOSIKLQllY2hvICJpc284ODU5MTUgSVNPLTg4NTktMTUiCi0JZWNobyAicm9tYW44IEhQLVJPTUFOOCIKLQllY2hvICJhcmFiaWM4IEhQLUFSQUJJQzgiCi0JZWNobyAiZ3JlZWs4IEhQLUdSRUVLOCIKLQllY2hvICJoZWJyZXc4IEhQLUhFQlJFVzgiCi0JZWNobyAidHVya2lzaDggSFAtVFVSS0lTSDgiCi0JZWNobyAia2FuYTggSFAtS0FOQTgiCi0JZWNobyAidGlzNjIwIFRJUy02MjAiCi0JZWNobyAiYmlnNSBCSUc1IgotCWVjaG8gImV1Y0pQIEVVQy1KUCIKLQllY2hvICJldWNLUiBFVUMtS1IiCi0JZWNobyAiZXVjVFcgRVVDLVRXIgotCWVjaG8gImhwMTVDTiBHQjIzMTIiCi0JI2VjaG8gImNjZGMgPyIgIyB3aGF0IGlzIHRoaXM/Ci0JZWNobyAiU0pJUyBTSElGVF9KSVMiCi0JZWNobyAidXRmOCBVVEYtOCIKLQk7OwotICAgIGlyaXgqKQotCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgotCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgotCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgotCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgotCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgotCWVjaG8gImV1Y0NOIEdCMjMxMiIKLQllY2hvICJldWNKUCBFVUMtSlAiCi0JZWNobyAiZXVjS1IgRVVDLUtSIgotCWVjaG8gImV1Y1RXIEVVQy1UVyIKLQk7OwotICAgIG9zZiopCi0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0JZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCi0JZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCi0JZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCi0JZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLQllY2hvICJjcDg1MCBDUDg1MCIKLQllY2hvICJiaWc1IEJJRzUiCi0JZWNobyAiZGVjaGFueXUgREVDLUhBTllVIgotCWVjaG8gImRlY2hhbnppIEdCMjMxMiIKLQllY2hvICJkZWNrYW5qaSBERUMtS0FOSkkiCi0JZWNobyAiZGVja29yZWFuIEVVQy1LUiIKLQllY2hvICJldWNKUCBFVUMtSlAiCi0JZWNobyAiZXVjS1IgRVVDLUtSIgotCWVjaG8gImV1Y1RXIEVVQy1UVyIKLQllY2hvICJHQksgR0JLIgotCWVjaG8gIktTQzU2MDEgQ1A5NDkiCi0JZWNobyAic2RlY2thbmppIEVVQy1KUCIKLQllY2hvICJTSklTIFNISUZUX0pJUyIKLQllY2hvICJUQUNUSVMgVElTLTYyMCIKLQllY2hvICJVVEYtOCBVVEYtOCIKLQk7OwotICAgIHNvbGFyaXMqKQotCWVjaG8gIjY0NiBBU0NJSSIKLQllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKLQllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKLQllY2hvICJJU084ODU5LTMgSVNPLTg4NTktMyIKLQllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKLQllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKLQllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKLQllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKLQllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKLQllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotCWVjaG8gImtvaTgtciBLT0k4LVIiCi0JZWNobyAiYW5zaS0xMjUxIENQMTI1MSIKLQllY2hvICJCSUc1IEJJRzUiCi0JZWNobyAiQmlnNS1IS1NDUyBCSUc1LUhLU0NTIgotCWVjaG8gImdiMjMxMiBHQjIzMTIiCi0JZWNobyAiR0JLIEdCSyIKLQllY2hvICJHQjE4MDMwIEdCMTgwMzAiCi0JZWNobyAiY25zMTE2NDMgRVVDLVRXIgotCWVjaG8gIjU2MDEgRVVDLUtSIgotCWVjaG8gImtvX0tSLmpvaGFwOTIgSk9IQUIiCi0JZWNobyAiZXVjSlAgRVVDLUpQIgotCWVjaG8gIlBDSyBTSElGVF9KSVMiCi0JZWNobyAiVElTNjIwLjI1MzMgVElTLTYyMCIKLQkjZWNobyAic3VuX2V1X2dyZWVrID8iICMgd2hhdCBpcyB0aGlzPwotCWVjaG8gIlVURi04IFVURi04IgotCTs7Ci0gICAgZnJlZWJzZCogfCBvczIqKQotCSMgRnJlZUJTRCA0LjIgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQkjIExpa2V3aXNlIGZvciBPUy8yLiBPUy8yIGhhcyBYRnJlZTg2IGp1c3QgbGlrZSBGcmVlQlNELiBKdXN0Ci0JIyByZXVzZSBGcmVlQlNEJ3MgbG9jYWxlIGRhdGEgZm9yIE9TLzIuCi0JZWNobyAiQyBBU0NJSSIKLQllY2hvICJVUy1BU0NJSSBBU0NJSSIKLQlmb3IgbCBpbiBsYV9MTiBsdF9MTjsgZG8KLQkgIGVjaG8gIiRsLkFTQ0lJIEFTQ0lJIgotCWRvbmUKLQlmb3IgbCBpbiBkYV9ESyBkZV9BVCBkZV9DSCBkZV9ERSBlbl9BVSBlbl9DQSBlbl9HQiBlbl9VUyBlc19FUyBcCi0JICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbGFfTE4gXAotCSAgICAgICAgIGx0X0xOIG5sX0JFIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbwotCSAgZWNobyAiJGwuSVNPXzg4NTktMSBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuRElTXzg4NTktMTUgSVNPLTg4NTktMTUiCi0JZG9uZQotCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIGx0X0xOIHBsX1BMIHNsX1NJOyBkbwotCSAgZWNobyAiJGwuSVNPXzg4NTktMiBJU08tODg1OS0yIgotCWRvbmUKLQlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KLQkgIGVjaG8gIiRsLklTT184ODU5LTQgSVNPLTg4NTktNCIKLQlkb25lCi0JZm9yIGwgaW4gcnVfUlUgcnVfU1U7IGRvCi0JICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgotCSAgZWNobyAiJGwuSVNPXzg4NTktNSBJU08tODg1OS01IgotCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCi0JZG9uZQotCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCi0JZWNobyAiemhfVFcuQklHNSBCSUc1IgotCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKLQllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgotCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCi0JZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCi0JZWNobyAiamFfSlAuU2hpZnRfSklTIFNISUZUX0pJUyIKLQllY2hvICJrb19LUi5FVUMgRVVDLUtSIgotCTs7Ci0gICAgbmV0YnNkKikKLQllY2hvICI2NDYgQVNDSUkiCi0JZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCi0JZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCi0JZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCi0JZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCi0JZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCi0JZWNobyAiSVNPODg1OS0xMyBJU08tODg1OS0xMyIKLQllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgotCWVjaG8gImV1Y0NOIEdCMjMxMiIKLQllY2hvICJldWNKUCBFVUMtSlAiCi0JZWNobyAiZXVjS1IgRVVDLUtSIgotCWVjaG8gImV1Y1RXIEVVQy1UVyIKLQllY2hvICJCSUc1IEJJRzUiCi0JZWNobyAiU0pJUyBTSElGVF9KSVMiCi0JOzsKLSAgICBkYXJ3aW5bNTZdKikKLQkjIERhcndpbiA2LjggZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKLQkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKLQkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQllY2hvICJDIEFTQ0lJIgotCWZvciBsIGluIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGxhX0xOOyBkbwotCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCi0JZG9uZQotCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKLQkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCi0JICAgICAgICAgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCi0JICBlY2hvICIkbCBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCi0JICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgotCWRvbmUKLQlmb3IgbCBpbiBsYV9MTjsgZG8KLQkgIGVjaG8gIiRsLklTTzg4NTktMSBJU08tODg1OS0xIgotCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKLQlkb25lCi0JZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gcGxfUEwgc2xfU0k7IGRvCi0JICBlY2hvICIkbC5JU084ODU5LTIgSVNPLTg4NTktMiIKLQlkb25lCi0JZm9yIGwgaW4gbGFfTE4gbHRfTFQ7IGRvCi0JICBlY2hvICIkbC5JU084ODU5LTQgSVNPLTg4NTktNCIKLQlkb25lCi0JZm9yIGwgaW4gcnVfUlU7IGRvCi0JICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgotCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCi0JICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKLQlkb25lCi0JZm9yIGwgaW4gYmdfQkc7IGRvCi0JICBlY2hvICIkbC5DUDEyNTEgQ1AxMjUxIgotCWRvbmUKLQllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgotCWVjaG8gInpoX1RXLkJJRzUgQklHNSIKLQllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCi0JZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKLQllY2hvICJqYV9KUC5FVUMgRVVDLUpQIgotCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgotCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCi0JOzsKLSAgICBkYXJ3aW4qKQotCSMgRGFyd2luIDcuNSBoYXMgbmxfbGFuZ2luZm8oQ09ERVNFVCksIGJ1dCBpdCBpcyB1c2VsZXNzOgotCSMgLSBJdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBMQU5HIGlzIHNldCB0byBhIGxvY2FsZSBvZiB0aGUKLQkjICAgZm9ybSBsbF9DQywgYWx0aG91Z2ggbGxfQ0MvTENfQ1RZUEUgaXMgYSBzeW1saW5rIHRvIGFuIFVURi04Ci0JIyAgIExDX0NUWVBFIGZpbGUuCi0JIyAtIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgTEFORywgTENfQ1RZUEUsIExDX0FMTCBhcmUgbm90IHNldCBieQotCSMgICB0aGUgc3lzdGVtOyBubF9sYW5naW5mbyhDT0RFU0VUKSByZXR1cm5zICJVUy1BU0NJSSIgaW4gdGhpcyBjYXNlLgotCSMgLSBUaGUgZG9jdW1lbnRhdGlvbiBzYXlzOgotCSMgICAgICIuLi4gYWxsIGNvZGUgdGhhdCBjYWxscyBCU0Qgc3lzdGVtIHJvdXRpbmVzIHNob3VsZCBlbnN1cmUKLQkjICAgICAgdGhhdCB0aGUgY29uc3QgKmNoYXIgcGFyYW1ldGVycyBvZiB0aGVzZSByb3V0aW5lcyBhcmUgaW4gVVRGLTgKLQkjICAgICAgZW5jb2RpbmcuIEFsbCBCU0Qgc3lzdGVtIGZ1bmN0aW9ucyBleHBlY3QgdGhlaXIgc3RyaW5nCi0JIyAgICAgIHBhcmFtZXRlcnMgdG8gYmUgaW4gVVRGLTggZW5jb2RpbmcgYW5kIG5vdGhpbmcgZWxzZS4iCi0JIyAgIEl0IGFsc28gc2F5cwotCSMgICAgICJBbiBhZGRpdGlvbmFsIGNhdmVhdCBpcyB0aGF0IHN0cmluZyBwYXJhbWV0ZXJzIGZvciBmaWxlcywKLQkjICAgICAgcGF0aHMsIGFuZCBvdGhlciBmaWxlLXN5c3RlbSBlbnRpdGllcyBtdXN0IGJlIGluIGNhbm9uaWNhbAotCSMgICAgICBVVEYtOC4gSW4gYSBjYW5vbmljYWwgVVRGLTggVW5pY29kZSBzdHJpbmcsIGFsbCBkZWNvbXBvc2FibGUKLQkjICAgICAgY2hhcmFjdGVycyBhcmUgZGVjb21wb3NlZCAuLi4iCi0JIyAgIGJ1dCB0aGlzIGlzIG5vdCB0cnVlOiBZb3UgY2FuIHBhc3Mgbm9uLWRlY29tcG9zZWQgVVRGLTggc3RyaW5ncwotCSMgICB0byBmaWxlIHN5c3RlbSBmdW5jdGlvbnMsIGFuZCBpdCBpcyB0aGUgT1Mgd2hpY2ggd2lsbCBjb252ZXJ0Ci0JIyAgIHRoZW0gdG8gZGVjb21wb3NlZCBVVEYtOCBiZWZvcmUgYWNjZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4KLQkjIC0gVGhlIEFwcGxlIFRlcm1pbmFsIGFwcGxpY2F0aW9uIGRpc3BsYXlzIFVURi04IGJ5IGRlZmF1bHQuCi0JIyAtIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBhcmUgZnJlZSB0byB1c2UgZGlmZmVyZW50IGVuY29kaW5nczoKLQkjICAgLSB4dGVybSB1c2VzIElTTy04ODU5LTEgYnkgZGVmYXVsdC4KLQkjICAgLSBUZXh0RWRpdCB1c2VzIE1hY1JvbWFuIGJ5IGRlZmF1bHQuCi0JIyBXZSBwcmVmZXIgVVRGLTggb3ZlciBkZWNvbXBvc2VkIFVURi04LU1BQyBiZWNhdXNlIG9uZSBzaG91bGQKLQkjIG1pbmltaXplIHRoZSB1c2Ugb2YgZGVjb21wb3NlZCBVbmljb2RlLiBVbmZvcnR1bmF0ZWx5LCB0aHJvdWdoIHRoZQotCSMgRGFyd2luIGZpbGUgc3lzdGVtLCBkZWNvbXBvc2VkIFVURi04IHN0cmluZ3MgYXJlIGxlYWtlZCBpbnRvIHVzZXIKLQkjIHNwYWNlIG5ldmVydGhlbGVzcy4KLQllY2hvICIqIFVURi04IgotCTs7Ci0gICAgYmVvcyopCi0JIyBCZU9TIGhhcyBhIHNpbmdsZSBsb2NhbGUsIGFuZCBpdCBoYXMgVVRGLTggZW5jb2RpbmcuCi0JZWNobyAiKiBVVEYtOCIKLQk7OwotICAgIG1zZG9zZGpncHAqKQotCSMgREpHUFAgMi4wMyBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQotCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQotCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotCWVjaG8gIiMiCi0JZWNobyAiIyBUaGUgZW5jb2RpbmdzIGdpdmVuIGhlcmUgbWF5IG5vdCBhbGwgYmUgY29ycmVjdC4iCi0JZWNobyAiIyBJZiB5b3UgZmluZCB0aGF0IHRoZSBlbmNvZGluZyBnaXZlbiBmb3IgeW91ciBsYW5ndWFnZSBhbmQiCi0JZWNobyAiIyBjb3VudHJ5IGlzIG5vdCB0aGUgb25lIHlvdXIgRE9TIG1hY2hpbmUgYWN0dWFsbHkgdXNlcywganVzdCIKLQllY2hvICIjIGNvcnJlY3QgaXQgaW4gdGhpcyBmaWxlLCBhbmQgc2VuZCBhIG1haWwgdG8iCi0JZWNobyAiIyBKdWFuIE1hbnVlbCBHdWVycmVybyA8anVhbi5ndWVycmVyb0BnbXguZGU+IgotCWVjaG8gIiMgYW5kIEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4iCi0JZWNobyAiIyIKLQllY2hvICJDIEFTQ0lJIgotCSMgSVNPLTg4NTktMSBsYW5ndWFnZXMKLQllY2hvICJjYSBDUDg1MCIKLQllY2hvICJjYV9FUyBDUDg1MCIKLQllY2hvICJkYSBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJkYV9ESyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJkZSBDUDg1MCIKLQllY2hvICJkZV9BVCBDUDg1MCIKLQllY2hvICJkZV9DSCBDUDg1MCIKLQllY2hvICJkZV9ERSBDUDg1MCIKLQllY2hvICJlbiBDUDg1MCIKLQllY2hvICJlbl9BVSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJlbl9DQSBDUDg1MCIKLQllY2hvICJlbl9HQiBDUDg1MCIKLQllY2hvICJlbl9OWiBDUDQzNyIKLQllY2hvICJlbl9VUyBDUDQzNyIKLQllY2hvICJlbl9aQSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJlcyBDUDg1MCIKLQllY2hvICJlc19BUiBDUDg1MCIKLQllY2hvICJlc19CTyBDUDg1MCIKLQllY2hvICJlc19DTCBDUDg1MCIKLQllY2hvICJlc19DTyBDUDg1MCIKLQllY2hvICJlc19DUiBDUDg1MCIKLQllY2hvICJlc19DVSBDUDg1MCIKLQllY2hvICJlc19ETyBDUDg1MCIKLQllY2hvICJlc19FQyBDUDg1MCIKLQllY2hvICJlc19FUyBDUDg1MCIKLQllY2hvICJlc19HVCBDUDg1MCIKLQllY2hvICJlc19ITiBDUDg1MCIKLQllY2hvICJlc19NWCBDUDg1MCIKLQllY2hvICJlc19OSSBDUDg1MCIKLQllY2hvICJlc19QQSBDUDg1MCIKLQllY2hvICJlc19QWSBDUDg1MCIKLQllY2hvICJlc19QRSBDUDg1MCIKLQllY2hvICJlc19TViBDUDg1MCIKLQllY2hvICJlc19VWSBDUDg1MCIKLQllY2hvICJlc19WRSBDUDg1MCIKLQllY2hvICJldCBDUDg1MCIKLQllY2hvICJldF9FRSBDUDg1MCIKLQllY2hvICJldSBDUDg1MCIKLQllY2hvICJldV9FUyBDUDg1MCIKLQllY2hvICJmaSBDUDg1MCIKLQllY2hvICJmaV9GSSBDUDg1MCIKLQllY2hvICJmciBDUDg1MCIKLQllY2hvICJmcl9CRSBDUDg1MCIKLQllY2hvICJmcl9DQSBDUDg1MCIKLQllY2hvICJmcl9DSCBDUDg1MCIKLQllY2hvICJmcl9GUiBDUDg1MCIKLQllY2hvICJnYSBDUDg1MCIKLQllY2hvICJnYV9JRSBDUDg1MCIKLQllY2hvICJnZCBDUDg1MCIKLQllY2hvICJnZF9HQiBDUDg1MCIKLQllY2hvICJnbCBDUDg1MCIKLQllY2hvICJnbF9FUyBDUDg1MCIKLQllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJpZF9JRCBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KLQllY2hvICJpcyBDUDg2MSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJpdCBDUDg1MCIKLQllY2hvICJpdF9DSCBDUDg1MCIKLQllY2hvICJpdF9JVCBDUDg1MCIKLQllY2hvICJsdCBDUDc3NSIKLQllY2hvICJsdF9MVCBDUDc3NSIKLQllY2hvICJsdiBDUDc3NSIKLQllY2hvICJsdl9MViBDUDc3NSIKLQllY2hvICJuYiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubCBDUDg1MCIKLQllY2hvICJubF9CRSBDUDg1MCIKLQllY2hvICJubF9OTCBDUDg1MCIKLQllY2hvICJubiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJub19OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KLQllY2hvICJwdCBDUDg1MCIKLQllY2hvICJwdF9CUiBDUDg1MCIKLQllY2hvICJwdF9QVCBDUDg1MCIKLQllY2hvICJzdiBDUDg1MCIKLQllY2hvICJzdl9TRSBDUDg1MCIKLQkjIElTTy04ODU5LTIgbGFuZ3VhZ2VzCi0JZWNobyAiY3MgQ1A4NTIiCi0JZWNobyAiY3NfQ1ogQ1A4NTIiCi0JZWNobyAiaHIgQ1A4NTIiCi0JZWNobyAiaHJfSFIgQ1A4NTIiCi0JZWNobyAiaHUgQ1A4NTIiCi0JZWNobyAiaHVfSFUgQ1A4NTIiCi0JZWNobyAicGwgQ1A4NTIiCi0JZWNobyAicGxfUEwgQ1A4NTIiCi0JZWNobyAicm8gQ1A4NTIiCi0JZWNobyAicm9fUk8gQ1A4NTIiCi0JZWNobyAic2sgQ1A4NTIiCi0JZWNobyAic2tfU0sgQ1A4NTIiCi0JZWNobyAic2wgQ1A4NTIiCi0JZWNobyAic2xfU0kgQ1A4NTIiCi0JZWNobyAic3EgQ1A4NTIiCi0JZWNobyAic3FfQUwgQ1A4NTIiCi0JZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KLQllY2hvICJzcl9DUyBDUDg1MiIgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PwotCWVjaG8gInNyX1lVIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/Ci0JIyBJU08tODg1OS0zIGxhbmd1YWdlcwotCWVjaG8gIm10IENQODUwIgotCWVjaG8gIm10X01UIENQODUwIgotCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKLQllY2hvICJiZSBDUDg2NiIKLQllY2hvICJiZV9CRSBDUDg2NiIKLQllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJiZ19CRyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJtayBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KLQllY2hvICJydSBDUDg2NiIKLQllY2hvICJydV9SVSBDUDg2NiIKLQllY2hvICJ1ayBDUDExMjUiCi0JZWNobyAidWtfVUEgQ1AxMTI1IgotCSMgSVNPLTg4NTktNiBsYW5ndWFnZXMKLQllY2hvICJhciBDUDg2NCIKLQllY2hvICJhcl9BRSBDUDg2NCIKLQllY2hvICJhcl9EWiBDUDg2NCIKLQllY2hvICJhcl9FRyBDUDg2NCIKLQllY2hvICJhcl9JUSBDUDg2NCIKLQllY2hvICJhcl9JUiBDUDg2NCIKLQllY2hvICJhcl9KTyBDUDg2NCIKLQllY2hvICJhcl9LVyBDUDg2NCIKLQllY2hvICJhcl9NQSBDUDg2NCIKLQllY2hvICJhcl9PTSBDUDg2NCIKLQllY2hvICJhcl9RQSBDUDg2NCIKLQllY2hvICJhcl9TQSBDUDg2NCIKLQllY2hvICJhcl9TWSBDUDg2NCIKLQkjIElTTy04ODU5LTcgbGFuZ3VhZ2VzCi0JZWNobyAiZWwgQ1A4NjkiCi0JZWNobyAiZWxfR1IgQ1A4NjkiCi0JIyBJU08tODg1OS04IGxhbmd1YWdlcwotCWVjaG8gImhlIENQODYyIgotCWVjaG8gImhlX0lMIENQODYyIgotCSMgSVNPLTg4NTktOSBsYW5ndWFnZXMKLQllY2hvICJ0ciBDUDg1NyIKLQllY2hvICJ0cl9UUiBDUDg1NyIKLQkjIEphcGFuZXNlCi0JZWNobyAiamEgQ1A5MzIiCi0JZWNobyAiamFfSlAgQ1A5MzIiCi0JIyBDaGluZXNlCi0JZWNobyAiemhfQ04gR0JLIgotCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PwotCSMgS29yZWFuCi0JZWNobyAia3IgQ1A5NDkiICAgICMgbm90IENQOTM0ID8/Ci0JZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/Ci0JIyBUaGFpCi0JZWNobyAidGggQ1A4NzQiCi0JZWNobyAidGhfVEggQ1A4NzQiCi0JIyBPdGhlcgotCWVjaG8gImVvIENQODUwIgotCWVjaG8gImVvX0VPIENQODUwIgotCTs7Ci1lc2FjCmRpZmYgLS1naXQgYS9pbnRsL2RjZ2V0dGV4dC5jIGIvaW50bC9kY2dldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNjNmMC4uMDAwMDAwMAotLS0gYS9pbnRsL2RjZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0jIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWNoYXIgKgotRENHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5KQotewotICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIE5VTEwsIDAsIDAsIGNhdGVnb3J5KTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLUlOVERFRihfX2RjZ2V0dGV4dCkKLXdlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2RjaWdldHRleHQuYyBiL2ludGwvZGNpZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNlNTFkLi4wMDAwMDAwCi0tLSBhL2ludGwvZGNpZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4OSArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGNpZ2V0dGV4dCBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgotICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotLyogTkxfTE9DQUxFX05BTUUgZG9lcyBub3Qgd29yayBpbiBnbGliYy0yLjQuICBJZ25vcmUgaXQuICAqLwotI3VuZGVmIEhBVkVfTkxfTE9DQUxFX05BTUUKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZm5kZWYgX19zZXRfZXJybm8KLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotI2lmZGVmIF9MSUJDCi0gIC8qIEd1ZXNzIHdoZXRoZXIgaW50ZWdlciBkaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyBzaWduYWwgU0lHRlBFLgotICAgICBTZXQgdG8gMSBvbmx5IGlmIHlvdSBrbm93IGZvciBzdXJlLiAgSW4gY2FzZSBvZiBkb3VidCwgc2V0IHRvIDAuICAqLwotIyBpZiBkZWZpbmVkIF9fYWxwaGFfXyB8fCBkZWZpbmVkIF9fYXJtX18gfHwgZGVmaW5lZCBfX2kzODZfXyBcCi0gICAgIHx8IGRlZmluZWQgX19tNjhrX18gfHwgZGVmaW5lZCBfX3MzOTBfXwotIyAgZGVmaW5lIElOVERJVjBfUkFJU0VTX1NJR0ZQRSAxCi0jIGVsc2UKLSMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMAotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQotIyBpbmNsdWRlIDxzaWduYWwuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NZU19QQVJBTV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIF9MSUJDCi0jIGlmIEhBVkVfTkxfTE9DQUxFX05BTUUKLSMgIGluY2x1ZGUgPGxhbmdpbmZvLmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgImxvY2FsY2hhcnNldC5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCi0KLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkCi0jIGRlZmluZSBnbF9yd2xvY2tfcmRsb2NrIF9fbGliY19yd2xvY2tfcmRsb2NrCi0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrIF9fbGliY19yd2xvY2tfdW5sb2NrCi0jZWxzZQotIyBpbmNsdWRlICJsb2NrLmgiCi0jZW5kaWYKLQotLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KLSNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKLSMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCi0jZWxzZQotIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCi0gICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQotI2VuZGlmCi0KLS8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KLSNpZm5kZWYgb2Zmc2V0b2YKLSMgZGVmaW5lIG9mZnNldG9mKHR5cGUsaWRlbnQpICgoc2l6ZV90KSYoKCh0eXBlKikwKS0+aWRlbnQpKQotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGdldGN3ZCBfX2dldGN3ZAotIyBpZm5kZWYgc3RwY3B5Ci0jICBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5Ci0jIGVuZGlmCi0jIGRlZmluZSB0ZmluZCBfX3RmaW5kCi0jZWxzZQotIyBpZiAhZGVmaW5lZCBIQVZFX0dFVENXRAotY2hhciAqZ2V0d2QgKCk7Ci0jICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQotIyBlbHNlCi0jICBpZiBWTVMKLSMgICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSAoZ2V0Y3dkKSAoYnVmLCBtYXgsIDApCi0jICBlbHNlCi1jaGFyICpnZXRjd2QgKCk7Ci0jICBlbmRpZgotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7Ci0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX01FTVBDUFkKLXN0YXRpYyB2b2lkICptZW1wY3B5ICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBVc2UgYSByZXBsYWNlbWVudCBpZiB0aGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGB0c2VhcmNoJyBmdW5jdGlvbgotICAgZmFtaWx5LiAgKi8KLSNpZiBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzZWFyY2guaD4KLSNlbHNlCi0jIGRlZmluZSB0c2VhcmNoIGxpYmludGxfdHNlYXJjaAotIyBkZWZpbmUgdGZpbmQgbGliaW50bF90ZmluZAotIyBkZWZpbmUgdGRlbGV0ZSBsaWJpbnRsX3RkZWxldGUKLSMgZGVmaW5lIHR3YWxrIGxpYmludGxfdHdhbGsKLSMgaW5jbHVkZSAidHNlYXJjaC5oIgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgdHNlYXJjaCBfX3RzZWFyY2gKLSNlbmRpZgotCi0vKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLwotI2RlZmluZSBQQVRIX0lOQ1IgMzIKLQotLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCi0vKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKLSAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcwotICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLwotI2lmIGRlZmluZWQgX1BPU0lYX1ZFUlNJT04gfHwgKGRlZmluZWQgSEFWRV9MSU1JVFNfSCAmJiAhZGVmaW5lZCBfX0dOVUNfXykKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKLSMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgUEFUSF9NQVggJiYgZGVmaW5lZCBfUENfUEFUSF9NQVgKLSMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQotI2VuZGlmCi0KLS8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCi0jaWYgZGVmaW5lZCBIQVZFX1NZU19QQVJBTV9IICYmICFkZWZpbmVkIFBBVEhfTUFYICYmICFkZWZpbmVkIE1BWFBBVEhMRU4KLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgTUFYUEFUSExFTgotIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgotI2VuZGlmCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSMgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAotI2VuZGlmCi0KLS8qIFBhdGhuYW1lIHN1cHBvcnQuCi0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgIElTX0FCU09MVVRFX1BBVEgoUCkgIHRlc3RzIHdoZXRoZXIgUCBpcyBhbiBhYnNvbHV0ZSBwYXRoLiAgSWYgaXQgaXMgbm90LAotICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWF5IGJlIGNvbmNhdGVuYXRlZCB0byBhIGRpcmVjdG9yeSBwYXRobmFtZS4KLSAgIElTX1BBVEhfV0lUSF9ESVIoUCkgIHRlc3RzIHdoZXRoZXIgUCBjb250YWlucyBhIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgotICovCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0jIGRlZmluZSBIQVNfREVWSUNFKFApIFwKLSAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCi0gICAgICYmIChQKVsxXSA9PSAnOicpCi0jIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIChJU1NMQVNIICgoUClbMF0pIHx8IEhBU19ERVZJQ0UgKFApKQotIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSBcCi0gICAgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMIHx8IHN0cmNociAoUCwgJ1xcJykgIT0gTlVMTCB8fCBIQVNfREVWSUNFIChQKSkKLSNlbHNlCi0gIC8qIFVuaXggKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCi0jIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIElTU0xBU0ggKChQKVswXSkKLSMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMKQotI2VuZGlmCi0KLS8qIFdoZXRoZXIgdG8gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBpbiBkaWZmZXJlbnQgdGhyZWFkcy4gICovCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX05MX0xPQ0FMRV9OQU1FIHx8IChIQVZFX1NUUlVDVF9fX0xPQ0FMRV9TVFJVQ1RfX19OQU1FUyAmJiBkZWZpbmVkIFVTRV9JTl9HRVRURVhUX1RFU1RTKSB8fCBkZWZpbmVkIElOX0xJQkdMT0NBTEUKLSMgZGVmaW5lIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLSNlbmRpZgotCi0vKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBzZWFyY2ggdHJlZSB3aGVyZSBrbm93biB0cmFuc2xhdGlvbnMKLSAgIGFyZSBzdG9yZWQuICAqLwotc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKLXsKLSAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCi0gIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0KLSAgLyogVGhlIGNhdGVnb3J5LiAgKi8KLSAgaW50IGNhdGVnb3J5OwotCi0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotICAvKiBOYW1lIG9mIHRoZSByZWxldmFudCBsb2NhbGUgY2F0ZWdvcnksIG9yICIiIGZvciB0aGUgZ2xvYmFsIGxvY2FsZS4gICovCi0gIGNvbnN0IGNoYXIgKmxvY2FsZW5hbWU7Ci0jZW5kaWYKLQotI2lmZGVmIElOX0xJQkdMT0NBTEUKLSAgLyogVGhlIGNoYXJhY3RlciBlbmNvZGluZy4gICovCi0gIGNvbnN0IGNoYXIgKmVuY29kaW5nOwotI2VuZGlmCi0KLSAgLyogU3RhdGUgb2YgdGhlIGNhdGFsb2cgY291bnRlciBhdCB0aGUgcG9pbnQgdGhlIHN0cmluZyB3YXMgZm91bmQuICAqLwotICBpbnQgY291bnRlcjsKLQotICAvKiBDYXRhbG9nIHdoZXJlIHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOwotCi0gIC8qIEFuZCBmaW5hbGx5IHRoZSB0cmFuc2xhdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKnRyYW5zbGF0aW9uOwotICBzaXplX3QgdHJhbnNsYXRpb25fbGVuZ3RoOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIHN0cmluZyBpbiBxdWVzdGlvbi4gICovCi0gIGNoYXIgbXNnaWRbWkVST107Ci19OwotCi1nbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIHRyZWVfbG9jaykKLQotLyogUm9vdCBvZiB0aGUgc2VhcmNoIHRyZWUgd2l0aCBrbm93biB0cmFuc2xhdGlvbnMuICAqLwotc3RhdGljIHZvaWQgKnJvb3Q7Ci0KLS8qIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9mIGtub3duIHRyYW5zbGF0aW9ucy4gICovCi1zdGF0aWMgaW50Ci10cmFuc2NtcCAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczE7Ci0gIGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICpzMjsKLSAgaW50IHJlc3VsdDsKLQotICBzMSA9IChjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBwMTsKLSAgczIgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDI7Ci0KLSAgcmVzdWx0ID0gc3RyY21wIChzMS0+bXNnaWQsIHMyLT5tc2dpZCk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdHJjbXAgKHMxLT5kb21haW5uYW1lLCBzMi0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ID09IDApCi0JewotI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLQkgIHJlc3VsdCA9IHN0cmNtcCAoczEtPmxvY2FsZW5hbWUsIHMyLT5sb2NhbGVuYW1lKTsKLQkgIGlmIChyZXN1bHQgPT0gMCkKLSNlbmRpZgotCSAgICB7Ci0jaWZkZWYgSU5fTElCR0xPQ0FMRQotCSAgICAgIHJlc3VsdCA9IHN0cmNtcCAoczEtPmVuY29kaW5nLCBzMi0+ZW5jb2RpbmcpOwotCSAgICAgIGlmIChyZXN1bHQgPT0gMCkKLSNlbmRpZgotCQkvKiBXZSBjb21wYXJlIHRoZSBjYXRlZ29yeSBsYXN0ICh0aG91Z2ggdGhpcyBpcyB0aGUgY2hlYXBlc3QKLQkJICAgb3BlcmF0aW9uKSBzaW5jZSBpdCBpcyBob3BlZnVsbHkgYWx3YXlzIHRoZSBzYW1lIChuYW1lbHkKLQkJICAgTENfTUVTU0FHRVMpLiAgKi8KLQkJcmVzdWx0ID0gczEtPmNhdGVnb3J5IC0gczItPmNhdGVnb3J5OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbiA9ICJtZXNzYWdlcyI7Ci0KLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotLyogVmFsdWUgdXNlZCBhcyB0aGUgZGVmYXVsdCBkb21haW4gZm9yIGdldHRleHQoMykuICAqLwotY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbgotICAgICA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotI2VuZGlmCi0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLSNpZiBkZWZpbmVkIF9fRU1YX18KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLSNlbHNlCi0jIGlmZGVmIF9MSUJDCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci1saWJjX2hpZGRlbl9wcm90byAoX25sX2RlZmF1bHRfZGlybmFtZSkKLSMgZW5kaWYKLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOwotIyBpZmRlZiBfTElCQwotbGliY19oaWRkZW5fZGF0YV9kZWYgKF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKLSAgIGNhbGxzLiAgKi8KLXN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotI2VuZGlmCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG4sCi0JCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotCi0jaWZkZWYgSU5fTElCR0xPQ0FMRQotc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCi0JCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUsCi0JCQkJCSBjb25zdCBjaGFyICpsb2NhbGVuYW1lKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwKLQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCi0jIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KSBcCi0gIF9ubF9jYXRlZ29yeV9uYW1lcy5zdHIgKyBfbmxfY2F0ZWdvcnlfbmFtZV9pZHhzW2NhdGVnb3J5XQotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyICpjYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpIGludGVybmFsX2Z1bmN0aW9uOwotI2VuZGlmCi0jaWYgKGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVikgJiYgIWRlZmluZWQgSU5fTElCR0xPQ0FMRQotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9vdXRwdXRfY2hhcnNldCAoc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotI2VuZGlmCi0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZC0+YWRkcmVzcyk7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KLSNpZmRlZiBfTElCQwotLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0cmFuc2xhdGlvbnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgdHJhbnNtZW1fbGlzdAotewotICBzdHJ1Y3QgdHJhbnNtZW1fbGlzdCAqbmV4dDsKLSAgY2hhciBkYXRhW1pFUk9dOwotfSB0cmFuc21lbV9ibG9ja190Owotc3RhdGljIHN0cnVjdCB0cmFuc21lbV9saXN0ICp0cmFuc21lbV9saXN0OwotI2Vsc2UKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB0cmFuc21lbV9ibG9ja190OwotI2VuZGlmCi0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCi1nbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkICgsIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCi0KLS8qIENoZWNraW5nIHdoZXRoZXIgdGhlIGJpbmFyaWVzIHJ1bnMgU1VJRCBtdXN0IGJlIGRvbmUgYW5kIGdsaWJjIHByb3ZpZGVzCi0gICBlYXNpZXIgbWV0aG9kcyB0aGVyZWZvcmUgd2UgbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEVOQUJMRV9TRUNVUkUgX19saWJjX2VuYWJsZV9zZWN1cmUKLSMgZGVmaW5lIERFVEVSTUlORV9TRUNVUkUKLSNlbHNlCi0jIGlmbmRlZiBIQVZFX0dFVFVJRAotIyAgZGVmaW5lIGdldHVpZCgpIDAKLSMgZW5kaWYKLSMgaWZuZGVmIEhBVkVfR0VUR0lECi0jICBkZWZpbmUgZ2V0Z2lkKCkgMAotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9HRVRFVUlECi0jICBkZWZpbmUgZ2V0ZXVpZCgpIGdldHVpZCgpCi0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX0dFVEVHSUQKLSMgIGRlZmluZSBnZXRlZ2lkKCkgZ2V0Z2lkKCkKLSMgZW5kaWYKLXN0YXRpYyBpbnQgZW5hYmxlX3NlY3VyZTsKLSMgZGVmaW5lIEVOQUJMRV9TRUNVUkUgKGVuYWJsZV9zZWN1cmUgPT0gMSkKLSMgZGVmaW5lIERFVEVSTUlORV9TRUNVUkUgXAotICBpZiAoZW5hYmxlX3NlY3VyZSA9PSAwKQkJCQkJCSAgICAgIFwKLSAgICB7CQkJCQkJCQkJICAgICAgXAotICAgICAgaWYgKGdldHVpZCAoKSAhPSBnZXRldWlkICgpIHx8IGdldGdpZCAoKSAhPSBnZXRlZ2lkICgpKQkJICAgICAgXAotCWVuYWJsZV9zZWN1cmUgPSAxOwkJCQkJCSAgICAgIFwKLSAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLQllbmFibGVfc2VjdXJlID0gLTE7CQkJCQkJICAgICAgXAotICAgIH0KLSNlbmRpZgotCi0vKiBHZXQgdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIHRoZSBwbHVyYWwgZXhwcmVzc2lvbi4gICovCi0jaW5jbHVkZSAiZXZhbC1wbHVyYWwuaCIKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBDQVRFR09SWSBsb2NhbGUgYW5kLCBpZiBQTFVSQUwgaXMgbm9uemVybywgc2VhcmNoIG92ZXIgc3RyaW5nCi0gICBkZXBlbmRpbmcgb24gdGhlIHBsdXJhbCBmb3JtIGRldGVybWluZWQgYnkgTi4gICovCi0jaWZkZWYgSU5fTElCR0xPQ0FMRQotY2hhciAqCi1nbF9kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAotCSAgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKLQkgICAgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLQkgICAgICAgaW50IGNhdGVnb3J5LAotCSAgICAgICBjb25zdCBjaGFyICpsb2NhbGVuYW1lLCBjb25zdCBjaGFyICplbmNvZGluZykKLSNlbHNlCi1jaGFyICoKLURDSUdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLAotCSAgICBpbnQgcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBuLCBpbnQgY2F0ZWdvcnkpCi0jZW5kaWYKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnl2YWx1ZTsKLSAgY29uc3QgY2hhciAqZGlybmFtZTsKLSAgY2hhciAqeGRvbWFpbm5hbWU7Ci0gIGNoYXIgKnNpbmdsZV9sb2NhbGU7Ci0gIGNoYXIgKnJldHZhbDsKLSAgc2l6ZV90IHJldGxlbjsKLSAgaW50IHNhdmVkX2Vycm5vOwotICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqc2VhcmNoOwotICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKmZvdW5kcCA9IE5VTEw7Ci0gIHNpemVfdCBtc2dpZF9sZW47Ci0jaWYgZGVmaW5lZCBIQVZFX1BFUl9USFJFQURfTE9DQUxFICYmICFkZWZpbmVkIElOX0xJQkdMT0NBTEUKLSAgY29uc3QgY2hhciAqbG9jYWxlbmFtZTsKLSNlbmRpZgotICBzaXplX3QgZG9tYWlubmFtZV9sZW47Ci0KLSAgLyogSWYgbm8gcmVhbCBNU0dJRCBpcyBnaXZlbiByZXR1cm4gTlVMTC4gICovCi0gIGlmIChtc2dpZDEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotI2lmZGVmIF9MSUJDCi0gIGlmIChjYXRlZ29yeSA8IDAgfHwgY2F0ZWdvcnkgPj0gX19MQ19MQVNUIHx8IGNhdGVnb3J5ID09IExDX0FMTCkKLSAgICAvKiBCb2d1cy4gICovCi0gICAgcmV0dXJuIChwbHVyYWwgPT0gMAotCSAgICA/IChjaGFyICopIG1zZ2lkMQotCSAgICAvKiBVc2UgdGhlIEdlcm1hbmljIHBsdXJhbCBydWxlLiAgKi8KLQkgICAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOwotI2VuZGlmCi0KLSAgLyogUHJlc2VydmUgdGhlIGBlcnJubycgdmFsdWUuICAqLwotICBzYXZlZF9lcnJubyA9IGVycm5vOwotCi0gIGdsX3J3bG9ja19yZGxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLQotICAvKiBJZiBET01BSU5OQU1FIGlzIE5VTEwsIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZWZhdWx0IGRvbWFpbi4gIElmCi0gICAgIENBVEVHT1JZIGlzIG5vdCBMQ19NRVNTQUdFUyB0aGlzIG1pZ2h0IG5vdCBtYWtlIG11Y2ggc2Vuc2UgYnV0IHRoZQotICAgICBkZWZpbml0aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBPUy8yIHNwZWNpZmljOiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgbGliaW50bCB2ZXJzaW9ucyAgKi8KLSNpZmRlZiBMQ19NRVNTQUdFU19DT01QQVQKLSAgaWYgKGNhdGVnb3J5ID09IExDX01FU1NBR0VTX0NPTVBBVCkKLSAgICBjYXRlZ29yeSA9IExDX01FU1NBR0VTOwotI2VuZGlmCi0KLSAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKLQotICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKLSAgICAgc29tZSB0aW1lLiAgKi8KLSAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCi0JICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7Ci0gIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOwotICBzZWFyY2gtPmRvbWFpbm5hbWUgPSBkb21haW5uYW1lOwotICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0jaWZkZWYgSEFWRV9QRVJfVEhSRUFEX0xPQ0FMRQotIyBpZm5kZWYgSU5fTElCR0xPQ0FMRQotIyAgaWZkZWYgX0xJQkMKLSAgbG9jYWxlbmFtZSA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOwotIyAgZWxzZQotIyAgIGlmIEhBVkVfTkxfTE9DQUxFX05BTUUKLSAgLyogTkxfTE9DQUxFX05BTUUgaXMgcHVibGljIGdsaWJjIEFQSSBpbnRyb2R1Y2VkIGluIGdsaWJjLTIuNC4gICovCi0gIGxvY2FsZW5hbWUgPSBubF9sYW5naW5mbyAoTkxfTE9DQUxFX05BTUUgKGNhdGVnb3J5KSk7Ci0jICAgZWxzZQotIyAgICBpZiBIQVZFX1NUUlVDVF9fX0xPQ0FMRV9TVFJVQ1RfX19OQU1FUyAmJiBkZWZpbmVkIFVTRV9JTl9HRVRURVhUX1RFU1RTCi0gIC8qIFRoZSBfX25hbWVzIGZpZWxkIGlzIG5vdCBwdWJsaWMgZ2xpYmMgQVBJIGFuZCBtdXN0IHRoZXJlZm9yZSBub3QgYmUgdXNlZAotICAgICBpbiBjb2RlIHRoYXQgaXMgaW5zdGFsbGVkIGluIHB1YmxpYyBsb2NhdGlvbnMuICAqLwotICB7Ci0gICAgbG9jYWxlX3QgdGhyZWFkX2xvY2FsZSA9IHVzZWxvY2FsZSAoTlVMTCk7Ci0gICAgaWYgKHRocmVhZF9sb2NhbGUgIT0gTENfR0xPQkFMX0xPQ0FMRSkKLSAgICAgIGxvY2FsZW5hbWUgPSB0aHJlYWRfbG9jYWxlLT5fX25hbWVzW2NhdGVnb3J5XTsKLSAgICBlbHNlCi0gICAgICBsb2NhbGVuYW1lID0gIiI7Ci0gIH0KLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSAgc2VhcmNoLT5sb2NhbGVuYW1lID0gbG9jYWxlbmFtZTsKLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotICBzZWFyY2gtPmVuY29kaW5nID0gZW5jb2Rpbmc7Ci0jIGVuZGlmCi0KLSAgLyogU2luY2UgdGZpbmQvdHNlYXJjaCBtYW5hZ2UgYSBiYWxhbmNlZCB0cmVlLCBjb25jdXJyZW50IHRmaW5kIGFuZAotICAgICB0c2VhcmNoIGNhbGxzIGNhbiBiZSBmYXRhbC4gICovCi0gIGdsX3J3bG9ja19yZGxvY2sgKHRyZWVfbG9jayk7Ci0KLSAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKSB0ZmluZCAoc2VhcmNoLCAmcm9vdCwgdHJhbnNjbXApOwotCi0gIGdsX3J3bG9ja191bmxvY2sgKHRyZWVfbG9jayk7Ci0KLSAgZnJlZWEgKHNlYXJjaCk7Ci0gIGlmIChmb3VuZHAgIT0gTlVMTCAmJiAoKmZvdW5kcCktPmNvdW50ZXIgPT0gX25sX21zZ19jYXRfY250cikKLSAgICB7Ci0gICAgICAvKiBOb3cgZGVhbCB3aXRoIHBsdXJhbC4gICovCi0gICAgICBpZiAocGx1cmFsKQotCXJldHZhbCA9IHBsdXJhbF9sb29rdXAgKCgqZm91bmRwKS0+ZG9tYWluLCBuLCAoKmZvdW5kcCktPnRyYW5zbGF0aW9uLAotCQkJCSgqZm91bmRwKS0+dHJhbnNsYXRpb25fbGVuZ3RoKTsKLSAgICAgIGVsc2UKLQlyZXR2YWwgPSAoY2hhciAqKSAoKmZvdW5kcCktPnRyYW5zbGF0aW9uOwotCi0gICAgICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0gICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KLSAgREVURVJNSU5FX1NFQ1VSRTsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotI2lmZGVmIElOX0xJQkdMT0NBTEUKLSAgLyogV2UgY2FuIHVzZSBhIHRyaXZpYWwgYmluZGluZywgc2luY2UgX25sX2ZpbmRfbXNnIHdpbGwgaWdub3JlIGl0IGFueXdheSwKLSAgICAgYW5kIF9ubF9sb2FkX2RvbWFpbiBhbmQgX25sX2ZpbmRfZG9tYWluIGp1c3QgcGFzcyBpdCB0aHJvdWdoLiAgKi8KLSAgYmluZGluZyA9IE5VTEw7Ci0gIGRpcm5hbWUgPSBiaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgTlVMTCk7Ci0jZWxzZQotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGRpcm5hbWUgPSBiaW5kaW5nLT5kaXJuYW1lOwotI2VuZGlmCi0gICAgICBpZiAoIUlTX0FCU09MVVRFX1BBVEggKGRpcm5hbWUpKQotCXsKLQkgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLwotCSAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICBzaXplX3QgcGF0aF9tYXg7Ci0JICBjaGFyICpyZXNvbHZlZF9kaXJuYW1lOwotCSAgY2hhciAqcmV0OwotCi0JICBwYXRoX21heCA9ICh1bnNpZ25lZCBpbnQpIFBBVEhfTUFYOwotCSAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCi0KLQkgIGZvciAoOzspCi0JICAgIHsKLQkgICAgICByZXNvbHZlZF9kaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHRtcF9kaXJuYW1lKTsKLQotCSAgICAgIF9fc2V0X2Vycm5vICgwKTsKLQkgICAgICByZXQgPSBnZXRjd2QgKHJlc29sdmVkX2Rpcm5hbWUsIHBhdGhfbWF4KTsKLQkgICAgICBpZiAocmV0ICE9IE5VTEwgfHwgZXJybm8gIT0gRVJBTkdFKQotCQlicmVhazsKLQotCSAgICAgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKLQkgICAgICBwYXRoX21heCArPSBQQVRIX0lOQ1I7Ci0JICAgIH0KLQotCSAgaWYgKHJldCA9PSBOVUxMKQotCSAgICAvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCi0JICAgICAgIGVycm9yIGJ1dCBzaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZy4gICovCi0JICAgIGdvdG8gcmV0dXJuX3VudHJhbnNsYXRlZDsKLQotCSAgc3RwY3B5IChzdHBjcHkgKHN0cmNociAocmVzb2x2ZWRfZGlybmFtZSwgJ1wwJyksICIvIiksIGRpcm5hbWUpOwotCSAgZGlybmFtZSA9IHJlc29sdmVkX2Rpcm5hbWU7Ci0JfQotI2lmbmRlZiBJTl9MSUJHTE9DQUxFCi0gICAgfQotI2VuZGlmCi0KLSAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KLSAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOwotI2lmZGVmIElOX0xJQkdMT0NBTEUKLSAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lLCBsb2NhbGVuYW1lKTsKLSNlbHNlCi0gIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0jZW5kaWYKLQotICBkb21haW5uYW1lX2xlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSk7Ci0gIHhkb21haW5uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5bmFtZSkKLQkJCQkgKyBkb21haW5uYW1lX2xlbiArIDUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLQotICBzdHBjcHkgKChjaGFyICopIG1lbXBjcHkgKHN0cGNweSAoc3RwY3B5ICh4ZG9tYWlubmFtZSwgY2F0ZWdvcnluYW1lKSwgIi8iKSwKLQkJCSAgICBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiksCi0JICAiLm1vIik7Ci0KLSAgLyogQ3JlYXRpbmcgd29ya2luZyBhcmVhLiAgKi8KLSAgc2luZ2xlX2xvY2FsZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeXZhbHVlKSArIDEpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHNpbmdsZV9sb2NhbGUpOwotCi0KLSAgLyogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhpcyBpcyBhIGxvb3AgYmVjYXVzZSB3ZSBwZXJoYXBzCi0gICAgIGdvdCBhbiBvcmRlcmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIHRvIGNvbnNpZGVyIGZvciB0aGUgdHJhbnNsYXRpb24uICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0gICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQotCSsrY2F0ZWdvcnl2YWx1ZTsKLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0JewotCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0JICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgotCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0JICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLQkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOwotCSAgKmNwID0gJ1wwJzsKLQotCSAgLyogV2hlbiB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgd2UgbXVzdCBub3QgYWxsb3cgYWNjZXNzaW5nIGZpbGVzCi0JICAgICBvdXRzaWRlIHRoZSBkZWRpY2F0ZWQgZGlyZWN0b3JpZXMuICAqLwotCSAgaWYgKEVOQUJMRV9TRUNVUkUgJiYgSVNfUEFUSF9XSVRIX0RJUiAoc2luZ2xlX2xvY2FsZSkpCi0JICAgIC8qIEluZ29yZSB0aGlzIGVudHJ5LiAgKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgY3VycmVudCBsb2NhbGUgdmFsdWUgaXMgQyAob3IgUE9TSVgpIHdlIGRvbid0IGxvYWQgYQotCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJDIikgPT0gMAotCSAgfHwgc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiUE9TSVgiKSA9PSAwKQotCWJyZWFrOwotCi0gICAgICAvKiBGaW5kIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgbWF0Y2hpbmcgdGhlCi0JIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZLiAgKi8KLSAgICAgIGRvbWFpbiA9IF9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgc2luZ2xlX2xvY2FsZSwgeGRvbWFpbm5hbWUsIGJpbmRpbmcpOwotCi0gICAgICBpZiAoZG9tYWluICE9IE5VTEwpCi0JewotI2lmIGRlZmluZWQgSU5fTElCR0xPQ0FMRQotCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4sIGJpbmRpbmcsIGVuY29kaW5nLCBtc2dpZDEsICZyZXRsZW4pOwotI2Vsc2UKLQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLCBiaW5kaW5nLCBtc2dpZDEsIDEsICZyZXRsZW4pOwotI2VuZGlmCi0KLQkgIGlmIChyZXR2YWwgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBjbnQ7Ci0KLQkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JCXsKLSNpZiBkZWZpbmVkIElOX0xJQkdMT0NBTEUKLQkJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbi0+c3VjY2Vzc29yW2NudF0sIGJpbmRpbmcsCi0JCQkJCSBlbmNvZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKLSNlbHNlCi0JCSAgcmV0dmFsID0gX25sX2ZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBiaW5kaW5nLAotCQkJCQkgbXNnaWQxLCAxLCAmcmV0bGVuKTsKLSNlbmRpZgotCi0JCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBkb21haW4gPSBkb21haW4tPnN1Y2Nlc3NvcltjbnRdOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJldHVybmluZyAtMSBtZWFucyB0aGF0IHNvbWUgcmVzb3VyY2UgcHJvYmxlbSBleGlzdHMKLQkgICAgIChsaWtlbHkgbWVtb3J5KSBhbmQgdGhhdCB0aGUgc3RyaW5ncyBjb3VsZCBub3QgYmUKLQkgICAgIGNvbnZlcnRlZC4gIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5ncy4gICovCi0JICBpZiAoX19idWlsdGluX2V4cGVjdCAocmV0dmFsID09IChjaGFyICopIC0xLCAwKSkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZvdW5kIHRoZSB0cmFuc2xhdGlvbiBvZiBNU0dJRDEgaW4gZG9tYWluIERPTUFJTjoKLQkJIHN0YXJ0aW5nIGF0IFJFVFZBTCwgUkVUTEVOIGJ5dGVzLiAgKi8KLQkgICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KLQkJICBzaXplX3Qgc2l6ZTsKLQkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKLQotCQkgIHNpemUgPSBvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKQotCQkJICsgbXNnaWRfbGVuICsgZG9tYWlubmFtZV9sZW4gKyAxOwotI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLQkJICBzaXplICs9IHN0cmxlbiAobG9jYWxlbmFtZSkgKyAxOwotI2VuZGlmCi0JCSAgbmV3cCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKSBtYWxsb2MgKHNpemUpOwotCQkgIGlmIChuZXdwICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm5ld19kb21haW5uYW1lOwotI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLQkJICAgICAgY2hhciAqbmV3X2xvY2FsZW5hbWU7Ci0jZW5kaWYKLQotCQkgICAgICBuZXdfZG9tYWlubmFtZSA9Ci0JCQkoY2hhciAqKSBtZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOwotCQkgICAgICBtZW1jcHkgKG5ld19kb21haW5uYW1lLCBkb21haW5uYW1lLCBkb21haW5uYW1lX2xlbiArIDEpOwotI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLQkJICAgICAgbmV3X2xvY2FsZW5hbWUgPSBuZXdfZG9tYWlubmFtZSArIGRvbWFpbm5hbWVfbGVuICsgMTsKLQkJICAgICAgc3RyY3B5IChuZXdfbG9jYWxlbmFtZSwgbG9jYWxlbmFtZSk7Ci0jZW5kaWYKLQkJICAgICAgbmV3cC0+ZG9tYWlubmFtZSA9IG5ld19kb21haW5uYW1lOwotCQkgICAgICBuZXdwLT5jYXRlZ29yeSA9IGNhdGVnb3J5OwotI2lmZGVmIEhBVkVfUEVSX1RIUkVBRF9MT0NBTEUKLQkJICAgICAgbmV3cC0+bG9jYWxlbmFtZSA9IG5ld19sb2NhbGVuYW1lOwotI2VuZGlmCi0jaWZkZWYgSU5fTElCR0xPQ0FMRQotCQkgICAgICBuZXdwLT5lbmNvZGluZyA9IGVuY29kaW5nOwotI2VuZGlmCi0JCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOwotCQkgICAgICBuZXdwLT5kb21haW4gPSBkb21haW47Ci0JCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOwotCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47Ci0KLQkJICAgICAgZ2xfcndsb2NrX3dybG9jayAodHJlZV9sb2NrKTsKLQotCQkgICAgICAvKiBJbnNlcnQgdGhlIGVudHJ5IGluIHRoZSBzZWFyY2ggdHJlZS4gICovCi0JCSAgICAgIGZvdW5kcCA9IChzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqKikKLQkJCXRzZWFyY2ggKG5ld3AsICZyb290LCB0cmFuc2NtcCk7Ci0KLQkJICAgICAgZ2xfcndsb2NrX3VubG9jayAodHJlZV9sb2NrKTsKLQotCQkgICAgICBpZiAoZm91bmRwID09IE5VTEwKLQkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKLQkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KLQkJCWZyZWUgKG5ld3ApOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLwotCQkgICgqZm91bmRwKS0+Y291bnRlciA9IF9ubF9tc2dfY2F0X2NudHI7Ci0JCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47Ci0JCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKLQkJICAoKmZvdW5kcCktPnRyYW5zbGF0aW9uX2xlbmd0aCA9IHJldGxlbjsKLQkJfQotCi0JICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQotCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KLQkgICAgICBpZiAocGx1cmFsKQotCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKLQotCSAgICAgIGdsX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLQkgICAgICByZXR1cm4gcmV0dmFsOwotCSAgICB9Ci0JfQotICAgIH0KLQotIHJldHVybl91bnRyYW5zbGF0ZWQ6Ci0gIC8qIFJldHVybiB0aGUgdW50cmFuc2xhdGVkIE1TR0lELiAgKi8KLSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0jaWZuZGVmIF9MSUJDCi0gIGlmICghRU5BQkxFX1NFQ1VSRSkKLSAgICB7Ci0gICAgICBleHRlcm4gdm9pZCBfbmxfbG9nX3VudHJhbnNsYXRlZCAoY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLAotCQkJCQlpbnQgcGx1cmFsKTsKLSAgICAgIGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lID0gZ2V0ZW52ICgiR0VUVEVYVF9MT0dfVU5UUkFOU0xBVEVEIik7Ci0KLSAgICAgIGlmIChsb2dmaWxlbmFtZSAhPSBOVUxMICYmIGxvZ2ZpbGVuYW1lWzBdICE9ICdcMCcpCi0JX25sX2xvZ191bnRyYW5zbGF0ZWQgKGxvZ2ZpbGVuYW1lLCBkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgcGx1cmFsKTsKLSAgICB9Ci0jZW5kaWYKLSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLSAgcmV0dXJuIChwbHVyYWwgPT0gMAotCSAgPyAoY2hhciAqKSBtc2dpZDEKLQkgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLwotCSAgOiBuID09IDEgPyAoY2hhciAqKSBtc2dpZDEgOiAoY2hhciAqKSBtc2dpZDIpOwotfQotCi0KLS8qIExvb2sgdXAgdGhlIHRyYW5zbGF0aW9uIG9mIG1zZ2lkIHdpdGhpbiBET01BSU5fRklMRSBhbmQgRE9NQUlOQklORElORy4KLSAgIFJldHVybiBpdCBpZiBmb3VuZC4gIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZCBvciBpbiBjYXNlIG9mIGEgY29udmVyc2lvbgotICAgZmFpbHVyZSAocHJvYmxlbSBpbiB0aGUgcGFydGljdWxhciBtZXNzYWdlIGNhdGFsb2cpLiAgUmV0dXJuIChjaGFyICopIC0xCi0gICBpbiBjYXNlIG9mIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBkdXJpbmcgY29udmVyc2lvbiAob25seSBpZgotICAgRU5DT0RJTkcgIT0gTlVMTCByZXNwLiBDT05WRVJUID09IHRydWUpLiAgKi8KLWNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi1fbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCSAgICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICplbmNvZGluZywKLQkgICAgICBjb25zdCBjaGFyICptc2dpZCwKLQkgICAgICBzaXplX3QgKmxlbmd0aHApCi0jZWxzZQotX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywKLQkgICAgICBjb25zdCBjaGFyICptc2dpZCwgaW50IGNvbnZlcnQsCi0JICAgICAgc2l6ZV90ICpsZW5ndGhwKQotI2VuZGlmCi17Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIHNpemVfdCBhY3Q7Ci0gIGNoYXIgKnJlc3VsdDsKLSAgc2l6ZV90IHJlc3VsdGxlbjsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRlY2lkZWQgPD0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nKTsKLQotICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgZG9tYWluX2ZpbGUtPmRhdGE7Ci0KLSAgbnN0cmluZ3MgPSBkb21haW4tPm5zdHJpbmdzOwotCi0gIC8qIExvY2F0ZSB0aGUgTVNHSUQgYW5kIGl0cyB0cmFuc2xhdGlvbi4gICovCi0gIGlmIChkb21haW4tPmhhc2hfdGFiICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVXNlIHRoZSBoYXNoaW5nIHRhYmxlLiAgKi8KLSAgICAgIG5sc191aW50MzIgbGVuID0gc3RybGVuIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGhhc2hfdmFsID0gX19oYXNoX3N0cmluZyAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOwotICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgbmxzX3VpbnQzMiBuc3RyID0KLQkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0KLQkgIGlmIChuc3RyID09IDApCi0JICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgbnN0ci0tOwotCi0JICAvKiBDb21wYXJlIG1zZ2lkIHdpdGggdGhlIG9yaWdpbmFsIHN0cmluZyBhdCBpbmRleCBuc3RyLgotCSAgICAgV2UgY29tcGFyZSB0aGUgbGVuZ3RocyB3aXRoID49LCBub3QgPT0sIGJlY2F1c2UgcGx1cmFsIGVudHJpZXMKLQkgICAgIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmdzIHdpdGggYW4gZW1iZWRkZWQgTlVMLiAgKi8KLQkgIGlmIChuc3RyIDwgbnN0cmluZ3MKLQkgICAgICA/IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHJdLmxlbmd0aCkgPj0gbGVuCi0JCSYmIChzdHJjbXAgKG1zZ2lkLAotCQkJICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHJdLm9mZnNldCkpCi0JCSAgICA9PSAwKQotCSAgICAgIDogZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5sZW5ndGggPiBsZW4KLQkJJiYgKHN0cmNtcCAobXNnaWQsCi0JCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWJbbnN0ciAtIG5zdHJpbmdzXS5wb2ludGVyKQotCQkgICAgPT0gMCkpCi0JICAgIHsKLQkgICAgICBhY3QgPSBuc3RyOwotCSAgICAgIGdvdG8gZm91bmQ7Ci0JICAgIH0KLQotCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0JICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0JICBlbHNlCi0JICAgIGlkeCArPSBpbmNyOwotCX0KLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUcnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkIGFycmF5IG9mCi0JIG1lc3NhZ2VzLiAgKi8KLSAgICAgIHNpemVfdCB0b3AsIGJvdHRvbTsKLQotICAgICAgYm90dG9tID0gMDsKLSAgICAgIHRvcCA9IG5zdHJpbmdzOwotICAgICAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKLQl7Ci0JICBpbnQgY21wX3ZhbDsKLQotCSAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOwotCSAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIChkb21haW4tPmRhdGEKLQkJCQkgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKSk7Ci0JICBpZiAoY21wX3ZhbCA8IDApCi0JICAgIHRvcCA9IGFjdDsKLQkgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQotCSAgICBib3R0b20gPSBhY3QgKyAxOwotCSAgZWxzZQotCSAgICBnb3RvIGZvdW5kOwotCX0KLSAgICAgIC8qIE5vIHRyYW5zbGF0aW9uIHdhcyBmb3VuZC4gICovCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSBmb3VuZDoKLSAgLyogVGhlIHRyYW5zbGF0aW9uIHdhcyBmb3VuZCBhdCBpbmRleCBBQ1QuICBJZiB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlCi0gICAgIHN0cmluZyB0byB1c2UgYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldCwgdGhpcyBpcyB0aGUgdGltZS4gICovCi0gIGlmIChhY3QgPCBuc3RyaW5ncykKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoY2hhciAqKQotCShkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpKTsKLSAgICAgIHJlc3VsdGxlbiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLmxlbmd0aCkgKyAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChjaGFyICopIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ucG9pbnRlcjsKLSAgICAgIHJlc3VsdGxlbiA9IGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYlthY3QgLSBuc3RyaW5nc10ubGVuZ3RoOwotICAgIH0KLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVgotIyBpZmRlZiBJTl9MSUJHTE9DQUxFCi0gIGlmIChlbmNvZGluZyAhPSBOVUxMKQotIyBlbHNlCi0gIGlmIChjb252ZXJ0KQotIyBlbmRpZgotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byBkbyBhIGNvbnZlcnNpb24uICAqLwotIyBpZm5kZWYgSU5fTElCR0xPQ0FMRQotICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBnZXRfb3V0cHV0X2NoYXJzZXQgKGRvbWFpbmJpbmRpbmcpOwotIyBlbmRpZgotICAgICAgc2l6ZV90IG5jb252ZXJzaW9uczsKLSAgICAgIHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluICpjb252ZDsKLSAgICAgIHNpemVfdCBpOwotCi0gICAgICAvKiBQcm90ZWN0IGFnYWluc3QgcmVhbGxvY2F0aW9uIG9mIHRoZSB0YWJsZS4gICovCi0gICAgICBnbF9yd2xvY2tfcmRsb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotCi0gICAgICAvKiBTZWFyY2ggd2hldGhlciBhIHRhYmxlIHdpdGggY29udmVydGVkIHRyYW5zbGF0aW9ucyBmb3IgdGhpcwotCSBlbmNvZGluZyBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZC4gICovCi0gICAgICBuY29udmVyc2lvbnMgPSBkb21haW4tPm5jb252ZXJzaW9uczsKLSAgICAgIGNvbnZkID0gTlVMTDsKLQotICAgICAgZm9yIChpID0gbmNvbnZlcnNpb25zOyBpID4gMDsgKQotCXsKLQkgIGktLTsKLQkgIGlmIChzdHJjbXAgKGRvbWFpbi0+Y29udmVyc2lvbnNbaV0uZW5jb2RpbmcsIGVuY29kaW5nKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY29udmQgPSAmZG9tYWluLT5jb252ZXJzaW9uc1tpXTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLQotICAgICAgaWYgKGNvbnZkID09IE5VTEwpCi0JewotCSAgLyogV2UgaGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBjb252ZXJzaW9ucyB0YWJsZS4gICovCi0JICBnbF9yd2xvY2tfd3Jsb2NrIChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotCi0JICAvKiBNYXliZSBpbiB0aGUgbWVhbnRpbWUgc29tZWJvZHkgYWRkZWQgdGhlIHRyYW5zbGF0aW9uLgotCSAgICAgUmVjaGVjay4gICovCi0JICBmb3IgKGkgPSBuY29udmVyc2lvbnM7IGkgPiAwOyApCi0JICAgIHsKLQkgICAgICBpLS07Ci0JICAgICAgaWYgKHN0cmNtcCAoZG9tYWluLT5jb252ZXJzaW9uc1tpXS5lbmNvZGluZywgZW5jb2RpbmcpID09IDApCi0JCXsKLQkJICBjb252ZCA9ICZkb21haW4tPmNvbnZlcnNpb25zW2ldOwotCQkgIGdvdG8gZm91bmRfY29udmQ7Ci0JCX0KLQkgICAgfQotCi0JICB7Ci0JICAgIC8qIEFsbG9jYXRlIGEgdGFibGUgZm9yIHRoZSBjb252ZXJ0ZWQgdHJhbnNsYXRpb25zIGZvciB0aGlzCi0JICAgICAgIGVuY29kaW5nLiAgKi8KLQkgICAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKm5ld19jb252ZXJzaW9ucyA9Ci0JICAgICAgKHN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluICopCi0JICAgICAgKGRvbWFpbi0+Y29udmVyc2lvbnMgIT0gTlVMTAotCSAgICAgICA/IHJlYWxsb2MgKGRvbWFpbi0+Y29udmVyc2lvbnMsCi0JCQkgIChuY29udmVyc2lvbnMgKyAxKSAqIHNpemVvZiAoc3RydWN0IGNvbnZlcnRlZF9kb21haW4pKQotCSAgICAgICA6IG1hbGxvYyAoKG5jb252ZXJzaW9ucyArIDEpICogc2l6ZW9mIChzdHJ1Y3QgY29udmVydGVkX2RvbWFpbikpKTsKLQotCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2NvbnZlcnNpb25zID09IE5VTEwsIDApKQotCSAgICAgIHsKLQkJLyogTm90aGluZyB3ZSBjYW4gZG8sIG5vIG1vcmUgbWVtb3J5LiAgV2UgY2Fubm90IHVzZSB0aGUKLQkJICAgdHJhbnNsYXRpb24gYmVjYXVzZSBpdCBtaWdodCBiZSBlbmNvZGVkIGluY29ycmVjdGx5LiAgKi8KLQkgICAgICB1bmxvY2tfZmFpbDoKLQkJZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLQkJcmV0dXJuIChjaGFyICopIC0xOwotCSAgICAgIH0KLQotCSAgICBkb21haW4tPmNvbnZlcnNpb25zID0gbmV3X2NvbnZlcnNpb25zOwotCi0JICAgIC8qIENvcHkgdGhlICdlbmNvZGluZycgc3RyaW5nIHRvIHBlcm1hbmVudCBzdG9yYWdlLiAgKi8KLQkgICAgZW5jb2RpbmcgPSBzdHJkdXAgKGVuY29kaW5nKTsKLQkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGVuY29kaW5nID09IE5VTEwsIDApKQotCSAgICAgIC8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gIFdlIGNhbm5vdCB1c2UgdGhlCi0JCSB0cmFuc2xhdGlvbiBiZWNhdXNlIGl0IG1pZ2h0IGJlIGVuY29kZWQgaW5jb3JyZWN0bHkuICAqLwotCSAgICAgIGdvdG8gdW5sb2NrX2ZhaWw7Ci0KLQkgICAgY29udmQgPSAmbmV3X2NvbnZlcnNpb25zW25jb252ZXJzaW9uc107Ci0JICAgIGNvbnZkLT5lbmNvZGluZyA9IGVuY29kaW5nOwotCi0JICAgIC8qIEZpbmQgb3V0IGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aC4KLQkgICAgICAgVGhpcyBjYW4gYmUgZm91bmQgKGluIHRleHR1YWwgZm9ybSkgaW4gdGhlIGVudHJ5ICIiLiAgSWYgdGhpcwotCSAgICAgICBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlICdjaGFyc2V0PScKLQkgICAgICAgaW5mb3JtYXRpb24sIHdlIHdpbGwgYXNzdW1lIHRoZSBjaGFyc2V0IG1hdGNoZXMgdGhlIG9uZSB0aGUKLQkgICAgICAgY3VycmVudCBsb2NhbGUgYW5kIHdlIGRvbid0IGhhdmUgdG8gcGVyZm9ybSBhbnkgY29udmVyc2lvbi4gICovCi0jIGlmZGVmIF9MSUJDCi0JICAgIGNvbnZkLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7Ci0jIGVsc2UKLSMgIGlmIEhBVkVfSUNPTlYKLQkgICAgY29udmQtPmNvbnYgPSAoaWNvbnZfdCkgLTE7Ci0jICBlbmRpZgotIyBlbmRpZgotCSAgICB7Ci0JICAgICAgY2hhciAqbnVsbGVudHJ5OwotCSAgICAgIHNpemVfdCBudWxsZW50cnlsZW47Ci0KLQkgICAgICAvKiBHZXQgdGhlIGhlYWRlciBlbnRyeS4gIFRoaXMgaXMgYSByZWN1cnNpb24sIGJ1dCBpdCBkb2Vzbid0Ci0JCSByZWFsbG9jYXRlIGRvbWFpbi0+Y29udmVyc2lvbnMgYmVjYXVzZSB3ZSBwYXNzCi0JCSBlbmNvZGluZyA9IE5VTEwgb3IgY29udmVydCA9IDAsIHJlc3BlY3RpdmVseS4gICovCi0JICAgICAgbnVsbGVudHJ5ID0KLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotCQlfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCBOVUxMLCAiIiwKLQkJCSAgICAgICZudWxsZW50cnlsZW4pOwotIyBlbHNlCi0JCV9ubF9maW5kX21zZyAoZG9tYWluX2ZpbGUsIGRvbWFpbmJpbmRpbmcsICIiLCAwLCAmbnVsbGVudHJ5bGVuKTsKLSMgZW5kaWYKLQotCSAgICAgIGlmIChudWxsZW50cnkgIT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKmNoYXJzZXRzdHI7Ci0KLQkJICBjaGFyc2V0c3RyID0gc3Ryc3RyIChudWxsZW50cnksICJjaGFyc2V0PSIpOwotCQkgIGlmIChjaGFyc2V0c3RyICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBsZW47Ci0JCSAgICAgIGNoYXIgKmNoYXJzZXQ7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKm91dGNoYXJzZXQ7Ci0KLQkJICAgICAgY2hhcnNldHN0ciArPSBzdHJsZW4gKCJjaGFyc2V0PSIpOwotCQkgICAgICBsZW4gPSBzdHJjc3BuIChjaGFyc2V0c3RyLCAiIFx0XG4iKTsKLQotCQkgICAgICBjaGFyc2V0ID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKLSMgaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX01FTVBDUFkKLQkJICAgICAgKigoY2hhciAqKSBtZW1wY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pKSA9ICdcMCc7Ci0jIGVsc2UKLQkJICAgICAgbWVtY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pOwotCQkgICAgICBjaGFyc2V0W2xlbl0gPSAnXDAnOwotIyBlbmRpZgotCi0JCSAgICAgIG91dGNoYXJzZXQgPSBlbmNvZGluZzsKLQotIyBpZmRlZiBfTElCQwotCQkgICAgICAvKiBXZSBhbHdheXMgd2FudCB0byB1c2UgdHJhbnNsaXRlcmF0aW9uLiAgKi8KLQkJICAgICAgb3V0Y2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKG91dGNoYXJzZXQsICJUUkFOU0xJVCIpOwotCQkgICAgICBjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAoY2hhcnNldCwgIiIpOwotCQkgICAgICBpbnQgciA9IF9fZ2NvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCwgJmNvbnZkLT5jb252LAotCQkJCQkgICAgR0NPTlZfQVZPSURfTk9DT05WKTsKLQkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHIgIT0gX19HQ09OVl9PSywgMCkpCi0JCQl7Ci0JCQkgIC8qIElmIHRoZSBvdXRwdXQgZW5jb2RpbmcgaXMgdGhlIHNhbWUgdGhlcmUgaXMKLQkJCSAgICAgbm90aGluZyB0byBkby4gIE90aGVyd2lzZSBkbyBub3QgdXNlIHRoZQotCQkJICAgICB0cmFuc2xhdGlvbiBhdCBhbGwuICAqLwotCQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAociAhPSBfX0dDT05WX05VTENPTlYsIDEpKQotCQkJICAgIHsKLQkJCSAgICAgIGdsX3J3bG9ja191bmxvY2sgKGRvbWFpbi0+Y29udmVyc2lvbnNfbG9jayk7Ci0JCQkgICAgICBmcmVlICgoY2hhciAqKSBlbmNvZGluZyk7Ci0JCQkgICAgICByZXR1cm4gTlVMTDsKLQkJCSAgICB9Ci0KLQkJCSAgY29udmQtPmNvbnYgPSAoX19nY29udl90KSAtMTsKLQkJCX0KLSMgZWxzZQotIyAgaWYgSEFWRV9JQ09OVgotCQkgICAgICAvKiBXaGVuIHVzaW5nIEdOVSBsaWJjID49IDIuMiBvciBHTlUgbGliaWNvbnYgPj0gMS41LAotCQkJIHdlIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCi0jICAgaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSB8fCBfX0dMSUJDX18gPiAyIFwKLSAgICAgICB8fCBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDUKLQkJICAgICAgaWYgKHN0cmNociAob3V0Y2hhcnNldCwgJy8nKSA9PSBOVUxMKQotCQkJewotCQkJICBjaGFyICp0bXA7Ci0KLQkJCSAgbGVuID0gc3RybGVuIChvdXRjaGFyc2V0KTsKLQkJCSAgdG1wID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxMCArIDEpOwotCQkJICBtZW1jcHkgKHRtcCwgb3V0Y2hhcnNldCwgbGVuKTsKLQkJCSAgbWVtY3B5ICh0bXAgKyBsZW4sICIvL1RSQU5TTElUIiwgMTAgKyAxKTsKLQkJCSAgb3V0Y2hhcnNldCA9IHRtcDsKLQotCQkJICBjb252ZC0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOwotCi0JCQkgIGZyZWVhIChvdXRjaGFyc2V0KTsKLQkJCX0KLQkJICAgICAgZWxzZQotIyAgIGVuZGlmCi0JCQljb252ZC0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOwotIyAgZW5kaWYKLSMgZW5kaWYKLQotCQkgICAgICBmcmVlYSAoY2hhcnNldCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgICBjb252ZC0+Y29udl90YWIgPSBOVUxMOwotCSAgICAvKiBIZXJlIGRvbWFpbi0+Y29udmVyc2lvbnMgaXMgc3RpbGwgPT0gbmV3X2NvbnZlcnNpb25zLiAgKi8KLQkgICAgZG9tYWluLT5uY29udmVyc2lvbnMrKzsKLQkgIH0KLQotCWZvdW5kX2NvbnZkOgotCSAgZ2xfcndsb2NrX3VubG9jayAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLQl9Ci0KLSAgICAgIGlmICgKLSMgaWZkZWYgX0xJQkMKLQkgIGNvbnZkLT5jb252ICE9IChfX2djb252X3QpIC0xCi0jIGVsc2UKLSMgIGlmIEhBVkVfSUNPTlYKLQkgIGNvbnZkLT5jb252ICE9IChpY29udl90KSAtMQotIyAgZW5kaWYKLSMgZW5kaWYKLQkgICkKLQl7Ci0JICAvKiBXZSBhcmUgc3VwcG9zZWQgdG8gZG8gYSBjb252ZXJzaW9uLiAgRmlyc3QgYWxsb2NhdGUgYW4KLQkgICAgIGFwcHJvcHJpYXRlIHRhYmxlIHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSB0YWJsZQotCSAgICAgb2YgdHJhbnNsYXRpb25zIGluIHRoZSBmaWxlLCB3aGVyZSB3ZSBjYW4gcHV0IHRoZSBwb2ludGVycwotCSAgICAgdG8gdGhlIGNvbnZlcnRlZCBzdHJpbmdzIGluLgotCSAgICAgVGhlcmUgaXMgYSBzbGlnaHQgY29tcGxpY2F0aW9uIHdpdGggcGx1cmFsIGVudHJpZXMuICBUaGV5Ci0JICAgICBhcmUgcmVwcmVzZW50ZWQgYnkgY29uc2VjdXRpdmUgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncy4gIFdlCi0JICAgICBoYW5kbGUgdGhpcyBjYXNlIGJ5IGNvbnZlcnRpbmcgUkVTVUxUTEVOIGJ5dGVzLCBpbmNsdWRpbmcKLQkgICAgIE5VTHMuICAqLwotCi0JICBpZiAoY29udmQtPmNvbnZfdGFiID09IE5VTEwKLQkgICAgICAmJiAoKGNvbnZkLT5jb252X3RhYiA9Ci0JCSAgICAoY2hhciAqKikgY2FsbG9jIChuc3RyaW5ncyArIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncywKLQkJCQkgICAgICBzaXplb2YgKGNoYXIgKikpKQotCQkgID09IE5VTEwpKQotCSAgICAvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KLQkgICAgY29udmQtPmNvbnZfdGFiID0gKGNoYXIgKiopIC0xOwotCi0JICBpZiAoX19idWlsdGluX2V4cGVjdCAoY29udmQtPmNvbnZfdGFiID09IChjaGFyICoqKSAtMSwgMCkpCi0JICAgIC8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gIFdlIGNhbm5vdCB1c2UgdGhlCi0JICAgICAgIHRyYW5zbGF0aW9uIGJlY2F1c2UgaXQgbWlnaHQgYmUgZW5jb2RlZCBpbmNvcnJlY3RseS4gICovCi0JICAgIHJldHVybiAoY2hhciAqKSAtMTsKLQotCSAgaWYgKGNvbnZkLT5jb252X3RhYlthY3RdID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKLQkJIHRyYW5zbGF0ZWQgeWV0LiAgRG8gdGhpcyBub3cuICAqLwotCSAgICAgIC8qIFdlIHVzZSBhIGJpdCBtb3JlIGVmZmljaWVudCBtZW1vcnkgaGFuZGxpbmcuCi0JCSBXZSBhbGxvY2F0ZSBhbHdheXMgbGFyZ2VyIGJsb2NrcyB3aGljaCBnZXQgdXNlZCBvdmVyCi0JCSB0aW1lLiAgVGhpcyBpcyBmYXN0ZXIgdGhhbiBtYW55IHNtYWxsIGFsbG9jYXRpb25zLiAgICovCi0JICAgICAgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCi0jIGRlZmluZSBJTklUSUFMX0JMT0NLX1NJWkUJNDA4MAotCSAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmcmVlbWVtOwotCSAgICAgIHN0YXRpYyBzaXplX3QgZnJlZW1lbV9zaXplOwotCi0JICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWY7Ci0JICAgICAgdW5zaWduZWQgY2hhciAqb3V0YnVmOwotCSAgICAgIGludCBtYWxsb2NfY291bnQ7Ci0jIGlmbmRlZiBfTElCQwotCSAgICAgIHRyYW5zbWVtX2Jsb2NrX3QgKnRyYW5zbWVtX2xpc3QgPSBOVUxMOwotIyBlbmRpZgotCi0JICAgICAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0KLQkgICAgICBpbmJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJlc3VsdDsKLQkgICAgICBvdXRidWYgPSBmcmVlbWVtICsgc2l6ZW9mIChzaXplX3QpOwotCi0JICAgICAgbWFsbG9jX2NvdW50ID0gMDsKLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIHRyYW5zbWVtX2Jsb2NrX3QgKm5ld21lbTsKLSMgaWZkZWYgX0xJQkMKLQkJICBzaXplX3Qgbm9uX3JldmVyc2libGU7Ci0JCSAgaW50IHJlczsKLQotCQkgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCi0JCSAgICBnb3RvIHJlc2l6ZV9mcmVlbWVtOwotCi0JCSAgcmVzID0gX19nY29udiAoY29udmQtPmNvbnYsCi0JCQkJICZpbmJ1ZiwgaW5idWYgKyByZXN1bHRsZW4sCi0JCQkJICZvdXRidWYsCi0JCQkJIG91dGJ1ZiArIGZyZWVtZW1fc2l6ZSAtIHNpemVvZiAoc2l6ZV90KSwKLQkJCQkgJm5vbl9yZXZlcnNpYmxlKTsKLQotCQkgIGlmIChyZXMgPT0gX19HQ09OVl9PSyB8fCByZXMgPT0gX19HQ09OVl9FTVBUWV9JTlBVVCkKLQkJICAgIGJyZWFrOwotCi0JCSAgaWYgKHJlcyAhPSBfX0dDT05WX0ZVTExfT1VUUFVUKQotCQkgICAgewotCQkgICAgICAvKiBXZSBzaG91bGQgbm90IHVzZSB0aGUgdHJhbnNsYXRpb24gYXQgYWxsLCBpdAotCQkJIGlzIGluY29ycmVjdGx5IGVuY29kZWQuICAqLwotCQkgICAgICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotCQkgICAgICByZXR1cm4gTlVMTDsKLQkJICAgIH0KLQotCQkgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OwotIyBlbHNlCi0jICBpZiBIQVZFX0lDT05WCi0JCSAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKLQkJICBzaXplX3QgaW5sZWZ0ID0gcmVzdWx0bGVuOwotCQkgIGNoYXIgKm91dHB0ciA9IChjaGFyICopIG91dGJ1ZjsKLQkJICBzaXplX3Qgb3V0bGVmdDsKLQotCQkgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCi0JCSAgICBnb3RvIHJlc2l6ZV9mcmVlbWVtOwotCi0JCSAgb3V0bGVmdCA9IGZyZWVtZW1fc2l6ZSAtIHNpemVvZiAoc2l6ZV90KTsKLQkJICBpZiAoaWNvbnYgKGNvbnZkLT5jb252LAotCQkJICAgICAoSUNPTlZfQ09OU1QgY2hhciAqKikgJmlucHRyLCAmaW5sZWZ0LAotCQkJICAgICAmb3V0cHRyLCAmb3V0bGVmdCkKLQkJICAgICAgIT0gKHNpemVfdCkgKC0xKSkKLQkJICAgIHsKLQkJICAgICAgb3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKikgb3V0cHRyOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBpZiAoZXJybm8gIT0gRTJCSUcpCi0JCSAgICB7Ci0JCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0JCSAgICAgIHJldHVybiBOVUxMOwotCQkgICAgfQotIyAgZW5kaWYKLSMgZW5kaWYKLQotCQlyZXNpemVfZnJlZW1lbToKLQkJICAvKiBXZSBtdXN0IGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvciByZXNpemUgdGhlIG9sZCBvbmUuICAqLwotCQkgIGlmIChtYWxsb2NfY291bnQgPiAwKQotCQkgICAgewotCQkgICAgICArK21hbGxvY19jb3VudDsKLQkJICAgICAgZnJlZW1lbV9zaXplID0gbWFsbG9jX2NvdW50ICogSU5JVElBTF9CTE9DS19TSVpFOwotCQkgICAgICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSByZWFsbG9jICh0cmFuc21lbV9saXN0LAotCQkJCQkJCSAgICAgZnJlZW1lbV9zaXplKTsKLSMgaWZkZWYgX0xJQkMKLQkJICAgICAgaWYgKG5ld21lbSAhPSBOVUxMKQotCQkJdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IHRyYW5zbWVtX2xpc3QgKm9sZCA9IHRyYW5zbWVtX2xpc3Q7Ci0KLQkJCSAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7Ci0JCQkgIGZyZWUgKG9sZCk7Ci0JCQl9Ci0jIGVuZGlmCi0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtYWxsb2NfY291bnQgPSAxOwotCQkgICAgICBmcmVlbWVtX3NpemUgPSBJTklUSUFMX0JMT0NLX1NJWkU7Ci0JCSAgICAgIG5ld21lbSA9ICh0cmFuc21lbV9ibG9ja190ICopIG1hbGxvYyAoZnJlZW1lbV9zaXplKTsKLQkJICAgIH0KLQkJICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQotCQkgICAgewotCQkgICAgICBmcmVlbWVtID0gTlVMTDsKLQkJICAgICAgZnJlZW1lbV9zaXplID0gMDsKLQkJICAgICAgX19saWJjX2xvY2tfdW5sb2NrIChsb2NrKTsKLQkJICAgICAgcmV0dXJuIChjaGFyICopIC0xOwotCQkgICAgfQotCi0jIGlmZGVmIF9MSUJDCi0JCSAgLyogQWRkIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBibG9ja3Mgd2UgaGF2ZSB0byBmcmVlCi0JCSAgICAgYXQgc29tZSBwb2ludC4gICovCi0JCSAgbmV3bWVtLT5uZXh0ID0gdHJhbnNtZW1fbGlzdDsKLQkJICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOwotCi0JCSAgZnJlZW1lbSA9ICh1bnNpZ25lZCBjaGFyICopIG5ld21lbS0+ZGF0YTsKLQkJICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKLSMgZWxzZQotCQkgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07Ci0JCSAgZnJlZW1lbSA9IG5ld21lbTsKLSMgZW5kaWYKLQotCQkgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7Ci0JCX0KLQotCSAgICAgIC8qIFdlIGhhdmUgbm93IGluIG91ciBidWZmZXIgYSBjb252ZXJ0ZWQgc3RyaW5nLiAgUHV0IHRoaXMKLQkJIGludG8gdGhlIHRhYmxlIG9mIGNvbnZlcnNpb25zLiAgKi8KLQkgICAgICAqKHNpemVfdCAqKSBmcmVlbWVtID0gb3V0YnVmIC0gZnJlZW1lbSAtIHNpemVvZiAoc2l6ZV90KTsKLQkgICAgICBjb252ZC0+Y29udl90YWJbYWN0XSA9IChjaGFyICopIGZyZWVtZW07Ci0JICAgICAgLyogU2hyaW5rIGZyZWVtZW0sIGJ1dCBrZWVwIGl0IGFsaWduZWQuICAqLwotCSAgICAgIGZyZWVtZW1fc2l6ZSAtPSBvdXRidWYgLSBmcmVlbWVtOwotCSAgICAgIGZyZWVtZW0gPSBvdXRidWY7Ci0JICAgICAgZnJlZW1lbSArPSBmcmVlbWVtX3NpemUgJiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOwotCSAgICAgIGZyZWVtZW1fc2l6ZSA9IGZyZWVtZW1fc2l6ZSAmIH4gKGFsaWdub2YgKHNpemVfdCkgLSAxKTsKLQotCSAgICAgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0JICAgIH0KLQotCSAgLyogTm93IGNvbnZkLT5jb252X3RhYlthY3RdIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBvZiBhbGwKLQkgICAgIHRoZSBwbHVyYWwgdmFyaWFudHMuICAqLwotCSAgcmVzdWx0ID0gY29udmQtPmNvbnZfdGFiW2FjdF0gKyBzaXplb2YgKHNpemVfdCk7Ci0JICByZXN1bHRsZW4gPSAqKHNpemVfdCAqKSBjb252ZC0+Y29udl90YWJbYWN0XTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSByZXN1bHQgc3RyaW5nIGlzIGNvbnZlcnRlZC4gICovCi0KLSNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCi0KLSAgKmxlbmd0aHAgPSByZXN1bHRsZW47Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogTG9vayB1cCBhIHBsdXJhbCB2YXJpYW50LiAgKi8KLXN0YXRpYyBjaGFyICoKLWludGVybmFsX2Z1bmN0aW9uCi1wbHVyYWxfbG9va3VwIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW50IG4sCi0JICAgICAgIGNvbnN0IGNoYXIgKnRyYW5zbGF0aW9uLCBzaXplX3QgdHJhbnNsYXRpb25fbGVuKQotewotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluZGF0YSA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW4tPmRhdGE7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGluZGV4OwotICBjb25zdCBjaGFyICpwOwotCi0gIGluZGV4ID0gcGx1cmFsX2V2YWwgKGRvbWFpbmRhdGEtPnBsdXJhbCwgbik7Ci0gIGlmIChpbmRleCA+PSBkb21haW5kYXRhLT5ucGx1cmFscykKLSAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICBJdCBtZWFucyB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHRoZQotICAgICAgIGdpdmVuIG1heGltdW0gdmFsdWUgZG8gbm90IG1hdGNoLiAgKi8KLSAgICBpbmRleCA9IDA7Ci0KLSAgLyogU2tpcCBJTkRFWCBzdHJpbmdzIGF0IFRSQU5TTEFUSU9OLiAgKi8KLSAgcCA9IHRyYW5zbGF0aW9uOwotICB3aGlsZSAoaW5kZXgtLSA+IDApCi0gICAgewotI2lmZGVmIF9MSUJDCi0gICAgICBwID0gX19yYXdtZW1jaHIgKHAsICdcMCcpOwotI2Vsc2UKLSAgICAgIHAgPSBzdHJjaHIgKHAsICdcMCcpOwotI2VuZGlmCi0gICAgICAvKiBBbmQgc2tpcCBvdmVyIHRoZSBOVUwgYnl0ZS4gICovCi0gICAgICBwKys7Ci0KLSAgICAgIGlmIChwID49IHRyYW5zbGF0aW9uICsgdHJhbnNsYXRpb25fbGVuKQotCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbgotCSAgIGV2YWx1YXRlZCB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdmFyaWFudHMKLQkgICBhdmFpbGFibGUgZm9yIE1TR0lEMS4gICovCi0JcmV0dXJuIChjaGFyICopIHRyYW5zbGF0aW9uOwotICAgIH0KLSAgcmV0dXJuIChjaGFyICopIHA7Ci19Ci0KLSNpZm5kZWYgX0xJQkMKLS8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWludGVybmFsX2Z1bmN0aW9uCi1jYXRlZ29yeV90b19uYW1lIChpbnQgY2F0ZWdvcnkpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICB7Ci0jaWZkZWYgTENfQ09MTEFURQotICBjYXNlIExDX0NPTExBVEU6Ci0gICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQ1RZUEUKLSAgY2FzZSBMQ19DVFlQRToKLSAgICByZXR2YWwgPSAiTENfQ1RZUEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTU9ORVRBUlkKLSAgY2FzZSBMQ19NT05FVEFSWToKLSAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTlVNRVJJQwotICBjYXNlIExDX05VTUVSSUM6Ci0gICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfVElNRQotICBjYXNlIExDX1RJTUU6Ci0gICAgcmV0dmFsID0gIkxDX1RJTUUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTUVTU0FHRVMKLSAgY2FzZSBMQ19NRVNTQUdFUzoKLSAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfUkVTUE9OU0UKLSAgY2FzZSBMQ19SRVNQT05TRToKLSAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQUxMCi0gIGNhc2UgTENfQUxMOgotICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCi0gICAgICAgdmFsdWUuICAqLwotICAgIHJldHZhbCA9ICJMQ19BTEwiOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KLSAgICByZXR2YWwgPSAiTENfWFhYIjsKLSAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKLQotLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gICBvciBzeXN0ZW0tZGVwZW5kZW50IGRlZmF1bHRzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWludGVybmFsX2Z1bmN0aW9uCi0jaWZkZWYgSU5fTElCR0xPQ0FMRQotZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lLAotCQkgICAgICBjb25zdCBjaGFyICpsb2NhbGUpCi0KLSNlbHNlCi1ndWVzc19jYXRlZ29yeV92YWx1ZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCi0jZW5kaWYKLXsKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0jaWZuZGVmIElOX0xJQkdMT0NBTEUKLSAgY29uc3QgY2hhciAqbG9jYWxlOwotIyBpZm5kZWYgX0xJQkMKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2VfZGVmYXVsdDsKLSAgaW50IGxvY2FsZV9kZWZhdWx0ZWQ7Ci0jIGVuZGlmCi0jZW5kaWYKLQotICAvKiBXZSB1c2UgdGhlIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gICAgIDEuIFRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ0xBTkdVQUdFJy4gIFRoaXMgaXMgYSBHTlUKLSAgICAgICAgZXh0ZW5zaW9uLiAgSXRzIHZhbHVlIGNhbiBiZSBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2FsZSBuYW1lcy4KLSAgICAgMi4gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnTENfQUxMJywgJ0xDX3h4eCcsIG9yICdMQU5HJy4KLSAgICAgICAgTW9yZSBwcmVjaXNlbHksIHRoZSBmaXJzdCBhbW9uZyB0aGVzZSB0aGF0IGlzIHNldCB0byBhIG5vbi1lbXB0eSB2YWx1ZS4KLSAgICAgICAgVGhpcyBpcyBob3cgUE9TSVggc3BlY2lmaWVzIGl0LiAgVGhlIHZhbHVlIGlzIGEgc2luZ2xlIGxvY2FsZSBuYW1lLgotICAgICAzLiBBIHN5c3RlbS1kZXBlbmRlbnQgcHJlZmVyZW5jZSBsaXN0IG9mIGxhbmd1YWdlcy4gIEl0cyB2YWx1ZSBjYW4gYmUgYQotICAgICAgICBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGUgbmFtZXMuCi0gICAgIDQuIEEgc3lzdGVtLWRlcGVuZGVudCBkZWZhdWx0IGxvY2FsZSBuYW1lLgotICAgICBUaGlzIHdheToKLSAgICAgICAtIFN5c3RlbS1kZXBlbmRlbnQgc2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotICAgICAgIC0gSWYgdGhlIHN5c3RlbSBwcm92aWRlcyBib3RoIGEgbGlzdCBvZiBsYW5ndWFnZXMgYW5kIGEgZGVmYXVsdCBsb2NhbGUsCi0gICAgICAgICB0aGUgZm9ybWVyIGlzIHVzZWQuICAqLwotCi0jaWZuZGVmIElOX0xJQkdMT0NBTEUKLSAgLyogRmV0Y2ggdGhlIGxvY2FsZSBuYW1lLCB0aHJvdWdoIHRoZSBQT1NJWCBtZXRob2Qgb2YgbG9va2luZyB0byBgTENfQUxMJywKLSAgICAgYExDX3h4eCcsIGFuZCBgTEFORycuICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUKLSAgICAgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLSMgaWZkZWYgX0xJQkMKLSAgbG9jYWxlID0gX19jdXJyZW50X2xvY2FsZV9uYW1lIChjYXRlZ29yeSk7Ci0jIGVsc2UKLSMgIGlmIEhBVkVfU1RSVUNUX19fTE9DQUxFX1NUUlVDVF9fX05BTUVTICYmIGRlZmluZWQgVVNFX0lOX0dFVFRFWFRfVEVTVFMKLSAgLyogVGhlIF9fbmFtZXMgZmllbGQgaXMgbm90IHB1YmxpYyBnbGliYyBBUEkgYW5kIG11c3QgdGhlcmVmb3JlIG5vdCBiZSB1c2VkCi0gICAgIGluIGNvZGUgdGhhdCBpcyBpbnN0YWxsZWQgaW4gcHVibGljIGxvY2F0aW9ucy4gICovCi0gIGxvY2FsZV90IHRocmVhZF9sb2NhbGUgPSB1c2Vsb2NhbGUgKE5VTEwpOwotICBpZiAodGhyZWFkX2xvY2FsZSAhPSBMQ19HTE9CQUxfTE9DQUxFKQotICAgIHsKLSAgICAgIGxvY2FsZSA9IHRocmVhZF9sb2NhbGUtPl9fbmFtZXNbY2F0ZWdvcnldOwotICAgICAgbG9jYWxlX2RlZmF1bHRlZCA9IDA7Ci0gICAgfQotICBlbHNlCi0jICBlbmRpZgotICAgIHsKLSAgICAgIGxvY2FsZSA9IF9ubF9sb2NhbGVfbmFtZV9wb3NpeCAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0gICAgICBsb2NhbGVfZGVmYXVsdGVkID0gMDsKLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLQl7Ci0JICBsb2NhbGUgPSBfbmxfbG9jYWxlX25hbWVfZGVmYXVsdCAoKTsKLQkgIGxvY2FsZV9kZWZhdWx0ZWQgPSAxOwotCX0KLSAgICB9Ci0jIGVuZGlmCi0jZW5kaWYKLQotICAvKiBJZ25vcmUgTEFOR1VBR0UgYW5kIGl0cyBzeXN0ZW0tZGVwZW5kZW50IGFuYWxvZ29uIGlmIHRoZSBsb2NhbGUgaXMgc2V0Ci0gICAgIHRvICJDIiBiZWNhdXNlCi0gICAgIDEuICJDIiBsb2NhbGUgdXN1YWxseSB1c2VzIHRoZSBBU0NJSSBlbmNvZGluZywgYW5kIG1vc3QgaW50ZXJuYXRpb25hbAotCW1lc3NhZ2VzIHVzZSBub24tQVNDSUkgY2hhcmFjdGVycy4gVGhlc2UgY2hhcmFjdGVycyBnZXQgZGlzcGxheWVkCi0JYXMgcXVlc3Rpb24gbWFya3MgKGlmIHVzaW5nIGdsaWJjJ3MgaWNvbnYoKSkgb3IgYXMgaW52YWxpZCA4LWJpdAotCWNoYXJhY3RlcnMgKGJlY2F1c2Ugb3RoZXIgaWNvbnYoKXMgcmVmdXNlIHRvIGNvbnZlcnQgbW9zdCBub24tQVNDSUkKLQljaGFyYWN0ZXJzIHRvIEFTQ0lJKS4gSW4gYW55IGNhc2UsIHRoZSBvdXRwdXQgaXMgdWdseS4KLSAgICAgMi4gVGhlIHByZWNpc2Ugb3V0cHV0IG9mIHNvbWUgcHJvZ3JhbXMgaW4gdGhlICJDIiBsb2NhbGUgaXMgc3BlY2lmaWVkCi0JYnkgUE9TSVggYW5kIHNob3VsZCBub3QgZGVwZW5kIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBsaWtlCi0JIkxBTkdVQUdFIiBvciBzeXN0ZW0tZGVwZW5kZW50IGluZm9ybWF0aW9uLiAgV2UgYWxsb3cgc3VjaCBwcm9ncmFtcwotICAgICAgICB0byB1c2UgZ2V0dGV4dCgpLiAgKi8KLSAgaWYgKHN0cmNtcCAobG9jYWxlLCAiQyIpID09IDApCi0gICAgcmV0dXJuIGxvY2FsZTsKLQotICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlICdMQU5HVUFHRScgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGUuICAqLwotICBsYW5ndWFnZSA9IGdldGVudiAoIkxBTkdVQUdFIik7Ci0gIGlmIChsYW5ndWFnZSAhPSBOVUxMICYmIGxhbmd1YWdlWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIGxhbmd1YWdlOwotI2lmICFkZWZpbmVkIElOX0xJQkdMT0NBTEUgJiYgIWRlZmluZWQgX0xJQkMKLSAgLyogVGhlIG5leHQgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGxvY2FsZSBuYW1lLCBpZiBub3QgZGVmYXVsdGVkLiAgKi8KLSAgaWYgKGxvY2FsZV9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgLyogVGhlIG5leHQgcHJpb3JpdHkgdmFsdWUgaXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgcHJlZmVyZW5jZXMgbGlzdC4gKi8KLSAgICAgIGxhbmd1YWdlX2RlZmF1bHQgPSBfbmxfbGFuZ3VhZ2VfcHJlZmVyZW5jZXNfZGVmYXVsdCAoKTsKLSAgICAgIGlmIChsYW5ndWFnZV9kZWZhdWx0ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBsYW5ndWFnZV9kZWZhdWx0OwotICAgIH0KLSAgLyogVGhlIGxlYXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBsb2NhbGUgbmFtZSwgaWYgZGVmYXVsdGVkLiAgKi8KLSNlbmRpZgotICByZXR1cm4gbG9jYWxlOwotfQotCi0jaWYgKGRlZmluZWQgX0xJQkMgfHwgSEFWRV9JQ09OVikgJiYgIWRlZmluZWQgSU5fTElCR0xPQ0FMRQotLyogUmV0dXJucyB0aGUgb3V0cHV0IGNoYXJzZXQuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotaW50ZXJuYWxfZnVuY3Rpb24KLWdldF9vdXRwdXRfY2hhcnNldCAoc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi17Ci0gIC8qIFRoZSBvdXRwdXQgY2hhcnNldCBzaG91bGQgbm9ybWFsbHkgYmUgZGV0ZXJtaW5lZCBieSB0aGUgbG9jYWxlLiAgQnV0Ci0gICAgIHNvbWV0aW1lcyB0aGUgbG9jYWxlIGlzIG5vdCB1c2VkIG9yIG5vdCBjb3JyZWN0bHkgc2V0IHVwLCBzbyB3ZSBwcm92aWRlCi0gICAgIGEgcG9zc2liaWxpdHkgZm9yIHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoaXM6IHRoZSBPVVRQVVRfQ0hBUlNFVAotICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIE1vcmVvdmVyLCB0aGUgdmFsdWUgc3BlY2lmaWVkIHRocm91Z2gKLSAgICAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgb3ZlcnJpZGVzIGJvdGguICAqLwotICBpZiAoZG9tYWluYmluZGluZyAhPSBOVUxMICYmIGRvbWFpbmJpbmRpbmctPmNvZGVzZXQgIT0gTlVMTCkKLSAgICByZXR1cm4gZG9tYWluYmluZGluZy0+Y29kZXNldDsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBzcGVlZCByZWFzb25zLCB3ZSBsb29rIGF0IHRoZSB2YWx1ZSBvZiBPVVRQVVRfQ0hBUlNFVCBvbmx5Ci0JIG9uY2UuICBUaGlzIGlzIGEgdXNlciB2YXJpYWJsZSB0aGF0IGlzIG5vdCBzdXBwb3NlZCB0byBjaGFuZ2UKLQkgZHVyaW5nIGEgcHJvZ3JhbSBydW4uICAqLwotICAgICAgc3RhdGljIGNoYXIgKm91dHB1dF9jaGFyc2V0X2NhY2hlOwotICAgICAgc3RhdGljIGludCBvdXRwdXRfY2hhcnNldF9jYWNoZWQ7Ci0KLSAgICAgIGlmICghb3V0cHV0X2NoYXJzZXRfY2FjaGVkKQotCXsKLQkgIGNvbnN0IGNoYXIgKnZhbHVlID0gZ2V0ZW52ICgiT1VUUFVUX0NIQVJTRVQiKTsKLQotCSAgaWYgKHZhbHVlICE9IE5VTEwgJiYgdmFsdWVbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKHZhbHVlKSArIDE7Ci0JICAgICAgY2hhciAqdmFsdWVfY29weSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQotCSAgICAgIGlmICh2YWx1ZV9jb3B5ICE9IE5VTEwpCi0JCW1lbWNweSAodmFsdWVfY29weSwgdmFsdWUsIGxlbik7Ci0JICAgICAgb3V0cHV0X2NoYXJzZXRfY2FjaGUgPSB2YWx1ZV9jb3B5OwotCSAgICB9Ci0JICBvdXRwdXRfY2hhcnNldF9jYWNoZWQgPSAxOwotCX0KLQotICAgICAgaWYgKG91dHB1dF9jaGFyc2V0X2NhY2hlICE9IE5VTEwpCi0JcmV0dXJuIG91dHB1dF9jaGFyc2V0X2NhY2hlOwotICAgICAgZWxzZQotCXsKLSMgaWZkZWYgX0xJQkMKLQkgIHJldHVybiBfTkxfQ1VSUkVOVCAoTENfQ1RZUEUsIENPREVTRVQpOwotIyBlbHNlCi0jICBpZiBIQVZFX0lDT05WCi0JICByZXR1cm4gbG9jYWxlX2NoYXJzZXQgKCk7Ci0jICBlbmRpZgotIyBlbmRpZgotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKLQotI2lmICFfTElCQyAmJiAhSEFWRV9NRU1QQ1BZCi1zdGF0aWMgdm9pZCAqCi1tZW1wY3B5ICh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQotewotICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKSArIG4pOwotfQotI2VuZGlmCi0KLSNpZiAhX0xJQkMgJiYgIUhBVkVfVFNFQVJDSAotIyBpbmNsdWRlICJ0c2VhcmNoLmMiCi0jZW5kaWYKLQotCi0jaWZkZWYgX0xJQkMKLS8qIElmIHdlIHdhbnQgdG8gZnJlZSBhbGwgcmVzb3VyY2VzIHdlIGhhdmUgdG8gZG8gc29tZSB3b3JrIGF0Ci0gICBwcm9ncmFtJ3MgZW5kLiAgKi8KLWxpYmNfZnJlZXJlc19mbiAoZnJlZV9tZW0pCi17Ci0gIHZvaWQgKm9sZDsKLQotICB3aGlsZSAoX25sX2RvbWFpbl9iaW5kaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kaW5nICpvbGRwID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLSAgICAgIF9ubF9kb21haW5fYmluZGluZ3MgPSBfbmxfZG9tYWluX2JpbmRpbmdzLT5uZXh0OwotICAgICAgaWYgKG9sZHAtPmRpcm5hbWUgIT0gX25sX2RlZmF1bHRfZGlybmFtZSkKLQkvKiBZZXMsIHRoaXMgaXMgYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLwotCWZyZWUgKG9sZHAtPmRpcm5hbWUpOwotICAgICAgZnJlZSAob2xkcC0+Y29kZXNldCk7Ci0gICAgICBmcmVlIChvbGRwKTsKLSAgICB9Ci0KLSAgaWYgKF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQotICAgIC8qIFllcywgYWdhaW4gYSBwb2ludGVyIGNvbXBhcmlzb24uICAqLwotICAgIGZyZWUgKChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluKTsKLQotICAvKiBSZW1vdmUgdGhlIHNlYXJjaCB0cmVlIHdpdGggdGhlIGtub3duIHRyYW5zbGF0aW9ucy4gICovCi0gIF9fdGRlc3Ryb3kgKHJvb3QsIGZyZWUpOwotICByb290ID0gTlVMTDsKLQotICB3aGlsZSAodHJhbnNtZW1fbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIG9sZCA9IHRyYW5zbWVtX2xpc3Q7Ci0gICAgICB0cmFuc21lbV9saXN0ID0gdHJhbnNtZW1fbGlzdC0+bmV4dDsKLSAgICAgIGZyZWUgKG9sZCk7Ci0gICAgfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2RjbmdldHRleHQuYyBiL2ludGwvZGNuZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjM2ODMzLi4wMDAwMDAwCi0tLSBhL2ludGwvZGNuZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjbmdldHRleHQoMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKLSMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotY2hhciAqCi1EQ05HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAotCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKLQkgICAgaW50IGNhdGVnb3J5KQotewotICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIDEsIG4sIGNhdGVnb3J5KTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGNuZ2V0dGV4dCwgZGNuZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZGdldHRleHQuYyBiL2ludGwvZGdldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZDBkZS4uMDAwMDAwMAotLS0gYS9pbnRsL2RnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCi0jZWxzZQotIyBkZWZpbmUgREdFVFRFWFQgbGliaW50bF9kZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1jaGFyICoKLURHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCkKLXsKLSAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGdldHRleHQsIGRnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9kbmdldHRleHQuYyBiL2ludGwvZG5nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzg0MzguLjAwMDAwMDAKLS0tIGEvaW50bC9kbmdldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkbmdldHRleHQoMykgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEROR0VUVEVYVCBfX2RuZ2V0dGV4dAotIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKLSNlbHNlCi0jIGRlZmluZSBETkdFVFRFWFQgbGliaW50bF9kbmdldHRleHQKLSMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZSBhbmQgc2tpcCBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgcGx1cmFsIGZvcm0uICAqLwotY2hhciAqCi1ETkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCi17Ci0gIHJldHVybiBEQ05HRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kbmdldHRleHQsIGRuZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZXZhbC1wbHVyYWwuaCBiL2ludGwvZXZhbC1wbHVyYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlZWNiMy4uMDAwMDAwMAotLS0gYS9pbnRsL2V2YWwtcGx1cmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyogUGx1cmFsIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzLCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgU1RBVElDCi0jZGVmaW5lIFNUQVRJQyBzdGF0aWMKLSNlbmRpZgotCi0vKiBFdmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYW5kIHJldHVybiBhbiBpbmRleCB2YWx1ZS4gICovCi1TVEFUSUMKLXVuc2lnbmVkIGxvbmcgaW50Ci1pbnRlcm5hbF9mdW5jdGlvbgotcGx1cmFsX2V2YWwgKGNvbnN0IHN0cnVjdCBleHByZXNzaW9uICpwZXhwLCB1bnNpZ25lZCBsb25nIGludCBuKQotewotICBzd2l0Y2ggKHBleHAtPm5hcmdzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKLQl7Ci0JY2FzZSB2YXI6Ci0JICByZXR1cm4gbjsKLQljYXNlIG51bToKLQkgIHJldHVybiBwZXhwLT52YWwubnVtOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICB7Ci0JLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgbG5vdC4gICovCi0JdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKLQlyZXR1cm4gISBhcmc7Ci0gICAgICB9Ci0gICAgY2FzZSAyOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgaW50IGxlZnRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOwotCWlmIChwZXhwLT5vcGVyYXRpb24gPT0gbG9yKQotCSAgcmV0dXJuIGxlZnRhcmcgfHwgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKLQllbHNlIGlmIChwZXhwLT5vcGVyYXRpb24gPT0gbGFuZCkKLQkgIHJldHVybiBsZWZ0YXJnICYmIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0JZWxzZQotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGludCByaWdodGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7Ci0KLQkgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCi0JICAgICAgewotCSAgICAgIGNhc2UgbXVsdDoKLQkJcmV0dXJuIGxlZnRhcmcgKiByaWdodGFyZzsKLQkgICAgICBjYXNlIGRpdmlkZToKLSNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCi0JCWlmIChyaWdodGFyZyA9PSAwKQotCQkgIHJhaXNlIChTSUdGUEUpOwotI2VuZGlmCi0JCXJldHVybiBsZWZ0YXJnIC8gcmlnaHRhcmc7Ci0JICAgICAgY2FzZSBtb2R1bGU6Ci0jaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQotCQlpZiAocmlnaHRhcmcgPT0gMCkKLQkJICByYWlzZSAoU0lHRlBFKTsKLSNlbmRpZgotCQlyZXR1cm4gbGVmdGFyZyAlIHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgcGx1czoKLQkJcmV0dXJuIGxlZnRhcmcgKyByaWdodGFyZzsKLQkgICAgICBjYXNlIG1pbnVzOgotCQlyZXR1cm4gbGVmdGFyZyAtIHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgbGVzc190aGFuOgotCQlyZXR1cm4gbGVmdGFyZyA8IHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgZ3JlYXRlcl90aGFuOgotCQlyZXR1cm4gbGVmdGFyZyA+IHJpZ2h0YXJnOwotCSAgICAgIGNhc2UgbGVzc19vcl9lcXVhbDoKLQkJcmV0dXJuIGxlZnRhcmcgPD0gcmlnaHRhcmc7Ci0JICAgICAgY2FzZSBncmVhdGVyX29yX2VxdWFsOgotCQlyZXR1cm4gbGVmdGFyZyA+PSByaWdodGFyZzsKLQkgICAgICBjYXNlIGVxdWFsOgotCQlyZXR1cm4gbGVmdGFyZyA9PSByaWdodGFyZzsKLQkgICAgICBjYXNlIG5vdF9lcXVhbDoKLQkJcmV0dXJuIGxlZnRhcmcgIT0gcmlnaHRhcmc7Ci0JICAgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCS8qIE5PVFJFQUNIRUQgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIDM6Ci0gICAgICB7Ci0JLyogcGV4cC0+b3BlcmF0aW9uIG11c3QgYmUgcW1vcC4gICovCi0JdW5zaWduZWQgbG9uZyBpbnQgYm9vbGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7Ci0JcmV0dXJuIHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1tib29sYXJnID8gMSA6IDJdLCBuKTsKLSAgICAgIH0KLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2V4cGxvZGVuYW1lLmMgYi9pbnRsL2V4cGxvZGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNWRkNzUuLjAwMDAwMDAKLS0tIGEvaW50bC9leHBsb2RlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDEsIDIwMDMsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGEgbGVhZGluZyBsYW5ndWFnZSBwYXJ0IGFuZCBhbGwgdGhlCi0gICByZXN0LiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYW5ndWFnZSwKLSAgIGkuZS4gdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3QuICAqLwotc3RhdGljIGNoYXIgKl9ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKTsKLQotc3RhdGljIGNoYXIgKgotX25sX2ZpbmRfbGFuZ3VhZ2UgKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gIHdoaWxlIChuYW1lWzBdICE9ICdcMCcgJiYgbmFtZVswXSAhPSAnXycgJiYgbmFtZVswXSAhPSAnQCcgJiYgbmFtZVswXSAhPSAnLicpCi0gICAgKytuYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSBuYW1lOwotfQotCi0KLWludAotX25sX2V4cGxvZGVfbmFtZSAoY2hhciAqbmFtZSwKLQkJICBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKiptb2RpZmllciwKLQkJICBjb25zdCBjaGFyICoqdGVycml0b3J5LCBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0KQotewotICBjaGFyICpjcDsKLSAgaW50IG1hc2s7Ci0KLSAgKm1vZGlmaWVyID0gTlVMTDsKLSAgKnRlcnJpdG9yeSA9IE5VTEw7Ci0gICpjb2Rlc2V0ID0gTlVMTDsKLSAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IE5VTEw7Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJywgJy4nLCBhbmQgYEAnLiAgKi8KLSAgbWFzayA9IDA7Ci0gICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKLSAgY3AgPSBfbmxfZmluZF9sYW5ndWFnZSAoKmxhbmd1YWdlKTsKLQotICBpZiAoKmxhbmd1YWdlID09IGNwKQotICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQotICAgICAgIHRoaXMgZW50cnkgYXMgaXQgaXMgd2l0aG91dCBleHBsb2RpbmcuICBQZXJoYXBzIGl0IGlzIGFuIGFsaWFzLiAgKi8KLSAgICBjcCA9IHN0cmNociAoKmxhbmd1YWdlLCAnXDAnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjcFswXSA9PSAnXycpCi0JewotCSAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICp0ZXJyaXRvcnkgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IFhQR19URVJSSVRPUlk7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJy4nKQotCXsKLQkgIC8qIE5leHQgaXMgdGhlIGNvZGVzZXQuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKmNvZGVzZXQgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnQCcpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gWFBHX0NPREVTRVQ7Ci0KLQkgIGlmICgqY29kZXNldCAhPSBjcCAmJiAoKmNvZGVzZXQpWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gX25sX25vcm1hbGl6ZV9jb2Rlc2V0ICgqY29kZXNldCwKLQkJCQkJCQkgICBjcCAtICpjb2Rlc2V0KTsKLQkgICAgICBpZiAoKm5vcm1hbGl6ZWRfY29kZXNldCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wICgqY29kZXNldCwgKm5vcm1hbGl6ZWRfY29kZXNldCkgPT0gMCkKLQkJZnJlZSAoKGNoYXIgKikgKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0JICAgICAgZWxzZQotCQltYXNrIHw9IFhQR19OT1JNX0NPREVTRVQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChjcFswXSA9PSAnQCcpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKm1vZGlmaWVyID0gKytjcDsKLQotICAgICAgaWYgKGNwWzBdICE9ICdcMCcpCi0JbWFzayB8PSBYUEdfTU9ESUZJRVI7Ci0gICAgfQotCi0gIGlmICgqdGVycml0b3J5ICE9IE5VTEwgJiYgKCp0ZXJyaXRvcnkpWzBdID09ICdcMCcpCi0gICAgbWFzayAmPSB+WFBHX1RFUlJJVE9SWTsKLQotICBpZiAoKmNvZGVzZXQgIT0gTlVMTCAmJiAoKmNvZGVzZXQpWzBdID09ICdcMCcpCi0gICAgbWFzayAmPSB+WFBHX0NPREVTRVQ7Ci0KLSAgcmV0dXJuIG1hc2s7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2V4cG9ydC5oIGIvaW50bC9leHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjNDdhZC4uMDAwMDAwMAotLS0gYS9pbnRsL2V4cG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0KLSNpZiBASEFWRV9WSVNJQklMSVRZQCAmJiBCVUlMRElOR19MSUJJTlRMCi0jZGVmaW5lIExJQklOVExfRExMX0VYUE9SVEVEIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQotI2Vsc2UKLSNkZWZpbmUgTElCSU5UTF9ETExfRVhQT1JURUQKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9maW5kZG9tYWluLmMgYi9pbnRsL2ZpbmRkb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMmM5OS4uMDAwMDAwMAotLS0gYS9pbnRsL2ZpbmRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMy0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUub3JnPiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSNlbmRpZgotCi0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCBfX2xpYmNfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZAotIyBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayBfX2xpYmNfcndsb2NrX3JkbG9jawotIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayBfX2xpYmNfcndsb2NrX3dybG9jawotIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayBfX2xpYmNfcndsb2NrX3VubG9jawotI2Vsc2UKLSMgaW5jbHVkZSAibG9jay5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCi1zdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOwotCi0KLS8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKLSAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5Ci0gICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLWludGVybmFsX2Z1bmN0aW9uCi1fbmxfZmluZF9kb21haW4gKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGNoYXIgKmxvY2FsZSwKLQkJIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQotewotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpyZXR2YWw7Ci0gIGNvbnN0IGNoYXIgKmxhbmd1YWdlOwotICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOwotICBpbnQgbWFzazsKLQotICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKLQotCQlsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXQotCi0gICAgIEJlc2lkZSB0aGUgZmlyc3QgcGFydCBhbGwgb2YgdGhlbSBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLiAgSWYKLSAgICAgdGhlIGZ1bGwgc3BlY2lmaWVkIGxvY2FsZSBpcyBub3QgZm91bmQsIHRoZSBsZXNzIHNwZWNpZmljIG9uZSBhcmUKLSAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnRzIHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFjY29yZGluZyB0bwotICAgICB0aGUgZm9sbG93aW5nIG9yZGVyOgotCQkoMSkgY29kZXNldAotCQkoMikgbm9ybWFsaXplZCBjb2Rlc2V0Ci0JCSgzKSB0ZXJyaXRvcnkKLQkJKDQpIG1vZGlmaWVyCi0gICAqLwotCi0gIC8qIFdlIG5lZWQgdG8gcHJvdGVjdCBtb2RpZnlpbmcgdGhlIF9OTF9MT0FERURfRE9NQUlOUyBkYXRhLiAgKi8KLSAgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKTsKLSAgZ2xfcndsb2NrX3JkbG9jayAobG9jayk7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgdGhpcyBsb2NhbGUgZW50cnkgdGhlcmUgaGFzIHRvCi0gICAgIGJlIG9uZSBkYXRhIHNldCBpbiB0aGUgbGlzdCBvZiBsb2FkZWQgZG9tYWlucy4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgMCwgbG9jYWxlLCBOVUxMLCBOVUxMLAotCQkJICAgICAgIE5VTEwsIE5VTEwsIGRvbWFpbm5hbWUsIDApOwotCi0gIGdsX3J3bG9ja191bmxvY2sgKGxvY2spOwotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBrbm93IHNvbWV0aGluZyBhYm91dCB0aGlzIGxvY2FsZS4gICovCi0gICAgICBpbnQgY250OwotCi0gICAgICBpZiAocmV0dmFsLT5kZWNpZGVkIDw9IDApCi0JX25sX2xvYWRfZG9tYWluIChyZXR2YWwsIGRvbWFpbmJpbmRpbmcpOwotCi0gICAgICBpZiAocmV0dmFsLT5kYXRhICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkIDw9IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7Ci0KLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kYXRhICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0gICAgIGRvbmUuICAqLwotICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7Ci0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIGxvY2FsZSA9IHN0cmR1cCAoYWxpYXNfdmFsdWUpOwotICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0gICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nLCAnLicsIGFuZCBgQCcuICAqLwotICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKLQkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0KTsKLSAgaWYgKG1hc2sgPT0gLTEpCi0gICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFdlIG5lZWQgdG8gcHJvdGVjdCBtb2RpZnlpbmcgdGhlIF9OTF9MT0FERURfRE9NQUlOUyBkYXRhLiAgKi8KLSAgZ2xfcndsb2NrX3dybG9jayAobG9jayk7Ci0KLSAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCi0gICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAotCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsCi0JCQkgICAgICAgZG9tYWlubmFtZSwgMSk7Ci0KLSAgZ2xfcndsb2NrX3VubG9jayAobG9jayk7Ci0KLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSAgICBnb3RvIG91dDsKLQotICBpZiAocmV0dmFsLT5kZWNpZGVkIDw9IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwsIGRvbWFpbmJpbmRpbmcpOwotICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgaW50IGNudDsKLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA8PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0sIGRvbWFpbmJpbmRpbmcpOwotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgZnJlZSAobG9jYWxlKTsKLQotb3V0OgotICAvKiBUaGUgc3BhY2UgZm9yIG5vcm1hbGl6ZWRfY29kZXNldCBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICBGcmVlIGl0LiAgKi8KLSAgaWYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKQotICAgIGZyZWUgKCh2b2lkICopIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi0jaWZkZWYgX0xJQkMKLS8qIFRoaXMgaXMgY2FsbGVkIGZyb20gaWNvbnYvZ2NvbnZfZGIuYydzIGZyZWVfbWVtLCBhcyBsb2NhbGVzIG11c3QKLSAgIGJlIGZyZWVkIGJlZm9yZSBmcmVlaW5nIGdjb252IHN0ZXBzIGFycmF5cy4gICovCi12b2lkIF9fbGliY19mcmVlcmVzX2ZuX3NlY3Rpb24KLV9ubF9maW5kZG9tYWluX3N1YmZyZWVyZXMgKCkKLXsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcnVucCA9IF9ubF9sb2FkZWRfZG9tYWluczsKLQotICB3aGlsZSAocnVucCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmhlcmUgPSBydW5wOwotICAgICAgaWYgKHJ1bnAtPmRhdGEgIT0gTlVMTCkKLQlfbmxfdW5sb2FkX2RvbWFpbiAoKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIHJ1bnAtPmRhdGEpOwotICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7Ci0gICAgICBmcmVlICgoY2hhciAqKSBoZXJlLT5maWxlbmFtZSk7Ci0gICAgICBmcmVlIChoZXJlKTsKLSAgICB9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5jIGIvaW50bC9nZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmQ0MzkuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBfX25lZWRfTlVMTAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBHRVRURVhUIF9fZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKLSNlbHNlCi0jIGRlZmluZSBHRVRURVhUIGxpYmludGxfZ2V0dGV4dAotIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi1jaGFyICoKLUdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkKQotewotICByZXR1cm4gRENHRVRURVhUIChOVUxMLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0UC5oIGIvaW50bC9nZXR0ZXh0UC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA2ZmI1Li4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dFAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKiBIZWFkZXIgZGVzY3JpYmluZyBpbnRlcm5hbHMgb2YgbGliaW50bCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVFBfSAotI2RlZmluZSBfR0VUVEVYVFBfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+CQkvKiBHZXQgc2l6ZV90LiAgKi8KLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgIi4uL2ljb252L2djb252X2ludC5oIgotI2Vsc2UKLSMgaWYgSEFWRV9JQ09OVgotIyAgaW5jbHVkZSA8aWNvbnYuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZQotI2Vsc2UKLSMgaW5jbHVkZSAibG9jay5oIgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7Ci1leHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKTsKLWV4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJICBpbnQgX19jYXRlZ29yeSk7Ci1leHRlcm4gY2hhciAqX19uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7Ci1leHRlcm4gY2hhciAqX19kbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJICB1bnNpZ25lZCBsb25nIGludCBuKTsKLWV4dGVybiBjaGFyICpfX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwgaW50IF9fY2F0ZWdvcnkpOwotZXh0ZXJuIGNoYXIgKl9fZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCi0JCQkgICBpbnQgX19jYXRlZ29yeSk7Ci1leHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpOwotZXh0ZXJuIGNoYXIgKl9fYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOwotZXh0ZXJuIGNoYXIgKl9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkJY29uc3QgY2hhciAqX19jb2Rlc2V0KTsKLWV4dGVybiB2b2lkIF9ubF9maW5kZG9tYWluX3N1YmZyZWVyZXMgKHZvaWQpIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gdm9pZCBfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbiBhdHRyaWJ1dGVfaGlkZGVuOwotI2Vsc2UKLS8qIERlY2xhcmUgdGhlIGV4cG9ydGVkIGxpYmludGxfKiBmdW5jdGlvbnMsIGluIGEgd2F5IHRoYXQgYWxsb3dzIHVzIHRvCi0gICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KLSMgdW5kZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi0jIHVuZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGluY2x1ZGUgImxpYmdudWludGwuaCIKLSMgaWZkZWYgSU5fTElCR0xPQ0FMRQotZXh0ZXJuIGNoYXIgKmdsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgICAgaW50IF9fcGx1cmFsLCB1bnNpZ25lZCBsb25nIGludCBfX24sCi0JCQkgICAgaW50IF9fY2F0ZWdvcnksCi0JCQkgICAgY29uc3QgY2hhciAqX19sb2NhbGVuYW1lLCBjb25zdCBjaGFyICpfX2VuY29kaW5nKTsKLSMgZWxzZQotZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNpZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkJIGludCBfX3BsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgX19uLAotCQkJCSBpbnQgX19jYXRlZ29yeSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLSNpbmNsdWRlICJnbW8uaCIJCS8qIEdldCBubHNfdWludDMyLiAgKi8KLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgotIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgotI2VuZGlmCi0KLS8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKLSAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KLSNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAotIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQotI2VuZGlmCi0KLSNpZm5kZWYgVwotIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCi0jZW5kaWYKLQotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgZGVmaW5lIFNXQVAoaSkgYnN3YXBfMzIgKGkpCi0jZWxzZQotc3RhdGljIGlubGluZSBubHNfdWludDMyCi0jIGlmZGVmIF9fY3BsdXNwbHVzCi1TV0FQIChubHNfdWludDMyIGkpCi0jIGVsc2UKLVNXQVAgKGkpCi0gICAgIG5sc191aW50MzIgaTsKLSMgZW5kaWYKLXsKLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotfQotI2VuZGlmCi0KLQotLyogSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KLXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLSAgc2l6ZV90IGxlbmd0aDsKLSAgLyogUG9pbnRlciB0byBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KLSAgY29uc3QgY2hhciAqcG9pbnRlcjsKLX07Ci0KLS8qIENhY2hlIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBhZnRlciBjaGFyc2V0IGNvbnZlcnNpb24uCi0gICBOb3RlOiBUaGUgc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgZW5jb2Rpbmcgb25seSBvbiBhbiBhcy1uZWVkZWQKLSAgIGJhc2lzLiAgKi8KLXN0cnVjdCBjb252ZXJ0ZWRfZG9tYWluCi17Ci0gIC8qIFRoZSB0YXJnZXQgZW5jb2RpbmcgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmVuY29kaW5nOwotICAvKiBUaGUgZGVzY3JpcHRvciBmb3IgY29udmVyc2lvbiBmcm9tIHRoZSBtZXNzYWdlIGNhdGFsb2cncyBlbmNvZGluZyB0bwotICAgICB0aGlzIHRhcmdldCBlbmNvZGluZy4gICovCi0jaWZkZWYgX0xJQkMKLSAgX19nY29udl90IGNvbnY7Ci0jZWxzZQotIyBpZiBIQVZFX0lDT05WCi0gIGljb252X3QgY29udjsKLSMgZW5kaWYKLSNlbmRpZgotICAvKiBUaGUgdGFibGUgb2YgdHJhbnNsYXRlZCBzdHJpbmdzIGFmdGVyIGNoYXJzZXQgY29udmVyc2lvbi4gICovCi0gIGNoYXIgKipjb252X3RhYjsKLX07Ci0KLS8qIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KLXN0cnVjdCBsb2FkZWRfZG9tYWluCi17Ci0gIC8qIFBvaW50ZXIgdG8gbWVtb3J5IGNvbnRhaW5pbmcgdGhlIC5tbyBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZGF0YTsKLSAgLyogMSBpZiB0aGUgbWVtb3J5IGlzIG1tYXAoKWVkLCAwIGlmIHRoZSBtZW1vcnkgaXMgbWFsbG9jKCllZC4gICovCi0gIGludCB1c2VfbW1hcDsKLSAgLyogU2l6ZSBvZiBtbWFwKCllZCBtZW1vcnkuICAqLwotICBzaXplX3QgbW1hcF9zaXplOwotICAvKiAxIGlmIHRoZSAubW8gZmlsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLwotICBpbnQgbXVzdF9zd2FwOwotICAvKiBQb2ludGVyIHRvIGFkZGl0aW9uYWwgbWFsbG9jKCllZCBtZW1vcnkuICAqLwotICB2b2lkICptYWxsb2NlZDsKLQotICAvKiBOdW1iZXIgb2Ygc3RhdGljIHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLwotICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOwotICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCi0gIGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOwotCi0gIC8qIE51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLwotICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7Ci0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLwotICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICpvcmlnX3N5c2RlcF90YWI7Ci0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCi0gIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7Ci0KLSAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0gIC8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZS4gICovCi0gIGNvbnN0IG5sc191aW50MzIgKmhhc2hfdGFiOwotICAvKiAxIGlmIHRoZSBoYXNoIHRhYmxlIHVzZXMgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyB0aGFuIHRoaXMgbWFjaGluZS4gICovCi0gIGludCBtdXN0X3N3YXBfaGFzaF90YWI7Ci0KLSAgLyogQ2FjaGUgb2YgY2hhcnNldCBjb252ZXJzaW9ucyBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKmNvbnZlcnNpb25zOwotICBzaXplX3QgbmNvbnZlcnNpb25zOwotICBnbF9yd2xvY2tfZGVmaW5lICgsIGNvbnZlcnNpb25zX2xvY2spCi0KLSAgY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gKnBsdXJhbDsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7Ci19OwotCi0vKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQwotICAgZG9lc24ndCBhbGxvdyB6ZXJvIHNpemVkIGFycmF5cy4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIFpFUk8gMAotI2Vsc2UKLSMgZGVmaW5lIFpFUk8gMQotI2VuZGlmCi0KLS8qIEEgc2V0IG9mIHNldHRpbmdzIGJvdW5kIHRvIGEgbWVzc2FnZSBkb21haW4uICBVc2VkIHRvIHN0b3JlIHNldHRpbmdzCi0gICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLwotc3RydWN0IGJpbmRpbmcKLXsKLSAgc3RydWN0IGJpbmRpbmcgKm5leHQ7Ci0gIGNoYXIgKmRpcm5hbWU7Ci0gIGNoYXIgKmNvZGVzZXQ7Ci0gIGNoYXIgZG9tYWlubmFtZVtaRVJPXTsKLX07Ci0KLS8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKLSAgIGJlY29tZSBpbnZhbGlkLgotICAgVGhpcyB2YXJpYWJsZSBpcyBwYXJ0IG9mIHRoZSBleHRlcm5hbCBBQkkgb2YgdGhlIEdOVSBsaWJpbnRsLiAgKi8KLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0jIGluY2x1ZGUgPGdsb2NhbGUvY29uZmlnLmg+Ci1leHRlcm4gTElCR0xPQ0FMRV9ETExfRVhQT1JURUQgaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0jZWxzZQotZXh0ZXJuIExJQklOVExfRExMX0VYUE9SVEVEIGludCBfbmxfbXNnX2NhdF9jbnRyOwotI2VuZGlmCi0KLSNpZm5kZWYgX0xJQkMKLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbGFuZ3VhZ2VfcHJlZmVyZW5jZXNfZGVmYXVsdCAodm9pZCk7Ci0jIGRlZmluZSBnbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZQotZXh0ZXJuIHZvaWQgX25sX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAoY2hhciAqbmFtZSk7Ci0jIGRlZmluZSBnbF9sb2NhbGVfbmFtZV9wb3NpeCBfbmxfbG9jYWxlX25hbWVfcG9zaXgKLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbG9jYWxlX25hbWVfcG9zaXggKGludCBjYXRlZ29yeSwKLQkJCQkJICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpOwotIyBkZWZpbmUgZ2xfbG9jYWxlX25hbWVfZGVmYXVsdCBfbmxfbG9jYWxlX25hbWVfZGVmYXVsdAotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZV9kZWZhdWx0ICh2b2lkKTsKLSMgZGVmaW5lIGdsX2xvY2FsZV9uYW1lIF9ubF9sb2NhbGVfbmFtZQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9sb2NhbGVfbmFtZSAoaW50IGNhdGVnb3J5LCBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpOwotI2VuZGlmCi0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiAoY29uc3QgY2hhciAqX19kaXJuYW1lLCBjaGFyICpfX2xvY2FsZSwKLQkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkJIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotdm9pZCBfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9fZG9tYWluLAotCQkgICAgICBzdHJ1Y3QgYmluZGluZyAqX19kb21haW5iaW5kaW5nKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLQotI2lmZGVmIElOX0xJQkdMT0NBTEUKLWNoYXIgKl9ubF9maW5kX21zZyAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0JCSAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCSAgICBjb25zdCBjaGFyICptc2dpZCwKLQkJICAgIHNpemVfdCAqbGVuZ3RocCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0jZWxzZQotY2hhciAqX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkJICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nLCBjb25zdCBjaGFyICptc2dpZCwKLQkJICAgIGludCBjb252ZXJ0LCBzaXplX3QgKmxlbmd0aHApCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotI2VuZGlmCi0KLS8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKLSAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCi0gICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KLSNpZiAhZGVmaW5lZCBfTElCQwotIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQotIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncwotI2VuZGlmCi0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXTsKLSNpZmRlZiBfTElCQwotbGliY19oaWRkZW5fcHJvdG8gKF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0jZW5kaWYKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMuICAqLwotZXh0ZXJuIHN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0vKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50Ci0gICBuYW1lcyB0aGFuIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gR05VIGxpYmMsIG90aGVyd2lzZSBwcm9ncmFtcwotICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCi0jaWYgIWRlZmluZWQgX0xJQkMKLSMgZGVmaW5lIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbgotIyBkZWZpbmUgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCB0ZXh0IGRvbWFpbi4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW47Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL2ludGwvZ21vLmggYi9pbnRsL2dtby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlkYmFhLi4wMDAwMDAwCi0tLSBhL2ludGwvZ21vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IGdlbmVyYWwgZmlsZSBsYXlvdXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMiwgMjAwNCwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUX0gKLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdC4gICovCi0jZGVmaW5lIF9NQUdJQyAweDk1MDQxMmRlCi0jZGVmaW5lIF9NQUdJQ19TV0FQUEVEIDB4ZGUxMjA0OTUKLQotLyogUmV2aXNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgdXNlZCAubW8gKGJpbmFyeSkgZmlsZSBmb3JtYXQuICAqLwotI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVIgMAotI2RlZmluZSBNT19SRVZJU0lPTl9OVU1CRVJfV0lUSF9TWVNERVBfSSAxCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udG9ydGlvbnMgYXJlIGFuIGF0dGVtcHQgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvcgotICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLSAgIGFzIG9mIHZlcnNpb24gYXV0b2NvbmYtMi4xMywgdGhlIEFDX0NIRUNLX1NJWkVPRiBtYWNybyBkb2Vzbid0IHdvcmsKLSAgIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiAgKi8KLQotI2lmIF9fU1REQ19fCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0jZWxzZQotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogSWYgVUlOVF9NQVggaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIGl0J3MgYSAzMi1iaXQgdHlwZS4KLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0gICAodGhhdCBjZXJ0YWlubHkgaGF2ZSA8bGltaXRzLmg+KSBoYXZlIDY0Ky1iaXQgaW50ZWdyYWwgdHlwZXMuICAqLwotCi0jaWZuZGVmIFVJTlRfTUFYCi0jIGRlZmluZSBVSU5UX01BWCBVSU5UX01BWF8zMl9CSVRTCi0jZW5kaWYKLQotI2lmIFVJTlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLSNlbHNlCi0jIGlmIFVTSFJUX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0jIGVsc2UKLSMgIGlmIFVMT05HX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLSMgIGVsc2UKLSAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGludGVuZGVkIHRvIHRocm93IGFuIGVycm9yLiAgVXNpbmcgI2Vycm9yIGlzCi0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotc3RydWN0IG1vX2ZpbGVfaGVhZGVyCi17Ci0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotICBubHNfdWludDMyIG1hZ2ljOwotICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0gIG5sc191aW50MzIgcmV2aXNpb247Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1ham9yIHJldmlzaW9uIDAgb3IgMS4gICovCi0KLSAgLyogVGhlIG51bWJlciBvZiBzdHJpbmdzIHBhaXJzLiAgKi8KLSAgbmxzX3VpbnQzMiBuc3RyaW5nczsKLSAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiBvcmlnX3RhYl9vZmZzZXQ7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2YgdHJhbnNsYXRlZCBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiB0cmFuc190YWJfb2Zmc2V0OwotICAvKiBTaXplIG9mIGhhc2ggdGFibGUuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX3NpemU7Ci0gIC8qIE9mZnNldCBvZiBmaXJzdCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgbmxzX3VpbnQzMiBoYXNoX3RhYl9vZmZzZXQ7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgb25seSB1c2VkIGluIC5tbyBmaWxlcyB3aXRoIG1pbm9yIHJldmlzaW9uID49IDEuICAqLwotCi0gIC8qIFRoZSBudW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzZWdtZW50cy4gICovCi0gIG5sc191aW50MzIgbl9zeXNkZXBfc2VnbWVudHM7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSBkZXNjcmliaW5nIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudHMuICAqLwotICBubHNfdWludDMyIHN5c2RlcF9zZWdtZW50c19vZmZzZXQ7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIHBhaXJzLiAgKi8KLSAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIG9yaWdpbmFsIHN5c2RlcCBzdHJpbmdzLiAgKi8KLSAgbmxzX3VpbnQzMiBvcmlnX3N5c2RlcF90YWJfb2Zmc2V0OwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0ZWQgc3lzZGVwIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0OwotfTsKLQotLyogRGVzY3JpcHRvciBmb3Igc3RhdGljIHN0cmluZyBjb250YWluZWQgaW4gdGhlIGJpbmFyeSAubW8gZmlsZS4gICovCi1zdHJ1Y3Qgc3RyaW5nX2Rlc2MKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCi0gIG5sc191aW50MzIgbGVuZ3RoOwotICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLX07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KLQotLyogRGVzY3JpcHRvciBmb3Igc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcgc2VnbWVudC4gICovCi1zdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQKLXsKLSAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLSAgbmxzX3VpbnQzMiBsZW5ndGg7Ci0gIC8qIE9mZnNldCBvZiBzdHJpbmcgaW4gZmlsZS4gICovCi0gIG5sc191aW50MzIgb2Zmc2V0OwotfTsKLQotLyogUGFpciBvZiBhIHN0YXRpYyBhbmQgYSBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnQsIGluIHN0cnVjdCBzeXNkZXBfc3RyaW5nLiAgKi8KLXN0cnVjdCBzZWdtZW50X3BhaXIKLXsKLSAgLyogU2l6ZSBvZiBzdGF0aWMgc2VnbWVudC4gICovCi0gIG5sc191aW50MzIgc2Vnc2l6ZTsKLSAgLyogUmVmZXJlbmNlIHRvIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQsIG9yIH4wIGF0IHRoZSBlbmQuICAqLwotICBubHNfdWludDMyIHN5c2RlcHJlZjsKLX07Ci0KLS8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KLXN0cnVjdCBzeXNkZXBfc3RyaW5nCi17Ci0gIC8qIE9mZnNldCBvZiBzdGF0aWMgc3RyaW5nIHNlZ21lbnRzIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLSAgLyogQWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Ygc3RhdGljIGFuZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLgotICAgICBUaGUgbGFzdCBzZWdtZW50IGlzIGEgc3RhdGljIHNlZ21lbnQsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KLSAgc3RydWN0IHNlZ21lbnRfcGFpciBzZWdtZW50c1sxXTsKLX07Ci0KLS8qIE1hcmtlciBmb3IgdGhlIGVuZCBvZiB0aGUgc2VnbWVudHNbXSBhcnJheS4gIFRoaXMgaGFzIHRoZSB2YWx1ZSAweEZGRkZGRkZGLAotICAgcmVnYXJkbGVzcyB3aGV0aGVyICdpbnQnIGlzIDE2IGJpdCwgMzIgYml0LCBvciA2NCBiaXQuICAqLwotI2RlZmluZSBTRUdNRU5UU19FTkQgKChubHNfdWludDMyKSB+MCkKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNlbmRpZgkvKiBnZXR0ZXh0LmggICovCmRpZmYgLS1naXQgYS9pbnRsL2hhc2gtc3RyaW5nLmMgYi9pbnRsL2hhc2gtc3RyaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNTEzZjAuLjAwMDAwMDAKLS0tIGEvaW50bC9oYXNoLXN0cmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogSW1wbGVtZW50cyBhIHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0KLSAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotCi0KLS8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCi0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi11bnNpZ25lZCBsb25nIGludAotX19oYXNoX3N0cmluZyAoY29uc3QgY2hhciAqc3RyX3BhcmFtKQotewotICB1bnNpZ25lZCBsb25nIGludCBodmFsLCBnOwotICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN0cmluZy4gICovCi0gIGh2YWwgPSAwOwotICB3aGlsZSAoKnN0ciAhPSAnXDAnKQotICAgIHsKLSAgICAgIGh2YWwgPDw9IDQ7Ci0gICAgICBodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7Ci0gICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOwotICAgICAgaWYgKGcgIT0gMCkKLQl7Ci0JICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOwotCSAgaHZhbCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBodmFsOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9oYXNoLXN0cmluZy5oIGIvaW50bC9oYXNoLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGMwN2U0Li4wMDAwMDAwCi0tLSBhL2ludGwvaGFzaC1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIERlc2NyaXB0aW9uIG9mIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0OiBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5Ny0xOTk4LCAyMDAwLTIwMDMsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCi0jZGVmaW5lIEhBU0hXT1JEQklUUyAzMgotCi0KLSNpZm5kZWYgX0xJQkMKLSMgaWZkZWYgSU5fTElCSU5UTAotIyAgZGVmaW5lIF9faGFzaF9zdHJpbmcgbGliaW50bF9oYXNoX3N0cmluZwotIyBlbHNlCi0jICBkZWZpbmUgX19oYXNoX3N0cmluZyBoYXNoX3N0cmluZwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCi0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19oYXNoX3N0cmluZyAoY29uc3QgY2hhciAqc3RyX3BhcmFtKTsKZGlmZiAtLWdpdCBhL2ludGwvaW50bC1jb21wYXQuYyBiL2ludGwvaW50bC1jb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5ZWNiYi4uMDAwMDAwMAotLS0gYS9pbnRsL2ludGwtY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAotICAgTGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMjAwMC0yMDAzLCAyMDA1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBUaGlzIGZpbGUgcmVkaXJlY3RzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9ucyAod2l0aG91dCBwcmVmaXgpIHRvIHRob3NlCi0gICBkZWZpbmVkIGluIHRoZSBpbmNsdWRlZCBHTlUgbGliaW50bCBsaWJyYXJ5ICh3aXRoICJsaWJpbnRsXyIgcHJlZml4KS4KLSAgIEl0IGlzIGNvbXBpbGVkIGludG8gbGliaW50bCBpbiBvcmRlciB0byBtYWtlIHRoZSBBTV9HTlVfR0VUVEVYVCB0ZXN0Ci0gICBvZiBnZXR0ZXh0IDw9IDAuMTEuMiB3b3JrIHdpdGggdGhlIGxpYmludGwgbGlicmFyeSA+PSAwLjExLjMgd2hpY2gKLSAgIGhhcyB0aGUgcmVkaXJlY3Rpb25zIHByaW1hcmlseSBpbiB0aGUgPGxpYmludGwuaD4gaW5jbHVkZSBmaWxlLgotICAgSXQgaXMgYWxzbyBjb21waWxlZCBpbnRvIGxpYmdudWludGwgc28gdGhhdCBsaWJnbnVpbnRsLnNvIGNhbiBiZSB1c2VkCi0gICBhcyBMRF9QUkVMT0FEYWJsZSBsaWJyYXJ5IG9uIGdsaWJjIHN5c3RlbXMsIHRvIHByb3ZpZGUgdGhlIGV4dHJhCi0gICBmZWF0dXJlcyB0aGF0IHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmMgZG9uJ3QgaGF2ZSAobmFtZWx5LCBsb2dnaW5nKS4gICovCi0KLQotI3VuZGVmIGdldHRleHQKLSN1bmRlZiBkZ2V0dGV4dAotI3VuZGVmIGRjZ2V0dGV4dAotI3VuZGVmIG5nZXR0ZXh0Ci0jdW5kZWYgZG5nZXR0ZXh0Ci0jdW5kZWYgZGNuZ2V0dGV4dAotI3VuZGVmIHRleHRkb21haW4KLSN1bmRlZiBiaW5kdGV4dGRvbWFpbgotI3VuZGVmIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0KLQotLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQotICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKLSAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCi0jaWYgSEFWRV9WSVNJQklMSVRZICYmIEJVSUxESU5HX0RMTAotIyBkZWZpbmUgRExMX0VYUE9SVEVEIF9fYXR0cmlidXRlX18oKF9fdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKQotI2VsaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKLSMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNlbHNlCi0jIGRlZmluZSBETExfRVhQT1JURUQKLSNlbmRpZgotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1nZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZCkKLXsKLSAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAobXNnaWQpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1kZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCi17Ci0gIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCk7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKLXsKLSAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1uZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCi17Ci0gIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChtc2dpZDEsIG1zZ2lkMiwgbik7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRuZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKLQkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKLXsKLSAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbik7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLWRjbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCi0JICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAotCSAgICBpbnQgY2F0ZWdvcnkpCi17Ci0gIHJldHVybiBsaWJpbnRsX2RjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBjYXRlZ29yeSk7Ci19Ci0KLQotRExMX0VYUE9SVEVECi1jaGFyICoKLXRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi17Ci0gIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKGRvbWFpbm5hbWUpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotfQotCi0KLURMTF9FWFBPUlRFRAotY2hhciAqCi1iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGRvbWFpbm5hbWUsIGNvZGVzZXQpOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9pbnRsLWV4cG9ydHMuYyBiL2ludGwvaW50bC1leHBvcnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzY1ODkuLjAwMDAwMDAKLS0tIGEvaW50bC9pbnRsLWV4cG9ydHMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIExpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scyBvZiBsaWJpbnRsIG9uIEN5Z3dpbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDA2LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSAvKiBJTVAoeCkgaXMgYSBzeW1ib2wgdGhhdCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB4LiAgKi8KLSNkZWZpbmUgSU1QKHgpIF9pbXBfXyMjeAotCi0gLyogRW5zdXJlIHRoYXQgdGhlIHZhcmlhYmxlIHggaXMgZXhwb3J0ZWQgZnJvbSB0aGUgbGlicmFyeSwgYW5kIHRoYXQgYQotICAgIHBzZXVkby12YXJpYWJsZSBJTVAoeCkgaXMgYXZhaWxhYmxlLiAgKi8KLSNkZWZpbmUgVkFSSUFCTEUoeCkgXAotIC8qIEV4cG9ydCB4IHdpdGhvdXQgcmVkZWZpbmluZyB4LiAgVGhpcyBjb2RlIHdhcyBmb3VuZCBieSBjb21waWxpbmcgYQlcCi0gICAgc25pcHBldDoJCQkJCQkJCVwKLSAgICAgIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IHg7IGludCB4ID0gNDI7ICAqLwkJXAotIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlXG4iKTsJCQkJCQlcCi0gYXNtICgiLmFzY2lpIFwiIC1leHBvcnQ6IiAjeCAiLGRhdGFcIlxuIik7CQkJCVwKLSBhc20gKCIuZGF0YVxuIik7CQkJCQkJCVwKLSAvKiBBbGxvY2F0ZSBhIHBzZXVkby12YXJpYWJsZSBJTVAoeCkuICAqLwkJCQlcCi0gZXh0ZXJuIGludCB4OwkJCQkJCQkJXAotIHZvaWQgKiBJTVAoeCkgPSAmeDsKLQotVkFSSUFCTEUobGliaW50bF92ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvaW50bC9sMTBuZmxpc3QuYyBiL2ludGwvbDEwbmZsaXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NWFlYjcuLjAwMDAwMDAKLS0tIGEvaW50bC9sMTBuZmxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHN0cGNweSgpLgotICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfQVJHWl9ICi0jIGluY2x1ZGUgPGFyZ3ouaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBPbiBzb21lIHN0cmFuZ2Ugc3lzdGVtcyBzdGlsbCBubyBkZWZpbml0aW9uIG9mIE5VTEwgaXMgZm91bmQuICBTaWdoISAgKi8KLSNpZm5kZWYgTlVMTAotIyBpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0jICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgZWxzZQotIyAgZGVmaW5lIE5VTEwgMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgaWZuZGVmIHN0cGNweQotIyAgZGVmaW5lIHN0cGNweShkZXN0LCBzcmMpIF9fc3RwY3B5KGRlc3QsIHNyYykKLSMgZW5kaWYKLSNlbHNlCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBQYXRobmFtZSBzdXBwb3J0LgotICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0gICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCi0gKi8KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0gIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAqLwotIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKLSMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAotICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKLSAgICAgJiYgKFApWzFdID09ICc6JykKLSMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgKElTU0xBU0ggKChQKVswXSkgfHwgSEFTX0RFVklDRSAoUCkpCi0jZWxzZQotICAvKiBVbml4ICovCi0jIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQotIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCi0jZW5kaWYKLQotLyogRGVmaW5lIGZ1bmN0aW9uIHdoaWNoIGFyZSB1c3VhbGx5IG5vdCBhdmFpbGFibGUuICAqLwotCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIElOVFVTRShfX2FyZ3pfY291bnQpIChhcmd6LCBsZW4pCi0jZWxpZiBkZWZpbmVkIEhBVkVfQVJHWl9DT1VOVAotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudCBhcmd6X2NvdW50Ci0jZWxzZQotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCi1zdGF0aWMgc2l6ZV90Ci1hcmd6X2NvdW50X18gKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pCi17Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9BUkdaX0NPVU5UICovCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAotICBJTlRVU0UoX19hcmd6X3N0cmluZ2lmeSkgKGFyZ3osIGxlbiwgc2VwKQotI2VsaWYgZGVmaW5lZCBIQVZFX0FSR1pfU1RSSU5HSUZZCi0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkgYXJnel9zdHJpbmdpZnkKLSNlbHNlCi0vKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCi0gICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCi1zdGF0aWMgdm9pZAotYXJnel9zdHJpbmdpZnlfXyAoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkKLXsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW47Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgaWYgKGxlbiA+IDApCi0JKmFyZ3orKyA9IHNlcDsKLSAgICB9Ci19Ci0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9BUkdaX1NUUklOR0lGWSAqLwotCi0jaWZkZWYgX0xJQkMKLSNlbGlmIGRlZmluZWQgSEFWRV9BUkdaX05FWFQKLSMgdW5kZWYgX19hcmd6X25leHQKLSMgZGVmaW5lIF9fYXJnel9uZXh0IGFyZ3pfbmV4dAotI2Vsc2UKLXN0YXRpYyBjaGFyICoKLWFyZ3pfbmV4dF9fIChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sIGNvbnN0IGNoYXIgKmVudHJ5KQotewotICBpZiAoZW50cnkpCi0gICAgewotICAgICAgaWYgKGVudHJ5IDwgYXJneiArIGFyZ3pfbGVuKQotICAgICAgICBlbnRyeSA9IHN0cmNociAoZW50cnksICdcMCcpICsgMTsKLQotICAgICAgcmV0dXJuIGVudHJ5ID49IGFyZ3ogKyBhcmd6X2xlbiA/IE5VTEwgOiAoY2hhciAqKSBlbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICBpZiAoYXJnel9sZW4gPiAwKQotICAgICAgcmV0dXJuIGFyZ3o7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci19Ci0jIHVuZGVmIF9fYXJnel9uZXh0Ci0jIGRlZmluZSBfX2FyZ3pfbmV4dChhcmd6LCBsZW4sIGVudHJ5KSBhcmd6X25leHRfXyAoYXJneiwgbGVuLCBlbnRyeSkKLSNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfQVJHWl9ORVhUICovCi0KLQotLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3AgKGludCB4KQotewotICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0gIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0gIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLQwKLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwKLQkJICAgIGludCBtYXNrLCBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAotCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsCi0JCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKQotewotICBjaGFyICphYnNfZmlsZW5hbWU7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsYXN0cDsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjaGFyICpjcDsKLSAgc2l6ZV90IGRpcmxpc3RfY291bnQ7Ci0gIHNpemVfdCBlbnRyaWVzOwotICBpbnQgY250OwotCi0gIC8qIElmIExBTkdVQUdFIGNvbnRhaW5zIGFuIGFic29sdXRlIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLCB3ZSBpZ25vcmUKLSAgICAgRElSTElTVC4gICovCi0gIGlmIChJU19BQlNPTFVURV9QQVRIIChsYW5ndWFnZSkpCi0gICAgZGlybGlzdF9sZW4gPSAwOwotCi0gIC8qIEFsbG9jYXRlIHJvb20gZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4gICovCi0gIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KLQkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKLQkJCQkgICsgKChtYXNrICYgWFBHX1RFUlJJVE9SWSkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChjb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfTU9ESUZJRVIpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKLQkJCQkgICsgMSArIHN0cmxlbiAoZmlsZW5hbWUpICsgMSk7Ci0KLSAgaWYgKGFic19maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENvbnN0cnVjdCBmaWxlIG5hbWUuICAqLwotICBjcCA9IGFic19maWxlbmFtZTsKLSAgaWYgKGRpcmxpc3RfbGVuID4gMCkKLSAgICB7Ci0gICAgICBtZW1jcHkgKGNwLCBkaXJsaXN0LCBkaXJsaXN0X2xlbik7Ci0gICAgICBfX2FyZ3pfc3RyaW5naWZ5IChjcCwgZGlybGlzdF9sZW4sIFBBVEhfU0VQQVJBVE9SKTsKLSAgICAgIGNwICs9IGRpcmxpc3RfbGVuOwotICAgICAgY3BbLTFdID0gJy8nOwotICAgIH0KLQotICBjcCA9IHN0cGNweSAoY3AsIGxhbmd1YWdlKTsKLQotICBpZiAoKG1hc2sgJiBYUEdfVEVSUklUT1JZKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJ18nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIGNvZGVzZXQpOwotICAgIH0KLSAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcuJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19NT0RJRklFUikgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICdAJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotICAgIH0KLQotICAqY3ArKyA9ICcvJzsKLSAgc3RwY3B5IChjcCwgZmlsZW5hbWUpOwotCi0gIC8qIExvb2sgaW4gbGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zIHdoZXRoZXIgaXQgaXMgYWxyZWFkeQotICAgICBhdmFpbGFibGUuICAqLwotICBsYXN0cCA9IGwxMG5maWxlX2xpc3Q7Ci0gIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCi0gICAgaWYgKHJldHZhbC0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICAgIHsKLQlpbnQgY29tcGFyZSA9IHN0cmNtcCAocmV0dmFsLT5maWxlbmFtZSwgYWJzX2ZpbGVuYW1lKTsKLQlpZiAoY29tcGFyZSA9PSAwKQotCSAgLyogV2UgZm91bmQgaXQhICAqLwotCSAgYnJlYWs7Ci0JaWYgKGNvbXBhcmUgPCAwKQotCSAgewotCSAgICAvKiBJdCdzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICAgIHJldHZhbCA9IE5VTEw7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JbGFzdHAgPSAmcmV0dmFsLT5uZXh0OwotICAgICAgfQotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCB8fCBkb19hbGxvY2F0ZSA9PSAwKQotICAgIHsKLSAgICAgIGZyZWUgKGFic19maWxlbmFtZSk7Ci0gICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KLQotICBkaXJsaXN0X2NvdW50ID0gKGRpcmxpc3RfbGVuID4gMCA/IF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pIDogMSk7Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgbG9hZGVkX2wxMG5maWxlLiAgKi8KLSAgcmV0dmFsID0KLSAgICAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKQotICAgIG1hbGxvYyAoc2l6ZW9mICgqcmV0dmFsKQotCSAgICArICgoKGRpcmxpc3RfY291bnQgPDwgcG9wIChtYXNrKSkgKyAoZGlybGlzdF9jb3VudCA+IDEgPyAxIDogMCkpCi0JICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0KLSAgLyogV2Ugc2V0IHJldHZhbC0+ZGF0YSB0byBOVUxMIGhlcmU7IGl0IGlzIGZpbGxlZCBpbiBsYXRlci4KLSAgICAgU2V0dGluZyByZXR2YWwtPmRlY2lkZWQgdG8gMSBoZXJlIG1lYW5zIHRoYXQgcmV0dmFsIGRvZXMgbm90Ci0gICAgIGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGUgKGRpcmxpc3RfY291bnQgPiAxKSBvciBpcyBub3Qgd29ydGgKLSAgICAgbG9va2luZyB1cCAoaWYgYW4gdW5ub3JtYWxpemVkIGNvZGVzZXQgd2FzIHNwZWNpZmllZCkuICAqLwotICByZXR2YWwtPmRlY2lkZWQgPSAoZGlybGlzdF9jb3VudCA+IDEKLQkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwotICByZXR2YWwtPmRhdGEgPSBOVUxMOwotCi0gIHJldHZhbC0+bmV4dCA9ICpsYXN0cDsKLSAgKmxhc3RwID0gcmV0dmFsOwotCi0gIGVudHJpZXMgPSAwOwotICAvKiBSZWN1cnNlIHRvIGZpbGwgdGhlIGluaGVyaXRhbmNlIGxpc3Qgb2YgUkVUVkFMLgotICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCAoaS5lLiBESVJMSVNUX0NPVU5UID4gMSksIHRoZSBSRVRWQUwKLSAgICAgZW50cnkgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZTsgcmV0dmFsLT5maWxlbmFtZSBjb250YWlucwotICAgICBjb2xvbnMuICBJbiB0aGlzIGNhc2Ugd2UgbG9vcCBhY3Jvc3MgYWxsIGVsZW1lbnRzIG9mIERJUkxJU1QgYW5kCi0gICAgIGFjcm9zcyBhbGwgYml0IHBhdHRlcm5zIGRvbWluYXRlZCBieSBNQVNLLgotICAgICBJZiB0aGUgRElSTElTVCBpcyBhIHNpbmdsZSBkaXJlY3Rvcnkgb3IgZW50aXJlbHkgcmVkdW5kYW50IChpLmUuCi0gICAgIERJUkxJU1RfQ09VTlQgPT0gMSksIHdlIGxvb3AgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5Ci0gICAgIE1BU0ssIGV4Y2x1ZGluZyBNQVNLIGl0c2VsZi4KLSAgICAgSW4gZWl0aGVyIGNhc2UsIHdlIGxvb3AgZG93biBmcm9tIE1BU0sgdG8gMC4gIFRoaXMgaGFzIHRoZSBlZmZlY3QKLSAgICAgdGhhdCB0aGUgZXh0cmEgYml0cyBpbiB0aGUgbG9jYWxlIG5hbWUgYXJlIGRyb3BwZWQgaW4gdGhpcyBvcmRlcjoKLSAgICAgZmlyc3QgdGhlIG1vZGlmaWVyLCB0aGVuIHRoZSB0ZXJyaXRvcnksIHRoZW4gdGhlIGNvZGVzZXQsIHRoZW4gdGhlCi0gICAgIG5vcm1hbGl6ZWRfY29kZXNldC4gICovCi0gIGZvciAoY250ID0gZGlybGlzdF9jb3VudCA+IDEgPyBtYXNrIDogbWFzayAtIDE7IGNudCA+PSAwOyAtLWNudCkKLSAgICBpZiAoKGNudCAmIH5tYXNrKSA9PSAwCi0JJiYgISgoY250ICYgWFBHX0NPREVTRVQpICE9IDAgJiYgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApKQotICAgICAgewotCWlmIChkaXJsaXN0X2NvdW50ID4gMSkKLQkgIHsKLQkgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0JICAgIGNoYXIgKmRpciA9IE5VTEw7Ci0KLQkgICAgd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCi0JCSAgICE9IE5VTEwpCi0JICAgICAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotCQk9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLAotCQkJCSAgICAgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJCQkgICAgICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBmaWxlbmFtZSwKLQkJCQkgICAgICAxKTsKLQkgIH0KLQllbHNlCi0JICByZXR2YWwtPnN1Y2Nlc3NvcltlbnRyaWVzKytdCi0JICAgID0gX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwKLQkJCQkgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKLQkJCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIGZpbGVuYW1lLCAxKTsKLSAgICAgIH0KLSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi0vKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0Ci0gICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgotICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCi0gICBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KLWNvbnN0IGNoYXIgKgotX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LCBzaXplX3QgbmFtZV9sZW4pCi17Ci0gIGludCBsZW4gPSAwOwotICBpbnQgb25seV9kaWdpdCA9IDE7Ci0gIGNoYXIgKnJldHZhbDsKLSAgY2hhciAqd3A7Ci0gIHNpemVfdCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0gICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQotICAgICAgewotCSsrbGVuOwotCi0JaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQotCSAgb25seV9kaWdpdCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jICgob25seV9kaWdpdCA/IDMgOiAwKSArIGxlbiArIDEpOwotCi0gIGlmIChyZXR2YWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAob25seV9kaWdpdCkKLQl3cCA9IHN0cGNweSAocmV0dmFsLCAiaXNvIik7Ci0gICAgICBlbHNlCi0Jd3AgPSByZXR2YWw7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSk7Ci0JZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IGNvZGVzZXRbY250XTsKLQotICAgICAgKndwID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIHJldHZhbDsKLX0KLQotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKLSAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCi0gICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQotICAgdG8gYmUgZGVmaW5lZC4gICovCi0jaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKgotc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCi17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9sYW5ncHJlZnMuYyBiL2ludGwvbGFuZ3ByZWZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzhkZWYuLjAwMDAwMDAKLS0tIGEvaW50bC9sYW5ncHJlZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKiBEZXRlcm1pbmUgdGhlIHVzZXIncyBsYW5ndWFnZSBwcmVmZXJlbmNlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByZWZlcmVuY2VzLmg+Ci0jIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGUHJvcGVydHlMaXN0Lmg+Ci0jIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGQXJyYXkuaD4KLSMgaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZTdHJpbmcuaD4KLWV4dGVybiB2b2lkIF9ubF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGNoYXIgKm5hbWUpOwotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgdXNlcidzIGxhbmd1YWdlIHByZWZlcmVuY2VzLCBhcyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mCi0gICBsb2NhbGUgbmFtZXMgaW4gWFBHIHN5bnRheAotICAgICBsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXQotICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCi0gICBUaGUgTEFOR1VBR0UgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgbmVlZCB0byBiZSBjb25zaWRlcmVkOyBpdCBpcwotICAgYWxyZWFkeSB0YWtlbiBpbnRvIGFjY291bnQgYnkgdGhlIGNhbGxlci4gICovCi0KLWNvbnN0IGNoYXIgKgotX25sX2xhbmd1YWdlX3ByZWZlcmVuY2VzX2RlZmF1bHQgKHZvaWQpCi17Ci0jaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIC8qIE1hY09TIFggMTAuMiBvciBuZXdlciAqLwotICB7Ci0gICAgLyogQ2FjaGUgdGhlIHByZWZlcmVuY2VzIGxpc3QsIHNpbmNlIENvcmVGb3VuZGF0aW9uIGNhbGxzIGFyZSBleHBlbnNpdmUuICAqLwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjYWNoZWRfbGFuZ3VhZ2VzOwotICAgIHN0YXRpYyBpbnQgY2FjaGVfaW5pdGlhbGl6ZWQ7Ci0KLSAgICBpZiAoIWNhY2hlX2luaXRpYWxpemVkKQotICAgICAgewotCUNGVHlwZVJlZiBwcmVmZXJlbmNlcyA9Ci0JICBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIChDRlNUUiAoIkFwcGxlTGFuZ3VhZ2VzIiksCi0JCQkJICAgICBrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7Ci0JaWYgKHByZWZlcmVuY2VzICE9IE5VTEwKLQkgICAgJiYgQ0ZHZXRUeXBlSUQgKHByZWZlcmVuY2VzKSA9PSBDRkFycmF5R2V0VHlwZUlEICgpKQotCSAgewotCSAgICBDRkFycmF5UmVmIHByZWZBcnJheSA9IChDRkFycmF5UmVmKXByZWZlcmVuY2VzOwotCSAgICBpbnQgbiA9IENGQXJyYXlHZXRDb3VudCAocHJlZkFycmF5KTsKLQkgICAgY2hhciBidWZbMjU2XTsKLQkgICAgc2l6ZV90IHNpemUgPSAwOwotCSAgICBpbnQgaTsKLQotCSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCSAgICAgIHsKLQkJQ0ZUeXBlUmVmIGVsZW1lbnQgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4IChwcmVmQXJyYXksIGkpOwotCQlpZiAoZWxlbWVudCAhPSBOVUxMCi0JCSAgICAmJiBDRkdldFR5cGVJRCAoZWxlbWVudCkgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQgKCkKLQkJICAgICYmIENGU3RyaW5nR2V0Q1N0cmluZyAoKENGU3RyaW5nUmVmKWVsZW1lbnQsCi0JCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpLAotCQkJCQkgICBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSkKLQkJICB7Ci0JCSAgICBfbmxfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChidWYpOwotCQkgICAgc2l6ZSArPSBzdHJsZW4gKGJ1ZikgKyAxOwotCQkgICAgLyogTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIG1zZ2lkcyBpbiBFbmdsaXNoIGFuZCBkb24ndCBzaGlwCi0JCSAgICAgICBhbiBlbi5tbyBtZXNzYWdlIGNhdGFsb2cuICBUaGVyZWZvcmUgd2hlbiB3ZSBzZWUgImVuIgotCQkgICAgICAgaW4gdGhlIHByZWZlcmVuY2VzIGxpc3QsIGFycmFuZ2UgZm9yIGdldHRleHQoKSB0bwotCQkgICAgICAgcmV0dXJuIHRoZSBtc2dpZCwgYW5kIGlnbm9yZSBhbGwgZnVydGhlciBlbGVtZW50cyBvZgotCQkgICAgICAgdGhlIHByZWZlcmVuY2VzIGxpc3QuICAqLwotCQkgICAgaWYgKHN0cmNtcCAoYnVmLCAiZW4iKSA9PSAwKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCWVsc2UKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChzaXplID4gMCkKLQkgICAgICB7Ci0JCWNoYXIgKmxhbmd1YWdlcyA9IChjaGFyICopIG1hbGxvYyAoc2l6ZSk7Ci0KLQkJaWYgKGxhbmd1YWdlcyAhPSBOVUxMKQotCQkgIHsKLQkJICAgIGNoYXIgKnAgPSBsYW5ndWFnZXM7Ci0KLQkJICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCSAgICAgIHsKLQkJCUNGVHlwZVJlZiBlbGVtZW50ID0KLQkJCSAgQ0ZBcnJheUdldFZhbHVlQXRJbmRleCAocHJlZkFycmF5LCBpKTsKLQkJCWlmIChlbGVtZW50ICE9IE5VTEwKLQkJICAgICAgICAgICAgJiYgQ0ZHZXRUeXBlSUQgKGVsZW1lbnQpID09IENGU3RyaW5nR2V0VHlwZUlEICgpCi0JCQkgICAgJiYgQ0ZTdHJpbmdHZXRDU3RyaW5nICgoQ0ZTdHJpbmdSZWYpZWxlbWVudCwKLQkJCQkJCSAgIGJ1Ziwgc2l6ZW9mIChidWYpLAotCQkJCQkJICAga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSkpCi0JCQkgIHsKLQkJCSAgICBfbmxfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChidWYpOwotCQkJICAgIHN0cmNweSAocCwgYnVmKTsKLQkJCSAgICBwICs9IHN0cmxlbiAoYnVmKTsKLQkJCSAgICAqcCsrID0gJzonOwotCQkJICAgIGlmIChzdHJjbXAgKGJ1ZiwgImVuIikgPT0gMCkKLQkJCSAgICAgIGJyZWFrOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0JCSAgICAqLS1wID0gJ1wwJzsKLQotCQkgICAgY2FjaGVkX2xhbmd1YWdlcyA9IGxhbmd1YWdlczsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWNhY2hlX2luaXRpYWxpemVkID0gMTsKLSAgICAgIH0KLSAgICBpZiAoY2FjaGVkX2xhbmd1YWdlcyAhPSBOVUxMKQotICAgICAgcmV0dXJuIGNhY2hlZF9sYW5ndWFnZXM7Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9saWJnbnVpbnRsLmguaW4gYi9pbnRsL2xpYmdudWludGwuaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkYTc5OC4uMDAwMDAwMAotLS0gYS9pbnRsL2xpYmdudWludGwuaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfTElCSU5UTF9ICi0jZGVmaW5lIF9MSUJJTlRMX0gJMQotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLS8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucwotICAgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpLiAgSXQgaXMgc3BlY2lmaWVkIGluIFBPU0lYLCBidXQgbm90IGluIEFOU0kgQy4KLSAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBkZWZpbmUgaXQsIHVzZSBhbiBhcmJpdHJhcnkgdmFsdWUgaW5zdGVhZC4KLSAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCi0gICB0aGVuIGluY2x1ZGVzIDxsaWJpbnRsLmg+IChpLmUuIHRoaXMgZmlsZSEpIGFuZCB0aGVuIG9ubHkgZGVmaW5lcwotICAgTENfTUVTU0FHRVMuICBUbyBhdm9pZCBhIHJlZGVmaW5pdGlvbiB3YXJuaW5nLCBkb24ndCBkZWZpbmUgTENfTUVTU0FHRVMKLSAgIGluIHRoaXMgY2FzZS4gICovCi0jaWYgIWRlZmluZWQgTENfTUVTU0FHRVMgJiYgIShkZWZpbmVkIF9fTE9DQUxFX0ggfHwgKGRlZmluZWQgX0xPQ0FMRV9IICYmIGRlZmluZWQgX19zdW4pKQotIyBkZWZpbmUgTENfTUVTU0FHRVMgMTcyOQotI2VuZGlmCi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCi0gICBtYXhpbXVtIG1pbm9yIHJldmlzaW9uIG51bWJlciBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gbWFqb3IgcmV2aXNpb24uICAqLwotI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgXAotICAoKG1ham9yKSA9PSAwIHx8IChtYWpvcikgPT0gMSA/IDEgOiAtMSkKLQotLyogUmVzb2x2ZSBhIHBsYXRmb3JtIHNwZWNpZmljIGNvbmZsaWN0IG9uIERKR1BQLiAgR05VIGdldHRleHQgdGFrZXMKLSAgIHByZWNlZGVuY2Ugb3ZlciBfY29uaW9fZ2V0dGV4dC4gICovCi0jaWZkZWYgX19ESkdQUF9fCi0jIHVuZGVmIGdldHRleHQKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogVmVyc2lvbiBudW1iZXI6IChtYWpvcjw8MTYpICsgKG1pbm9yPDw4KSArIHN1Ym1pbm9yICovCi0jZGVmaW5lIExJQklOVExfVkVSU0lPTiAweDAwMTEwMAotZXh0ZXJuIGludCBsaWJpbnRsX3ZlcnNpb247Ci0KLQotLyogV2UgcmVkaXJlY3QgdGhlIGZ1bmN0aW9ucyB0byB0aG9zZSBwcmVmaXhlZCB3aXRoICJsaWJpbnRsXyIuICBUaGlzIGlzCi0gICBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGRlZmluZSBnZXR0ZXh0L3RleHRkb21haW4vLi4uIGluIHRoZSBDCi0gICBsaWJyYXJ5IChuYW1lbHksIFNvbGFyaXMgMi40IGFuZCBuZXdlciwgYW5kIEdOVSBsaWJjIDIuMCBhbmQgbmV3ZXIpLgotICAgSWYgd2UgdXNlZCB0aGUgdW5wcmVmaXhlZCBuYW1lcywgdGhlcmUgd291bGQgYmUgY2FzZXMgd2hlcmUgdGhlCi0gICBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiB0aGUgbGliaW50bC5zbwotICAgc2hhcmVkIGxpYnJhcnkuICBSZWNhbGwgdGhhdCBvbiBFTEYgc3lzdGVtcywgdGhlIHN5bWJvbHMgYXJlIGxvb2tlZAotICAgdXAgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAgMS4gaW4gdGhlIGV4ZWN1dGFibGUsCi0gICAgIDIuIGluIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUsIGluIG9yZGVyLAotICAgICAzLiBpbiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluawotICAgICAgICBjb21tYW5kIGxpbmUsCi0gICAgIDQuIGluIHRoZSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJpZXMsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUKLSAgICAgICAgZGxvcGVuKCllZC4KLSAgIFRoZSBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiBsaWJpbnRsLnNvIGlmCi0gICBlaXRoZXIKLSAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGFuZCAtbGludGwgaXNuJ3QsIG9yCi0gICAgICogLWxjIGlzIGdpdmVuIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBiZWZvcmUgLWxpbnRsLCBvcgotICAgICAqIGxpYmludGwuc28gaXMgYSBkZXBlbmRlbmN5IG9mIGEgZGxvcGVuKCllZCBzaGFyZWQgbGlicmFyeSBidXQgbm90Ci0gICAgICAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGF0IGxpbmsgdGltZS4KLSAgIFNpbmNlIFNvbGFyaXMgZ2V0dGV4dCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiBHTlUgZ2V0dGV4dCgpLCB0aGlzCi0gICB3b3VsZCBiZSB1bmFjY2VwdGFibGUuCi0KLSAgIFRoZSByZWRpcmVjdGlvbiBoYXBwZW5zIGJ5IGRlZmF1bHQgdGhyb3VnaCBtYWNyb3MgaW4gQywgc28gdGhhdCAmZ2V0dGV4dAotICAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIGJ1dCB0aHJvdWdoIGlubGluZSBmdW5jdGlvbnMgaW4KLSAgIEMrKywgaW4gb3JkZXIgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGNsYXNzIGZpZWxkcyBvcgotICAgY2xhc3MgbWV0aG9kcyBjYWxsZWQgJ2dldHRleHQnLiAgKi8KLQotLyogVGhlIHVzZXIgY2FuIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUgb3IgX0lOVExfUkVESVJFQ1RfTUFDUk9TLgotICAgSWYgaGUgZG9lc24ndCwgd2UgY2hvb3NlIHRoZSBtZXRob2QuICBBIHRoaXJkIHBvc3NpYmxlIG1ldGhvZCBpcwotICAgX0lOVExfUkVESVJFQ1RfQVNNLCBzdXBwb3J0ZWQgb25seSBieSBHQ0MuICAqLwotI2lmICEoZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9JTkxJTkUgfHwgZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9NQUNST1MpCi0jIGlmIF9fR05VQ19fID49IDIgJiYgIShfX0FQUExFX0NDX18gPiAxKSAmJiAhZGVmaW5lZCBfX01JTkdXMzJfXyAmJiAhKF9fR05VQ19fID09IDIgJiYgZGVmaW5lZCBfQUlYKSAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzKQotIyAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX0FTTQotIyBlbHNlCi0jICBpZmRlZiBfX2NwbHVzcGx1cwotIyAgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLSMgIGVsc2UKLSMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0vKiBBdXhpbGlhcnkgbWFjcm9zLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9BU00KLSMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkgX19hc21fXyAoX0lOVExfQVNNTkFNRSAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCAjY25hbWUpKQotIyBkZWZpbmUgX0lOVExfQVNNTkFNRShwcmVmaXgsY25hbWVzdHJpbmcpIF9JTlRMX1NUUklOR0lGWSAocHJlZml4KSBjbmFtZXN0cmluZwotIyBkZWZpbmUgX0lOVExfU1RSSU5HSUZZKHByZWZpeCkgI3ByZWZpeAotI2Vsc2UKLSMgZGVmaW5lIF9JTlRMX0FTTShjbmFtZSkKLSNlbmRpZgotCi0vKiBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcobikgZGVjbGFyZXMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gbWF5IHJldHVybgotICAgaXRzIG4tdGggYXJndW1lbnQgbGl0ZXJhbGx5LiAgVGhpcyBlbmFibGVzIEdDQyB0byB3YXJuIGZvciBleGFtcGxlIGFib3V0Ci0gICBwcmludGYgKGdldHRleHQgKCJmb28gJXkiKSkuICAqLwotI2lmIF9fR05VQ19fID49IDMgJiYgIShfX0FQUExFX0NDX18gPiAxICYmIGRlZmluZWQgX19jcGx1c3BsdXMpCi0jIGRlZmluZSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcobikgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fIChuKSkpCi0jZWxzZQotIyBkZWZpbmUgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHKG4pCi0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0Ci0gICB0ZXh0KS4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi1leHRlcm4gY2hhciAqbGliaW50bF9nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQotICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSk7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCi17Ci0gIHJldHVybiBsaWJpbnRsX2dldHRleHQgKF9fbXNnaWQpOwotfQotI2Vsc2UKLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKLSMgZGVmaW5lIGdldHRleHQgbGliaW50bF9nZXR0ZXh0Ci0jZW5kaWYKLWV4dGVybiBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9nZXR0ZXh0KQotICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMSk7Ci0jZW5kaWYKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotc3RhdGljIGlubGluZSBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotewotICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkZ2V0dGV4dCBsaWJpbnRsX2RnZXR0ZXh0Ci0jZW5kaWYKLWV4dGVybiBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kZ2V0dGV4dCkKLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJCWludCBfX2NhdGVnb3J5KQotICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMik7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAotCQkJICAgICAgIGludCBfX2NhdGVnb3J5KQotewotICByZXR1cm4gbGliaW50bF9kY2dldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCwgX19jYXRlZ29yeSk7Ci19Ci0jZWxzZQotI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgZGNnZXR0ZXh0IGxpYmludGxfZGNnZXR0ZXh0Ci0jZW5kaWYKLWV4dGVybiBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCWludCBfX2NhdGVnb3J5KQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY2dldHRleHQpCi0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKTsKLSNlbmRpZgotCi0KLS8qIFNpbWlsYXIgdG8gYGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICBudW1iZXIgTi4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi1leHRlcm4gY2hhciAqbGliaW50bF9uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLSAgICAgICBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDEpIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMik7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCi17Ci0gIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Ci19Ci0jZWxzZQotI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgbmdldHRleHQgbGliaW50bF9uZ2V0dGV4dAotI2VuZGlmCi1leHRlcm4gY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpCi0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgxKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDIpOwotI2VuZGlmCi0KLS8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgbnVtYmVyIE4uICAqLwotI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQotZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAotCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pCi0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDMpOwotc3RhdGljIGlubGluZSBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCi0JCQkgICAgICAgY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKLXsKLSAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkbmdldHRleHQgbGliaW50bF9kbmdldHRleHQKLSNlbmRpZgotZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kbmdldHRleHQpCi0gICAgICAgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgyKSBfSU5UTF9NQVlfUkVUVVJOX1NUUklOR19BUkcgKDMpOwotI2VuZGlmCi0KLS8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKLSAgIG51bWJlciBOLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAotCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMikgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgzKTsKLXN0YXRpYyBpbmxpbmUgY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJCQl1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotewotICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBkY25nZXR0ZXh0IGxpYmludGxfZGNuZ2V0dGV4dAotI2VuZGlmCi1leHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKLQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KQotICAgICAgIF9JTlRMX01BWV9SRVRVUk5fU1RSSU5HX0FSRyAoMikgX0lOVExfTUFZX1JFVFVSTl9TVFJJTkdfQVJHICgzKTsKLSNlbmRpZgotCi0KLSNpZm5kZWYgSU5fTElCR0xPQ0FMRQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7Ci1zdGF0aWMgaW5saW5lIGNoYXIgKnRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkKLXsKLSAgcmV0dXJuIGxpYmludGxfdGV4dGRvbWFpbiAoX19kb21haW5uYW1lKTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSB0ZXh0ZG9tYWluIGxpYmludGxfdGV4dGRvbWFpbgotI2VuZGlmCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF90ZXh0ZG9tYWluKTsKLSNlbmRpZgotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLSNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKLWV4dGVybiBjaGFyICpsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOwotc3RhdGljIGlubGluZSBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCi17Ci0gIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUsIF9fZGlybmFtZSk7Ci19Ci0jZWxzZQotI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUwotIyBkZWZpbmUgYmluZHRleHRkb21haW4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgotI2VuZGlmCi1leHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19kaXJuYW1lKQotICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kdGV4dGRvbWFpbik7Ci0jZW5kaWYKLQotLyogU3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHdoaWNoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZQotICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCi1leHRlcm4gY2hhciAqbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCQkgICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpOwotc3RhdGljIGlubGluZSBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKLXsKLSAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKF9fZG9tYWlubmFtZSwgX19jb2Rlc2V0KTsKLX0KLSNlbHNlCi0jaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCi0jIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0Ci0jZW5kaWYKLWV4dGVybiBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKLSAgICAgICBfSU5UTF9BU00gKGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBJTl9MSUJHTE9DQUxFICovCi0KLQotLyogU3VwcG9ydCBmb3IgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMgaW4gKnByaW50ZigpLCBmb2xsb3dpbmcgdGhlCi0gICBQT1NJWC9YU0kgc3BlY2lmaWNhdGlvbi4KLSAgIE5vdGU6IFRoZXNlIHJlcGxhY2VtZW50cyBmb3IgdGhlICpwcmludGYoKSBmdW5jdGlvbnMgYXJlIHZpc2libGUgb25seQotICAgaW4gc291cmNlIGZpbGVzIHRoYXQgI2luY2x1ZGUgPGxpYmludGwuaD4gb3IgI2luY2x1ZGUgImdldHRleHQuaCIuCi0gICBQYWNrYWdlcyB0aGF0IHVzZSAqcHJpbnRmKCkgaW4gc291cmNlIGZpbGVzIHRoYXQgZG9uJ3QgcmVmZXIgdG8gXygpCi0gICBvciBnZXR0ZXh0KCkgYnV0IGZvciB3aGljaCB0aGUgZm9ybWF0IHN0cmluZyBjb3VsZCBiZSB0aGUgcmV0dXJuIHZhbHVlCi0gICBvZiBfKCkgb3IgZ2V0dGV4dCgpIG5lZWQgdG8gYWRkIHRoaXMgI2luY2x1ZGUuICBPaCB3ZWxsLiAgKi8KLQotI2lmICFASEFWRV9QT1NJWF9QUklOVEZACi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBHZXQgdmFfbGlzdC4gICovCi0jaWYgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSCi0jIGluY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSN1bmRlZiBmcHJpbnRmCi0jZGVmaW5lIGZwcmludGYgbGliaW50bF9mcHJpbnRmCi1leHRlcm4gaW50IGZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotI3VuZGVmIHZmcHJpbnRmCi0jZGVmaW5lIHZmcHJpbnRmIGxpYmludGxfdmZwcmludGYKLWV4dGVybiBpbnQgdmZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLQotI3VuZGVmIHByaW50ZgotI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9fQkVPU19fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fTUlOR1czMl9fCi0vKiBEb24ndCBicmVhayBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLE0sTikpKS4KLSAgIFRoaXMgcmVkZWZpbml0aW9uIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSB0aGUgbGliYyBpbiBOZXRCU0QsIEN5Z3dpbiwKLSAgIG1pbmd3IGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBfX3ByaW50Zl9fLiAgKi8KLSMgZGVmaW5lIGxpYmludGxfcHJpbnRmIF9fcHJpbnRmX18KLSNlbmRpZgotI2RlZmluZSBwcmludGYgbGliaW50bF9wcmludGYKLWV4dGVybiBpbnQgcHJpbnRmIChjb25zdCBjaGFyICosIC4uLik7Ci0jdW5kZWYgdnByaW50ZgotI2RlZmluZSB2cHJpbnRmIGxpYmludGxfdnByaW50ZgotZXh0ZXJuIGludCB2cHJpbnRmIChjb25zdCBjaGFyICosIHZhX2xpc3QpOwotCi0jdW5kZWYgc3ByaW50ZgotI2RlZmluZSBzcHJpbnRmIGxpYmludGxfc3ByaW50ZgotZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKLSN1bmRlZiB2c3ByaW50ZgotI2RlZmluZSB2c3ByaW50ZiBsaWJpbnRsX3ZzcHJpbnRmCi1leHRlcm4gaW50IHZzcHJpbnRmIChjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7Ci0KLSNpZiBASEFWRV9TTlBSSU5URkAKLQotI3VuZGVmIHNucHJpbnRmCi0jZGVmaW5lIHNucHJpbnRmIGxpYmludGxfc25wcmludGYKLWV4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7Ci0jdW5kZWYgdnNucHJpbnRmCi0jZGVmaW5lIHZzbnByaW50ZiBsaWJpbnRsX3ZzbnByaW50ZgotZXh0ZXJuIGludCB2c25wcmludGYgKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotCi0jZW5kaWYKLQotI2lmIEBIQVZFX0FTUFJJTlRGQAotCi0jdW5kZWYgYXNwcmludGYKLSNkZWZpbmUgYXNwcmludGYgbGliaW50bF9hc3ByaW50ZgotZXh0ZXJuIGludCBhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOwotI3VuZGVmIHZhc3ByaW50ZgotI2RlZmluZSB2YXNwcmludGYgbGliaW50bF92YXNwcmludGYKLWV4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwotCi0jZW5kaWYKLQotI2lmIEBIQVZFX1dQUklOVEZACi0KLSN1bmRlZiBmd3ByaW50ZgotI2RlZmluZSBmd3ByaW50ZiBsaWJpbnRsX2Z3cHJpbnRmCi1leHRlcm4gaW50IGZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKLSN1bmRlZiB2ZndwcmludGYKLSNkZWZpbmUgdmZ3cHJpbnRmIGxpYmludGxfdmZ3cHJpbnRmCi1leHRlcm4gaW50IHZmd3ByaW50ZiAoRklMRSAqLCBjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOwotCi0jdW5kZWYgd3ByaW50ZgotI2RlZmluZSB3cHJpbnRmIGxpYmludGxfd3ByaW50ZgotZXh0ZXJuIGludCB3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIC4uLik7Ci0jdW5kZWYgdndwcmludGYKLSNkZWZpbmUgdndwcmludGYgbGliaW50bF92d3ByaW50ZgotZXh0ZXJuIGludCB2d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKLQotI3VuZGVmIHN3cHJpbnRmCi0jZGVmaW5lIHN3cHJpbnRmIGxpYmludGxfc3dwcmludGYKLWV4dGVybiBpbnQgc3dwcmludGYgKHdjaGFyX3QgKiwgc2l6ZV90LCBjb25zdCB3Y2hhcl90ICosIC4uLik7Ci0jdW5kZWYgdnN3cHJpbnRmCi0jZGVmaW5lIHZzd3ByaW50ZiBsaWJpbnRsX3Zzd3ByaW50ZgotZXh0ZXJuIGludCB2c3dwcmludGYgKHdjaGFyX3QgKiwgc2l6ZV90LCBjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOwotCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotLyogU3VwcG9ydCBmb3IgcmVsb2NhdGFibGUgcGFja2FnZXMuICAqLwotCi0vKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KLSAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4Ci0gICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAotICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgotICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KLSNkZWZpbmUgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKLWV4dGVybiB2b2lkCi0gICAgICAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9pbnRsL2xpYmludGwucmMgYi9pbnRsL2xpYmludGwucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGYwYjMuLjAwMDAwMDAKLS0tIGEvaW50bC9saWJpbnRsLnJjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogUmVzb3VyY2VzIGZvciBpbnRsLmRsbCAqLwotCi0jaW5jbHVkZSA8d2ludmVyLmg+Ci0KLVZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTwotIEZJTEVWRVJTSU9OIFBBQ0tBR0VfVkVSU0lPTl9NQUpPUixQQUNLQUdFX1ZFUlNJT05fTUlOT1IsUEFDS0FHRV9WRVJTSU9OX1NVQk1JTk9SLDAKLSBQUk9EVUNUVkVSU0lPTiBQQUNLQUdFX1ZFUlNJT05fTUFKT1IsUEFDS0FHRV9WRVJTSU9OX01JTk9SLFBBQ0tBR0VfVkVSU0lPTl9TVUJNSU5PUiwwCi0gRklMRUZMQUdTTUFTSyAweDNmTCAvKiBWU19GRklfRklMRUZMQUdTTUFTSyAqLwotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDFMICAvKiBWU19GRl9ERUJVRyAqLwotI2Vsc2UKLSBGSUxFRkxBR1MgMHgwTAotI2VuZGlmCi0gRklMRU9TIDB4MTAwMDRMICAvKiBWT1NfRE9TX1dJTkRPV1MzMiAqLwotIEZJTEVUWVBFIDB4MkwgIC8qIFZGVF9ETEwgKi8KLSBGSUxFU1VCVFlQRSAweDBMICAvKiBWRlQyX1VOS05PV04gKi8KLUJFR0lOCi0gICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIEJMT0NLICIwNDA5MDAwMCIgIC8qIExhbmcgPSBVUyBFbmdsaXNoLCBDaGFyc2V0ID0gQVNDSUkgKi8KLSAgICAgICAgQkVHSU4KLSAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsICJUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0FcMCIKLSAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb25cMCIKLSAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiTEdQTGVkIGxpYmludGwgZm9yIFdpbmRvd3MgTlQvMjAwMC9YUC9WaXN0YSBhbmQgV2luZG93cyA5NS85OC9NRVwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgUEFDS0FHRV9WRVJTSU9OX1NUUklORyAiXDAiCi0gICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImludGwuZGxsXDAiCi0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAxOTk1LTIwMDdcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCi0gICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJpbnRsLmRsbFwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgImxpYmludGw6IGFjY2Vzc2luZyBOTFMgbWVzc2FnZSBjYXRhbG9nc1wwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgUEFDS0FHRV9WRVJTSU9OX1NUUklORyAiXDAiCi0gICAgICAgIEVORAotICAgIEVORAotICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgICBCRUdJTgotICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDAgIC8qIFVTIEVuZ2xpc2gsIEFTQ0lJICovCi0gICAgRU5ECi1FTkQKZGlmZiAtLWdpdCBhL2ludGwvbG9hZGluZm8uaCBiL2ludGwvbG9hZGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhMTk3MC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvYWRpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCi0gICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9MT0FESU5GT19ICi0jZGVmaW5lIF9MT0FESU5GT19ICTEKLQotLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsZSBkZXBlbmRlbnQgY2F0YWxvZyBsb29rdXAgZnVuY3Rpb25zLgotICAgSW1wbGVtZW50ZWQgaW4KLQotICAgICBsb2NhbGVhbGlhcy5jICAgIFBvc3NpYmx5IHJlcGxhY2UgYSBsb2NhbGUgbmFtZSBieSBhbm90aGVyLgotICAgICBleHBsb2RlbmFtZS5jICAgIFNwbGl0IGEgbG9jYWxlIG5hbWUgaW50byBpdHMgdmFyaW91cyBmaWVsZHMuCi0gICAgIGwxMG5mbGlzdC5jICAgICAgR2VuZXJhdGUgYSBsaXN0IG9mIGZpbGVuYW1lcyBvZiBwb3NzaWJsZSBtZXNzYWdlIGNhdGFsb2dzLgotICAgICBmaW5kZG9tYWluLmMgICAgIEZpbmQgYW5kIG9wZW4gdGhlIHJlbGV2YW50IG1lc3NhZ2UgY2F0YWxvZ3MuCi0KLSAgIFRoZSBtYWluIGZ1bmN0aW9uIF9ubF9maW5kX2RvbWFpbigpIGluIGZpbmRkb21haW4uYyBpcyBkZWNsYXJlZAotICAgaW4gZ2V0dGV4dFAuaC4KLSAqLwotCi0jaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgTElCSU5UTF9ETExfRVhQT1JURUQKLSMgZGVmaW5lIExJQklOVExfRExMX0VYUE9SVEVECi0jZW5kaWYKLQotLyogVGVsbCB0aGUgY29tcGlsZXIgd2hlbiBhIGNvbmRpdGlvbmFsIG9yIGludGVnZXIgZXhwcmVzc2lvbiBpcwotICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLwotI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCi0jIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KGV4cHIsIHZhbCkgKGV4cHIpCi0jZW5kaWYKLQotLyogU2VwYXJhdG9yIGluIFBBVEggbGlrZSBsaXN0cyBvZiBwYXRobmFtZXMuICAqLwotI2lmICgoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICFkZWZpbmVkIF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCi0jIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOycKLSNlbHNlCi0gIC8qIFVuaXggKi8KLSMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JwotI2VuZGlmCi0KLS8qIEVuY29kaW5nIG9mIGxvY2FsZSBuYW1lIHBhcnRzLiAgKi8KLSNkZWZpbmUgWFBHX05PUk1fQ09ERVNFVAkxCi0jZGVmaW5lIFhQR19DT0RFU0VUCQkyCi0jZGVmaW5lIFhQR19URVJSSVRPUlkJCTQKLSNkZWZpbmUgWFBHX01PRElGSUVSCQk4Ci0KLQotc3RydWN0IGxvYWRlZF9sMTBuZmlsZQotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgaW50IGRlY2lkZWQ7Ci0KLSAgY29uc3Qgdm9pZCAqZGF0YTsKLQotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpuZXh0OwotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpzdWNjZXNzb3JbMV07Ci19OwotCi0KLS8qIE5vcm1hbGl6ZSBjb2Rlc2V0IG5hbWUuICBUaGVyZSBpcyBubyBzdGFuZGFyZCBmb3IgdGhlIGNvZGVzZXQKLSAgIG5hbWVzLiAgTm9ybWFsaXphdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gdXNlIGFueSBvZiB0aGUgY29tbW9uCi0gICBuYW1lcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUKLSAgIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwKLQkJCQkJICBzaXplX3QgbmFtZV9sZW4pOwotCi0vKiBMb29rdXAgYSBsb2NhbGUgZGVwZW5kZW50IGZpbGUuCi0gICAqTDEwTkZJTEVfTElTVCBkZW5vdGVzIGEgcG9vbCBvZiBsb29rdXAgcmVzdWx0cyBvZiBsb2NhbGUgZGVwZW5kZW50Ci0gICBmaWxlcyBvZiB0aGUgc2FtZSBraW5kLCBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlciBvZiAtPmZpbGVuYW1lLgotICAgRElSTElTVCBhbmQgRElSTElTVF9MRU4gYXJlIGFuIGFyZ3ogbGlzdCBvZiBkaXJlY3RvcmllcyBpbiB3aGljaCB0bwotICAgbG9vaywgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgZGlyZWN0b3J5IChpLmUuIERJUkxJU1RfTEVOID4gMCkuCi0gICBNQVNLLCBMQU5HVUFHRSwgVEVSUklUT1JZLCBDT0RFU0VULCBOT1JNQUxJWkVEX0NPREVTRVQsIE1PRElGSUVSCi0gICBhcmUgdGhlIHBpZWNlcyBvZiB0aGUgbG9jYWxlIG5hbWUsIGFzIHByb2R1Y2VkIGJ5IF9ubF9leHBsb2RlX25hbWUoKS4KLSAgIEZJTEVOQU1FIGlzIHRoZSBmaWxlbmFtZSBzdWZmaXguCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsb29rdXAgcmVzdWx0LCBlaXRoZXIgZm91bmQgaW4gKkwxME5GSUxFX0xJU1QsCi0gICBvciAtIGlmIERPX0FMTE9DQVRFIGlzIG5vbnplcm8gLSBmcmVzaGx5IGFsbG9jYXRlZCwgb3IgcG9zc2libHkgTlVMTC4KLSAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLU5VTEwsIGl0IGlzIGFkZGVkIHRvICpMMTBORklMRV9MSVNULCBhbmQKLSAgIGl0cyAtPm5leHQgZmllbGQgZGVub3RlcyB0aGUgY2hhaW5pbmcgaW5zaWRlICpMMTBORklMRV9MSVNULCBhbmQKLSAgIGZ1cnRoZXJtb3JlIGl0cyAtPnN1Y2Nlc3NvcltdIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBvdGhlciBsb29rdXAKLSAgIHJlc3VsdHMgZnJvbSB3aGljaCB0aGlzIGxvb2t1cCByZXN1bHQgaW5oZXJpdHMuICAqLwotZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdCwKLQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0JCSAgICBjb25zdCBjaGFyICpsYW5ndWFnZSwgY29uc3QgY2hhciAqdGVycml0b3J5LAotCQkgICAgY29uc3QgY2hhciAqY29kZXNldCwgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0LAotCQkgICAgY29uc3QgY2hhciAqbW9kaWZpZXIsCi0JCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKTsKLQotLyogTG9va3VwIHRoZSByZWFsIGxvY2FsZSBuYW1lIGZvciBhIGxvY2FsZSBhbGlhcyBOQU1FLCBvciBOVUxMIGlmCi0gICBOQU1FIGlzIG5vdCBhIGxvY2FsZSBhbGlhcyAoYnV0IHBvc3NpYmx5IGEgcmVhbCBsb2NhbGUgbmFtZSkuCi0gICBUaGUgcmV0dXJuIHZhbHVlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4gICovCi0vKiBQYXJ0IG9mIHRoZSBsaWJpbnRsIEFCSSBvbmx5IGZvciB0aGUgc2FrZSBvZiB0aGUgZ2V0dGV4dC5tNCBtYWNyby4gICovCi1leHRlcm4gTElCSU5UTF9ETExfRVhQT1JURUQgY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGl0cyBwaWVjZXM6IGxhbmd1YWdlLCBtb2RpZmllciwKLSAgIHRlcnJpdG9yeSwgY29kZXNldC4KLSAgIE5BTUUgZ2V0cyBkZXN0cnVjdGl2ZWx5IG1vZGlmaWVkOiBOVUwgYnl0ZXMgYXJlIGluc2VydGVkIGhlcmUgYW5kCi0gICB0aGVyZS4gICpMQU5HVUFHRSBnZXRzIGFzc2lnbmVkIE5BTUUuICBFYWNoIG9mICpNT0RJRklFUiwgKlRFUlJJVE9SWSwKLSAgICpDT0RFU0VUIGdldHMgYXNzaWduZWQgZWl0aGVyIGEgcG9pbnRlciBpbnRvIHRoZSBvbGQgTkFNRSBzdHJpbmcsIG9yCi0gICBOVUxMLiAgKk5PUk1BTElaRURfQ09ERVNFVCBnZXRzIGFzc2lnbmVkIHRoZSBleHBhbmRlZCAqQ09ERVNFVCwgaWYgaXQKLSAgIGlzIGRpZmZlcmVudCBmcm9tICpDT0RFU0VUOyB0aGlzIG9uZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcwotICAgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrLCB3aGVyZSBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBvbmUKLSAgIGZpbGxlZC1pbiB2YWx1ZToKLSAgICAgWFBHX01PRElGSUVSICAgICAgICAgICAgICAgIGZvciAqTU9ESUZJRVIsCi0gICAgIFhQR19URVJSSVRPUlkgICAgICAgICAgICAgICBmb3IgKlRFUlJJVE9SWSwKLSAgICAgWFBHX0NPREVTRVQgICAgICAgICAgICAgICAgIGZvciAqQ09ERVNFVCwKLSAgICAgWFBHX05PUk1fQ09ERVNFVCAgICAgICAgICAgIGZvciAqTk9STUFMSVpFRF9DT0RFU0VULgotICovCi1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLCBjb25zdCBjaGFyICoqdGVycml0b3J5LAotCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCk7Ci0KLSNlbmRpZgkvKiBsb2FkaW5mby5oICovCmRpZmYgLS1naXQgYS9pbnRsL2xvYWRtc2djYXQuYyBiL2ludGwvbG9hZG1zZ2NhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMyYThjLi4wMDAwMDAwCi0tLSBhL2ludGwvbG9hZG1zZ2NhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzNiArMCwwIEBACi0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCi0gICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKLSAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIHVuZGVmICBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCAoZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9QT1NJWF9NQVBQRURfRklMRVMpCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jIHVuZGVmIEhBVkVfTU1BUAotIyBkZWZpbmUgSEFWRV9NTUFQCTEKLSNlbHNlCi0jIHVuZGVmIEhBVkVfTU1BUAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIEhBVkVfSU5UVFlQRVNfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdtby5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKLSNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlICIuLi9sb2NhbGUvbG9jYWxlaW5mby5oIgotIyBpbmNsdWRlIDxub3QtY2FuY2VsLmg+Ci0jZW5kaWYKLQotLyogSGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxvY2suaCIKLSNlbmRpZgotCi0vKiBQcm92aWRlIGZhbGxiYWNrIHZhbHVlcyBmb3IgbWFjcm9zIHRoYXQgb3VnaHQgdG8gYmUgZGVmaW5lZCBpbiA8aW50dHlwZXMuaD4uCi0gICBOb3RlIHRoYXQgb3VyIGZhbGxiYWNrIHZhbHVlcyBuZWVkIG5vdCBiZSBsaXRlcmFsIHN0cmluZ3MsIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgIHVzZSB0aGVtIHdpdGggcHJlcHJvY2Vzc29yIHN0cmluZyBjb25jYXRlbmF0aW9uLiAgKi8KLSNpZiAhZGVmaW5lZCBQUklkOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkOAotIyBkZWZpbmUgUFJJZDggImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpOAotIyBkZWZpbmUgUFJJaTggImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvOAotIyBkZWZpbmUgUFJJbzggIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1OCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1OAotIyBkZWZpbmUgUFJJdTggInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4OCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4OAotIyBkZWZpbmUgUFJJeDggIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYOCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYOAotIyBkZWZpbmUgUFJJWDggIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZDE2Ci0jIGRlZmluZSBQUklkMTYgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaTE2Ci0jIGRlZmluZSBQUklpMTYgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJbzE2Ci0jIGRlZmluZSBQUklvMTYgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdTE2Ci0jIGRlZmluZSBQUkl1MTYgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeDE2Ci0jIGRlZmluZSBQUkl4MTYgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWDE2Ci0jIGRlZmluZSBQUklYMTYgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZDMyCi0jIGRlZmluZSBQUklkMzIgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaTMyCi0jIGRlZmluZSBQUklpMzIgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJbzMyCi0jIGRlZmluZSBQUklvMzIgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdTMyCi0jIGRlZmluZSBQUkl1MzIgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeDMyCi0jIGRlZmluZSBQUkl4MzIgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWDMyCi0jIGRlZmluZSBQUklYMzIgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZDY0Ci0jIGRlZmluZSBQUklkNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsZCIgOiAibGxkIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSWk2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpNjQKLSMgZGVmaW5lIFBSSWk2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxpIiA6ICJsbGkiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJbzY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW82NAotIyBkZWZpbmUgUFJJbzY0IChzaXplb2YgKGxvbmcpID09IDggPyAibG8iIDogImxsbyIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1NjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdTY0Ci0jIGRlZmluZSBQUkl1NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsdSIgOiAibGx1IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSXg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4NjQKLSMgZGVmaW5lIFBSSXg2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImx4IiA6ICJsbHgiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJWDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVg2NAotIyBkZWZpbmUgUFJJWDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibFgiIDogImxsWCIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRMRUFTVDgKLSMgZGVmaW5lIFBSSWRMRUFTVDggImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWlMRUFTVDgKLSMgZGVmaW5lIFBSSWlMRUFTVDggImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9MRUFTVDgKLSMgZGVmaW5lIFBSSW9MRUFTVDggIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVMRUFTVDgKLSMgZGVmaW5lIFBSSXVMRUFTVDggInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXhMRUFTVDgKLSMgZGVmaW5lIFBSSXhMRUFTVDggIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhMRUFTVDgKLSMgZGVmaW5lIFBSSVhMRUFTVDggIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkTEVBU1QxNgotIyBkZWZpbmUgUFJJZExFQVNUMTYgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpTEVBU1QxNgotIyBkZWZpbmUgUFJJaUxFQVNUMTYgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvTEVBU1QxNgotIyBkZWZpbmUgUFJJb0xFQVNUMTYgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1TEVBU1QxNgotIyBkZWZpbmUgUFJJdUxFQVNUMTYgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4TEVBU1QxNgotIyBkZWZpbmUgUFJJeExFQVNUMTYgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYTEVBU1QxNgotIyBkZWZpbmUgUFJJWExFQVNUMTYgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkTEVBU1QzMgotIyBkZWZpbmUgUFJJZExFQVNUMzIgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpTEVBU1QzMgotIyBkZWZpbmUgUFJJaUxFQVNUMzIgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvTEVBU1QzMgotIyBkZWZpbmUgUFJJb0xFQVNUMzIgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1TEVBU1QzMgotIyBkZWZpbmUgUFJJdUxFQVNUMzIgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4TEVBU1QzMgotIyBkZWZpbmUgUFJJeExFQVNUMzIgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYTEVBU1QzMgotIyBkZWZpbmUgUFJJWExFQVNUMzIgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklkTEVBU1Q2NAotIyBkZWZpbmUgUFJJZExFQVNUNjQgUFJJZDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpTEVBU1Q2NAotIyBkZWZpbmUgUFJJaUxFQVNUNjQgUFJJaTY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklvTEVBU1Q2NAotIyBkZWZpbmUgUFJJb0xFQVNUNjQgUFJJbzY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl1TEVBU1Q2NAotIyBkZWZpbmUgUFJJdUxFQVNUNjQgUFJJdTY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4TEVBU1Q2NAotIyBkZWZpbmUgUFJJeExFQVNUNjQgUFJJeDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklYTEVBU1Q2NAotIyBkZWZpbmUgUFJJWExFQVNUNjQgUFJJWDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJZEZBU1Q4Ci0jIGRlZmluZSBQUklkRkFTVDggImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJaUZBU1Q4Ci0jIGRlZmluZSBQUklpRkFTVDggImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb0ZBU1Q4Ci0jIGRlZmluZSBQUklvRkFTVDggIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJdUZBU1Q4Ci0jIGRlZmluZSBQUkl1RkFTVDggInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJeEZBU1Q4Ci0jIGRlZmluZSBQUkl4RkFTVDggIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWEZBU1Q4Ci0jIGRlZmluZSBQUklYRkFTVDggIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRGQVNUMTYKLSMgZGVmaW5lIFBSSWRGQVNUMTYgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWlGQVNUMTYKLSMgZGVmaW5lIFBSSWlGQVNUMTYgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9GQVNUMTYKLSMgZGVmaW5lIFBSSW9GQVNUMTYgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVGQVNUMTYKLSMgZGVmaW5lIFBSSXVGQVNUMTYgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXhGQVNUMTYKLSMgZGVmaW5lIFBSSXhGQVNUMTYgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhGQVNUMTYKLSMgZGVmaW5lIFBSSVhGQVNUMTYgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRGQVNUMzIKLSMgZGVmaW5lIFBSSWRGQVNUMzIgImQiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWlGQVNUMzIKLSMgZGVmaW5lIFBSSWlGQVNUMzIgImkiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9GQVNUMzIKLSMgZGVmaW5lIFBSSW9GQVNUMzIgIm8iCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVGQVNUMzIKLSMgZGVmaW5lIFBSSXVGQVNUMzIgInUiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXhGQVNUMzIKLSMgZGVmaW5lIFBSSXhGQVNUMzIgIngiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhGQVNUMzIKLSMgZGVmaW5lIFBSSVhGQVNUMzIgIlgiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRGQVNUNjQKLSMgZGVmaW5lIFBSSWRGQVNUNjQgUFJJZDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklpRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWlGQVNUNjQKLSMgZGVmaW5lIFBSSWlGQVNUNjQgUFJJaTY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklvRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSW9GQVNUNjQKLSMgZGVmaW5lIFBSSW9GQVNUNjQgUFJJbzY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVGQVNUNjQKLSMgZGVmaW5lIFBSSXVGQVNUNjQgUFJJdTY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl4RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXhGQVNUNjQKLSMgZGVmaW5lIFBSSXhGQVNUNjQgUFJJeDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklYRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSVhGQVNUNjQKLSMgZGVmaW5lIFBSSVhGQVNUNjQgUFJJWDY0Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRNQVgKLSMgZGVmaW5lIFBSSWRNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6ICJsbGQiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpTUFYCi0jIGRlZmluZSBQUklpTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsaSIgOiAibGxpIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSW9NQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb01BWAotIyBkZWZpbmUgUFJJb01BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibG8iIDogImxsbyIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1TUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVNQVgKLSMgZGVmaW5lIFBSSXVNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6ICJsbHUiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4TUFYCi0jIGRlZmluZSBQUkl4TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJseCIgOiAibGx4IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSVhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWE1BWAotIyBkZWZpbmUgUFJJWE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibFgiIDogImxsWCIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUklkUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSWRQVFIKLSMgZGVmaW5lIFBSSWRQVFIgXAotICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibGQiIDogXAotICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJkIiA6IFwKLSAgICJsbGQiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJaVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUklpUFRSCi0jIGRlZmluZSBQUklpUFRSIFwKLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6IFwKLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiaSIgOiBcCi0gICAibGxpIikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSW9QVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJb1BUUgotIyBkZWZpbmUgUFJJb1BUUiBcCi0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsbyIgOiBcCi0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIm8iIDogXAotICAgImxsbyIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCBQUkl1UFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCi0jIHVuZGVmIFBSSXVQVFIKLSMgZGVmaW5lIFBSSXVQVFIgXAotICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibHUiIDogXAotICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJ1IiA6IFwKLSAgICJsbHUiKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgUFJJeFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgotIyB1bmRlZiBQUkl4UFRSCi0jIGRlZmluZSBQUkl4UFRSIFwKLSAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6IFwKLSAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAieCIgOiBcCi0gICAibGx4IikKLSNlbmRpZgotI2lmICFkZWZpbmVkIFBSSVhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KLSMgdW5kZWYgUFJJWFBUUgotIyBkZWZpbmUgUFJJWFBUUiBcCi0gIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsWCIgOiBcCi0gICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIlgiIDogXAotICAgImxsWCIpCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIG9wZW4obmFtZSwgZmxhZ3MpCW9wZW5fbm90X2NhbmNlbF8yIChuYW1lLCBmbGFncykKLSMgZGVmaW5lIGNsb3NlKGZkKQkJY2xvc2Vfbm90X2NhbmNlbF9ub19zdGF0dXMgKGZkKQotIyBkZWZpbmUgcmVhZChmZCwgYnVmLCBuKQlyZWFkX25vdF9jYW5jZWwgKGZkLCBidWYsIG4pCi0jIGRlZmluZSBtbWFwKGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpIFwKLSAgX19tbWFwIChhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgb2Zmc2V0KQotIyBkZWZpbmUgbXVubWFwKGFkZHIsIGxlbikJX19tdW5tYXAgKGFkZHIsIGxlbikKLSNlbmRpZgotCi0vKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLwotI2Vsc2UKLSMgZGVmaW5lIGFsbG9jYShuKSBtYWxsb2MgKG4pCi0jIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHRoYXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgSS9PLgotICAgT19CSU5BUlkgaXMgdXN1YWxseSBkZWNsYXJlZCBpbiA8ZmNudGwuaD4uICovCi0jaWYgIWRlZmluZWQgT19CSU5BUlkgJiYgZGVmaW5lZCBfT19CSU5BUlkKLSAgLyogRm9yIE1TQy1jb21wYXRpYmxlIGNvbXBpbGVycy4gICovCi0jIGRlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKLSMgZGVmaW5lIE9fVEVYVCBfT19URVhUCi0jZW5kaWYKLSNpZmRlZiBfX0JFT1NfXwotICAvKiBCZU9TIDUgaGFzIE9fQklOQVJZIGFuZCBPX1RFWFQsIGJ1dCB0aGV5IGhhdmUgbm8gZWZmZWN0LiAgKi8KLSMgdW5kZWYgT19CSU5BUlkKLSMgdW5kZWYgT19URVhUCi0jZW5kaWYKLS8qIE9uIHJlYXNvbmFibGUgc3lzdGVtcywgYmluYXJ5IEkvTyBpcyB0aGUgZGVmYXVsdC4gICovCi0jaWZuZGVmIE9fQklOQVJZCi0jIGRlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotCi0vKiBXZSBuZWVkIGEgc2lnbiwgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkCi0gICB3aXRoIGFsbCB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGltcG9ydGFudCBpZiB0aGUgdHJhbnNsYXRpb25zIGFyZQotICAgY2FjaGVkIGJ5IG9uZSBvZiBHQ0MncyBmZWF0dXJlcy4gICovCi1pbnQgX25sX21zZ19jYXRfY250cjsKLQotCi0vKiBFeHBhbmQgYSBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgUmV0dXJuIE5VTEwgaWYgdW5zdXBwb3J0ZWQuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChjb25zdCBjaGFyICpuYW1lKQotewotICAvKiBUZXN0IGZvciBhbiBJU08gQyA5OSBzZWN0aW9uIDcuOC4xIGZvcm1hdCBzdHJpbmcgZGlyZWN0aXZlLgotICAgICBTeW50YXg6Ci0gICAgIFAgUiBJIHsgZCB8IGkgfCBvIHwgdSB8IHggfCBYIH0KLSAgICAgeyB7IHwgTEVBU1QgfCBGQVNUIH0geyA4IHwgMTYgfCAzMiB8IDY0IH0gfCBNQVggfCBQVFIgfSAgKi8KLSAgLyogV2UgZG9uJ3QgdXNlIGEgdGFibGUgb2YgMTQgdGltZXMgNiAnY29uc3QgY2hhciAqJyBzdHJpbmdzIGhlcmUsIGJlY2F1c2UKLSAgICAgZGF0YSByZWxvY2F0aW9ucyBjb3N0IHN0YXJ0dXAgdGltZS4gICovCi0gIGlmIChuYW1lWzBdID09ICdQJyAmJiBuYW1lWzFdID09ICdSJyAmJiBuYW1lWzJdID09ICdJJykKLSAgICB7Ci0gICAgICBpZiAobmFtZVszXSA9PSAnZCcgfHwgbmFtZVszXSA9PSAnaScgfHwgbmFtZVszXSA9PSAnbycgfHwgbmFtZVszXSA9PSAndScKLQkgIHx8IG5hbWVbM10gPT0gJ3gnIHx8IG5hbWVbM10gPT0gJ1gnKQotCXsKLQkgIGlmIChuYW1lWzRdID09ICc4JyAmJiBuYW1lWzVdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCXJldHVybiBQUklkODsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0JCXJldHVybiBQUklpODsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0JCXJldHVybiBQUklvODsKLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JCXJldHVybiBQUkl1ODsKLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0JCXJldHVybiBQUkl4ODsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCXJldHVybiBQUklYODsKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaWYgKG5hbWVbNF0gPT0gJzEnICYmIG5hbWVbNV0gPT0gJzYnICYmIG5hbWVbNl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKLQkJcmV0dXJuIFBSSWQxNjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCi0JCXJldHVybiBQUklpMTY7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQlyZXR1cm4gUFJJbzE2OwotCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQkJcmV0dXJuIFBSSXUxNjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCi0JCXJldHVybiBQUkl4MTY7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQlyZXR1cm4gUFJJWDE2OwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpZiAobmFtZVs0XSA9PSAnMycgJiYgbmFtZVs1XSA9PSAnMicgJiYgbmFtZVs2XSA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQlyZXR1cm4gUFJJZDMyOwotCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKLQkJcmV0dXJuIFBSSWkzMjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0JCXJldHVybiBQUklvMzI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQlyZXR1cm4gUFJJdTMyOwotCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKLQkJcmV0dXJuIFBSSXgzMjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCXJldHVybiBQUklYMzI7Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGlmIChuYW1lWzRdID09ICc2JyAmJiBuYW1lWzVdID09ICc0JyAmJiBuYW1lWzZdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCXJldHVybiBQUklkNjQ7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQlyZXR1cm4gUFJJaTY0OwotCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKLQkJcmV0dXJuIFBSSW82NDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JCXJldHVybiBQUkl1NjQ7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQlyZXR1cm4gUFJJeDY0OwotCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKLQkJcmV0dXJuIFBSSVg2NDsKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaWYgKG5hbWVbNF0gPT0gJ0wnICYmIG5hbWVbNV0gPT0gJ0UnICYmIG5hbWVbNl0gPT0gJ0EnCi0JICAgICAgJiYgbmFtZVs3XSA9PSAnUycgJiYgbmFtZVs4XSA9PSAnVCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVs5XSA9PSAnOCcgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkTEVBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpTEVBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICdvJykKLQkJICAgIHJldHVybiBQUklvTEVBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1TEVBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4TEVBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICdYJykKLQkJICAgIHJldHVybiBQUklYTEVBU1Q4OwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgaWYgKG5hbWVbOV0gPT0gJzEnICYmIG5hbWVbMTBdID09ICc2JyAmJiBuYW1lWzExXSA9PSAnXDAnKQotCQl7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQkgICAgcmV0dXJuIFBSSWRMRUFTVDE2OwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpTEVBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0xFQVNUMTY7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQkgICAgcmV0dXJuIFBSSXVMRUFTVDE2OwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4TEVBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWExFQVNUMTY7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAobmFtZVs5XSA9PSAnMycgJiYgbmFtZVsxMF0gPT0gJzInICYmIG5hbWVbMTFdID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZExFQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQkgICAgcmV0dXJuIFBSSWlMRUFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdvJykKLQkJICAgIHJldHVybiBQUklvTEVBU1QzMjsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUxFQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQkgICAgcmV0dXJuIFBSSXhMRUFTVDMyOwotCQkgIGlmIChuYW1lWzNdID09ICdYJykKLQkJICAgIHJldHVybiBQUklYTEVBU1QzMjsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmIChuYW1lWzldID09ICc2JyAmJiBuYW1lWzEwXSA9PSAnNCcgJiYgbmFtZVsxMV0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkTEVBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0JCSAgICByZXR1cm4gUFJJaUxFQVNUNjQ7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQkgICAgcmV0dXJuIFBSSW9MRUFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1TEVBU1Q2NDsKLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0JCSAgICByZXR1cm4gUFJJeExFQVNUNjQ7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQkgICAgcmV0dXJuIFBSSVhMRUFTVDY0OwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgIH0KLQkgIGlmIChuYW1lWzRdID09ICdGJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdTJwotCSAgICAgICYmIG5hbWVbN10gPT0gJ1QnKQotCSAgICB7Ci0JICAgICAgaWYgKG5hbWVbOF0gPT0gJzgnICYmIG5hbWVbOV0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkRkFTVDg7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQkgICAgcmV0dXJuIFBSSWlGQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0ZBU1Q4OwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1RkFTVDg7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQkgICAgcmV0dXJuIFBSSXhGQVNUODsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWEZBU1Q4OwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgaWYgKG5hbWVbOF0gPT0gJzEnICYmIG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICdcMCcpCi0JCXsKLQkJICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCSAgICByZXR1cm4gUFJJZEZBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnaScpCi0JCSAgICByZXR1cm4gUFJJaUZBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnbycpCi0JCSAgICByZXR1cm4gUFJJb0ZBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAndScpCi0JCSAgICByZXR1cm4gUFJJdUZBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAneCcpCi0JCSAgICByZXR1cm4gUFJJeEZBU1QxNjsKLQkJICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCSAgICByZXR1cm4gUFJJWEZBU1QxNjsKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGlmIChuYW1lWzhdID09ICczJyAmJiBuYW1lWzldID09ICcyJyAmJiBuYW1lWzEwXSA9PSAnXDAnKQotCQl7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQotCQkgICAgcmV0dXJuIFBSSWRGQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQkgICAgcmV0dXJuIFBSSWlGQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQkgICAgcmV0dXJuIFBSSW9GQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCQkgICAgcmV0dXJuIFBSSXVGQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQkgICAgcmV0dXJuIFBSSXhGQVNUMzI7Ci0JCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQkgICAgcmV0dXJuIFBSSVhGQVNUMzI7Ci0JCSAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBpZiAobmFtZVs4XSA9PSAnNicgJiYgbmFtZVs5XSA9PSAnNCcgJiYgbmFtZVsxMF0gPT0gJ1wwJykKLQkJewotCQkgIGlmIChuYW1lWzNdID09ICdkJykKLQkJICAgIHJldHVybiBQUklkRkFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICdpJykKLQkJICAgIHJldHVybiBQUklpRkFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICdvJykKLQkJICAgIHJldHVybiBQUklvRkFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICd1JykKLQkJICAgIHJldHVybiBQUkl1RkFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICd4JykKLQkJICAgIHJldHVybiBQUkl4RkFTVDY0OwotCQkgIGlmIChuYW1lWzNdID09ICdYJykKLQkJICAgIHJldHVybiBQUklYRkFTVDY0OwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgIH0KLQkgIGlmIChuYW1lWzRdID09ICdNJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdYJwotCSAgICAgICYmIG5hbWVbN10gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKLQkJcmV0dXJuIFBSSWRNQVg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQotCQlyZXR1cm4gUFJJaU1BWDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCi0JCXJldHVybiBQUklvTUFYOwotCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKLQkJcmV0dXJuIFBSSXVNQVg7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQotCQlyZXR1cm4gUFJJeE1BWDsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCi0JCXJldHVybiBQUklYTUFYOwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpZiAobmFtZVs0XSA9PSAnUCcgJiYgbmFtZVs1XSA9PSAnVCcgJiYgbmFtZVs2XSA9PSAnUicKLQkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCi0JCXJldHVybiBQUklkUFRSOwotCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKLQkJcmV0dXJuIFBSSWlQVFI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQotCQlyZXR1cm4gUFJJb1BUUjsKLQkgICAgICBpZiAobmFtZVszXSA9PSAndScpCi0JCXJldHVybiBQUkl1UFRSOwotCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKLQkJcmV0dXJuIFBSSXhQVFI7Ci0JICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQotCQlyZXR1cm4gUFJJWFBUUjsKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIFRlc3QgZm9yIGEgZ2xpYmMgc3BlY2lmaWMgcHJpbnRmKCkgZm9ybWF0IGRpcmVjdGl2ZSBmbGFnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJ0knICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikKLSAgICAgIC8qIFRoZSAnSScgZmxhZywgaW4gbnVtZXJpYyBmb3JtYXQgZGlyZWN0aXZlcywgcmVwbGFjZXMgQVNDSUkgZGlnaXRzCi0JIHdpdGggdGhlICdvdXRkaWdpdHMnIGRlZmluZWQgaW4gdGhlIExDX0NUWVBFIGxvY2FsZSBmYWNldC4gIFRoaXMgaXMKLQkgdXNlZCBmb3IgRmFyc2kgKFBlcnNpYW4pIGFuZCBtYXliZSBBcmFiaWMuICAqLwotICAgICAgcmV0dXJuICJJIjsKLSNlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0jZW5kaWYKLSAgICB9Ci0gIC8qIE90aGVyIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhcmUgbm90IHZhbGlkLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLXZvaWQKLWludGVybmFsX2Z1bmN0aW9uCi1fbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCi17Ci0gIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZF9yZWN1cnNpdmUgKHN0YXRpYywgbG9jaykKLSAgaW50IGZkID0gLTE7Ci0gIHNpemVfdCBzaXplOwotI2lmZGVmIF9MSUJDCi0gIHN0cnVjdCBzdGF0NjQgc3Q7Ci0jZWxzZQotICBzdHJ1Y3Qgc3RhdCBzdDsKLSNlbmRpZgotICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOwotICBpbnQgdXNlX21tYXAgPSAwOwotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotICBpbnQgcmV2aXNpb247Ci0gIGNvbnN0IGNoYXIgKm51bGxlbnRyeTsKLSAgc2l6ZV90IG51bGxlbnRyeWxlbjsKLQotICBfX2xpYmNfbG9ja19sb2NrX3JlY3Vyc2l2ZSAobG9jayk7Ci0gIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczoKLQotCSArIHRoaXMgaXMgdGhlIHNhbWUgdGhyZWFkIGNhbGxpbmcgYWdhaW4gZHVyaW5nIHRoaXMgaW5pdGlhbGl6YXRpb24KLQkgICB2aWEgX25sX2ZpbmRfbXNnLiAgV2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nIHRoaXMgY2FsbCBuZWVkcy4KLQotCSArIHRoaXMgaXMgYW5vdGhlciB0aHJlYWQgd2hpY2ggdHJpZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIG9iamVjdC4KLQkgICBOb3QgbmVjZXNzYXJ5IGFueW1vcmUgc2luY2UgaWYgdGhlIGxvY2sgaXMgYXZhaWxhYmxlIHRoaXMKLQkgICBpcyBmaW5pc2hlZC4KLSAgICAgICovCi0gICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gLTE7Ci0gIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLQotICAvKiBOb3RlIHRoYXQgaXQgd291bGQgYmUgdXNlbGVzcyB0byBzdG9yZSBkb21haW5iaW5kaW5nIGluIGRvbWFpbl9maWxlCi0gICAgIGJlY2F1c2UgZG9tYWluYmluZGluZyBtaWdodCBiZSA9PSBOVUxMIG5vdyBidXQgIT0gTlVMTCBsYXRlciAoYWZ0ZXIKLSAgICAgYSBjYWxsIHRvIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KS4gICovCi0KLSAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCi0gICAgIG1pZ2h0IGJlIE5VTEwuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0gICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgotICAgICBzeW50YXguICAqLwotICBpZiAoZG9tYWluX2ZpbGUtPmZpbGVuYW1lID09IE5VTEwpCi0gICAgZ290byBvdXQ7Ci0KLSAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgZ290byBvdXQ7Ci0KLSAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KLSAgaWYgKAotI2lmZGVmIF9MSUJDCi0gICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdDY0IChmZCwgJnN0KSAhPSAwLCAwKQotI2Vsc2UKLSAgICAgIF9fYnVpbHRpbl9leHBlY3QgKGZzdGF0IChmZCwgJnN0KSAhPSAwLCAwKQotI2VuZGlmCi0gICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0ICgoc2l6ZSA9IChzaXplX3QpIHN0LnN0X3NpemUpICE9IHN0LnN0X3NpemUsIDApCi0gICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0IChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpLCAwKSkKLSAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0gICAgZ290byBvdXQ7Ci0KLSNpZmRlZiBIQVZFX01NQVAKLSAgLyogTm93IHdlIGFyZSByZWFkeSB0byBsb2FkIHRoZSBmaWxlLiAgSWYgbW1hcCgpIGlzIGF2YWlsYWJsZSB3ZSB0cnkKLSAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KLSAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELAotCQkJCQkgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLQotICBpZiAoX19idWlsdGluX2V4cGVjdCAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xLCAxKSkKLSAgICB7Ci0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgZmQgPSAtMTsKLSAgICAgIHVzZV9tbWFwID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGUgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSAoaS5lLiBtbWFwJ2VkKSB3ZSB0cnkgdG8gbG9hZAotICAgICBpdCBtYW51YWxseS4gICovCi0gIGlmIChkYXRhID09IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEpCi0gICAgewotICAgICAgc2l6ZV90IHRvX3JlYWQ7Ci0gICAgICBjaGFyICpyZWFkX3B0cjsKLQotICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JZ290byBvdXQ7Ci0KLSAgICAgIHRvX3JlYWQgPSBzaXplOwotICAgICAgcmVhZF9wdHIgPSAoY2hhciAqKSBkYXRhOwotICAgICAgZG8KLQl7Ci0JICBsb25nIGludCBuYiA9IChsb25nIGludCkgcmVhZCAoZmQsIHJlYWRfcHRyLCB0b19yZWFkKTsKLQkgIGlmIChuYiA8PSAwKQotCSAgICB7Ci0jaWZkZWYgRUlOVFIKLQkgICAgICBpZiAobmIgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCi0JCWNvbnRpbnVlOwotI2VuZGlmCi0JICAgICAgZ290byBvdXQ7Ci0JICAgIH0KLQkgIHJlYWRfcHRyICs9IG5iOwotCSAgdG9fcmVhZCAtPSBuYjsKLQl9Ci0gICAgICB3aGlsZSAodG9fcmVhZCA+IDApOwotCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgZmQgPSAtMTsKLSAgICB9Ci0KLSAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKLSAgICAgY2F0YWxvZyBmaWxlLiAgKi8KLSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCwKLQkJCTApKQotICAgIHsKLSAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KLSNpZmRlZiBIQVZFX01NQVAKLSAgICAgIGlmICh1c2VfbW1hcCkKLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzaXplKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWZyZWUgKGRhdGEpOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLSAgaWYgKGRvbWFpbiA9PSBOVUxMKQotICAgIGdvdG8gb3V0OwotICBkb21haW5fZmlsZS0+ZGF0YSA9IGRvbWFpbjsKLQotICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOwotICBkb21haW4tPnVzZV9tbWFwID0gdXNlX21tYXA7Ci0gIGRvbWFpbi0+bW1hcF9zaXplID0gc2l6ZTsKLSAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7Ci0gIGRvbWFpbi0+bWFsbG9jZWQgPSBOVUxMOwotCi0gIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KLSAgcmV2aXNpb24gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pOwotICAvKiBXZSBzdXBwb3J0IG9ubHkgdGhlIG1ham9yIHJldmlzaW9ucyAwIGFuZCAxLiAgKi8KLSAgc3dpdGNoIChyZXZpc2lvbiA+PiAxNikKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotICAgICAgZG9tYWluLT5oYXNoX3RhYiA9Ci0JKGRvbWFpbi0+aGFzaF9zaXplID4gMgotCSA/IChjb25zdCBubHNfdWludDMyICopCi0JICAgKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSkKLQkgOiBOVUxMKTsKLSAgICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gZG9tYWluLT5tdXN0X3N3YXA7Ci0KLSAgICAgIC8qIE5vdyBkaXNwYXRjaCBvbiB0aGUgbWlub3IgcmV2aXNpb24uICAqLwotICAgICAgc3dpdGNoIChyZXZpc2lvbiAmIDB4ZmZmZikKLQl7Ci0JY2FzZSAwOgotCSAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKLQkgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLQkgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOwotCi0JICAgIGlmIChkb21haW4tPmhhc2hfdGFiID09IE5VTEwpCi0JICAgICAgLyogVGhpcyBpcyBpbnZhbGlkLiAgVGhlc2UgbWlub3IgcmV2aXNpb25zIG5lZWQgYSBoYXNoIHRhYmxlLiAgKi8KLQkgICAgICBnb3RvIGludmFsaWQ7Ci0KLQkgICAgbl9zeXNkZXBfc3RyaW5ncyA9Ci0JICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5fc3lzZGVwX3N0cmluZ3MpOwotCSAgICBpZiAobl9zeXNkZXBfc3RyaW5ncyA+IDApCi0JICAgICAgewotCQlubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOwotCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKnN5c2RlcF9zZWdtZW50czsKLQkJY29uc3QgY2hhciAqKnN5c2RlcF9zZWdtZW50X3ZhbHVlczsKLQkJY29uc3QgbmxzX3VpbnQzMiAqb3JpZ19zeXNkZXBfdGFiOwotCQljb25zdCBubHNfdWludDMyICp0cmFuc19zeXNkZXBfdGFiOwotCQlubHNfdWludDMyIG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7Ci0JCXNpemVfdCBtZW1uZWVkOwotCQljaGFyICptZW07Ci0JCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX29yaWdfc3lzZGVwX3RhYjsKLQkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fdHJhbnNfc3lzZGVwX3RhYjsKLQkJbmxzX3VpbnQzMiAqaW5tZW1faGFzaF90YWI7Ci0JCXVuc2lnbmVkIGludCBpLCBqOwotCi0JCS8qIEdldCB0aGUgdmFsdWVzIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KLQkJbl9zeXNkZXBfc2VnbWVudHMgPQotCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zZWdtZW50cyk7Ci0JCXN5c2RlcF9zZWdtZW50cyA9IChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKikKLQkJICAoKGNoYXIgKikgZGF0YQotCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5zeXNkZXBfc2VnbWVudHNfb2Zmc2V0KSk7Ci0JCXN5c2RlcF9zZWdtZW50X3ZhbHVlcyA9Ci0JCSAgKGNvbnN0IGNoYXIgKiopCi0JCSAgYWxsb2NhIChuX3N5c2RlcF9zZWdtZW50cyAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zZWdtZW50czsgaSsrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUgPQotCQkgICAgICAoY2hhciAqKSBkYXRhCi0JCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5vZmZzZXQpOwotCQkgICAgbmxzX3VpbnQzMiBuYW1lbGVuID0KLQkJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5sZW5ndGgpOwotCi0JCSAgICBpZiAoIShuYW1lbGVuID4gMCAmJiBuYW1lW25hbWVsZW4gLSAxXSA9PSAnXDAnKSkKLQkJICAgICAgewotCQkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7Ci0JCQlnb3RvIGludmFsaWQ7Ci0JCSAgICAgIH0KLQotCQkgICAgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW2ldID0gZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChuYW1lKTsKLQkJICB9Ci0KLQkJb3JpZ19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKLQkJICAoKGNoYXIgKikgZGF0YQotCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3N5c2RlcF90YWJfb2Zmc2V0KSk7Ci0JCXRyYW5zX3N5c2RlcF90YWIgPSAoY29uc3QgbmxzX3VpbnQzMiAqKQotCQkgICgoY2hhciAqKSBkYXRhCi0JCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0KSk7Ci0KLQkJLyogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIGFkZGl0aW9uYWwgbWVtb3J5IG5lZWRlZCBmb3IgdGhlCi0JCSAgIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhbmQgdGhlIGF1Z21lbnRlZCBoYXNoIHRhYmxlLgotCQkgICBBdCB0aGUgc2FtZSB0aW1lLCBhbHNvIGRyb3Agc3RyaW5nIHBhaXJzIHdoaWNoIHJlZmVyIHRvCi0JCSAgIGFuIHVuZGVmaW5lZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnQuICAqLwotCQluX2lubWVtX3N5c2RlcF9zdHJpbmdzID0gMDsKLQkJbWVtbmVlZCA9IGRvbWFpbi0+aGFzaF9zaXplICogc2l6ZW9mIChubHNfdWludDMyKTsKLQkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3N0cmluZ3M7IGkrKykKLQkJICB7Ci0JCSAgICBpbnQgdmFsaWQgPSAxOwotCQkgICAgc2l6ZV90IG5lZWRzWzJdOwotCi0JCSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotCQkgICAgICB7Ci0JCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9Ci0JCQkgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQotCQkJICAoKGNoYXIgKikgZGF0YQotCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQlqID09IDAKLQkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQotCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOwotCQkJc2l6ZV90IG5lZWQgPSAwOwotCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOwotCi0JCQlpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikgIT0gU0VHTUVOVFNfRU5EKQotCQkJICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKLQkJCSAgICB7Ci0JCQkgICAgICBubHNfdWludDMyIHN5c2RlcHJlZjsKLQotCQkJICAgICAgbmVlZCArPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7Ci0KLQkJCSAgICAgIHN5c2RlcHJlZiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOwotCQkJICAgICAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIGlmIChzeXNkZXByZWYgPj0gbl9zeXNkZXBfc2VnbWVudHMpCi0JCQkJewotCQkJCSAgLyogSW52YWxpZC4gICovCi0JCQkJICBmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKLQkJCQkgIGdvdG8gaW52YWxpZDsKLQkJCQl9Ci0KLQkJCSAgICAgIGlmIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSA9PSBOVUxMKQotCQkJCXsKLQkJCQkgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcyBpbnZhbGlkLiAgKi8KLQkJCQkgIHZhbGlkID0gMDsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQotCQkJICAgICAgbmVlZCArPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKLQkJCSAgICB9Ci0KLQkJCW5lZWRzW2pdID0gbmVlZDsKLQkJCWlmICghdmFsaWQpCi0JCQkgIGJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGlmICh2YWxpZCkKLQkJICAgICAgewotCQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncysrOwotCQkJbWVtbmVlZCArPSBuZWVkc1swXSArIG5lZWRzWzFdOwotCQkgICAgICB9Ci0JCSAgfQotCQltZW1uZWVkICs9IDIgKiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCi0JCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7Ci0KLQkJaWYgKG5faW5tZW1fc3lzZGVwX3N0cmluZ3MgPiAwKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGludCBrOwotCi0JCSAgICAvKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeS4gICovCi0JCSAgICBtZW0gPSAoY2hhciAqKSBtYWxsb2MgKG1lbW5lZWQpOwotCQkgICAgaWYgKG1lbSA9PSBOVUxMKQotCQkgICAgICBnb3RvIGludmFsaWQ7Ci0KLQkJICAgIGRvbWFpbi0+bWFsbG9jZWQgPSBtZW07Ci0JCSAgICBpbm1lbV9vcmlnX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07Ci0JCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncwotCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOwotCQkgICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKLQkJICAgIG1lbSArPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCi0JCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7Ci0JCSAgICBpbm1lbV9oYXNoX3RhYiA9IChubHNfdWludDMyICopIG1lbTsKLQkJICAgIG1lbSArPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7Ci0KLQkJICAgIC8qIENvbXB1dGUgdGhlIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncy4gICovCi0JCSAgICBrID0gMDsKLQkJICAgIGZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zdHJpbmdzOyBpKyspCi0JCSAgICAgIHsKLQkJCWludCB2YWxpZCA9IDE7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0JCQkgIHsKLQkJCSAgICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9Ci0JCQkgICAgICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKLQkJCSAgICAgICgoY2hhciAqKSBkYXRhCi0JCQkgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgaiA9PSAwCi0JCQkJICAgID8gb3JpZ19zeXNkZXBfdGFiW2ldCi0JCQkJICAgIDogdHJhbnNfc3lzZGVwX3RhYltpXSkpOwotCQkJICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPQotCQkJICAgICAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7Ci0KLQkJCSAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKLQkJCQkhPSBTRUdNRU5UU19FTkQpCi0JCQkgICAgICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKLQkJCQl7Ci0JCQkJICBubHNfdWludDMyIHN5c2RlcHJlZjsKLQotCQkJCSAgc3lzZGVwcmVmID0KLQkJCQkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7Ci0JCQkJICBpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKLQkJCQkgICAgYnJlYWs7Ci0KLQkJCQkgIGlmIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSA9PSBOVUxMKQotCQkJCSAgICB7Ci0JCQkJICAgICAgLyogVGhpcyBwYXJ0aWN1bGFyIHN0cmluZyBwYWlyIGlzCi0JCQkJCSBpbnZhbGlkLiAgKi8KLQkJCQkgICAgICB2YWxpZCA9IDA7Ci0JCQkJICAgICAgYnJlYWs7Ci0JCQkJICAgIH0KLQkJCQl9Ci0KLQkJCSAgICBpZiAoIXZhbGlkKQotCQkJICAgICAgYnJlYWs7Ci0JCQkgIH0KLQotCQkJaWYgKHZhbGlkKQotCQkJICB7Ci0JCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLQkJCSAgICAgIHsKLQkJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9Ci0JCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKLQkJCQkgICgoY2hhciAqKSBkYXRhCi0JCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJaiA9PSAwCi0JCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCi0JCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOwotCQkJCWNvbnN0IGNoYXIgKnN0YXRpY19zZWdtZW50cyA9Ci0JCQkJICAoY2hhciAqKSBkYXRhCi0JCQkJICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc3RyaW5nLT5vZmZzZXQpOwotCQkJCWNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPQotCQkJCSAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7Ci0KLQkJCQkvKiBDb25jYXRlbmF0ZSB0aGUgc2VnbWVudHMsIGFuZCBmaWxsCi0JCQkJICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAwKSBhbmQKLQkJCQkgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAxKS4gICovCi0KLQkJCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90YWJfZW50cnkgPQotCQkJCSAgKGogPT0gMAotCQkJCSAgID8gaW5tZW1fb3JpZ19zeXNkZXBfdGFiCi0JCQkJICAgOiBpbm1lbV90cmFuc19zeXNkZXBfdGFiKQotCQkJCSAgKyBrOwotCi0JCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCi0JCQkJICAgID09IFNFR01FTlRTX0VORCkKLQkJCQkgIHsKLQkJCQkgICAgLyogT25seSBvbmUgc3RhdGljIHNlZ21lbnQuICAqLwotCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9Ci0JCQkJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOwotCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBzdGF0aWNfc2VnbWVudHM7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBtZW07Ci0KLQkJCQkgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCi0JCQkJICAgICAgewotCQkJCQlubHNfdWludDMyIHNlZ3NpemUgPQotCQkJCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKLQkJCQkJbmxzX3VpbnQzMiBzeXNkZXByZWYgPQotCQkJCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOwotCQkJCQlzaXplX3QgbjsKLQotCQkJCQlpZiAoc2Vnc2l6ZSA+IDApCi0JCQkJCSAgewotCQkJCQkgICAgbWVtY3B5IChtZW0sIHN0YXRpY19zZWdtZW50cywgc2Vnc2l6ZSk7Ci0JCQkJCSAgICBtZW0gKz0gc2Vnc2l6ZTsKLQkJCQkJICAgIHN0YXRpY19zZWdtZW50cyArPSBzZWdzaXplOwotCQkJCQkgIH0KLQotCQkJCQlpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKLQkJCQkJICBicmVhazsKLQotCQkJCQluID0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7Ci0JCQkJCW1lbWNweSAobWVtLCBzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSwgbik7Ci0JCQkJCW1lbSArPSBuOwotCQkJCSAgICAgIH0KLQotCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9Ci0JCQkJICAgICAgbWVtIC0gaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyOwotCQkJCSAgfQotCQkJICAgICAgfQotCi0JCQkgICAgaysrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmIChrICE9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MpCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICAvKiBDb21wdXRlIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4gICovCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgZG9tYWluLT5oYXNoX3NpemU7IGkrKykKLQkJICAgICAgaW5tZW1faGFzaF90YWJbaV0gPQotCQkJVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaV0pOwotCQkgICAgZm9yIChpID0gMDsgaSA8IG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7IGkrKykKLQkJICAgICAgewotCQkJY29uc3QgY2hhciAqbXNnaWQgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWJbaV0ucG9pbnRlcjsKLQkJCW5sc191aW50MzIgaGFzaF92YWwgPSBfX2hhc2hfc3RyaW5nIChtc2dpZCk7Ci0JCQlubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0JCQlubHNfdWludDMyIGluY3IgPQotCQkJICAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotCi0JCQlmb3IgKDs7KQotCQkJICB7Ci0JCQkgICAgaWYgKGlubWVtX2hhc2hfdGFiW2lkeF0gPT0gMCkKLQkJCSAgICAgIHsKLQkJCQkvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgVXNlIGl0LiAgKi8KLQkJCQlpbm1lbV9oYXNoX3RhYltpZHhdID0gMSArIGRvbWFpbi0+bnN0cmluZ3MgKyBpOwotCQkJCWJyZWFrOwotCQkJICAgICAgfQotCi0JCQkgICAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0JCQkgICAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIGlkeCArPSBpbmNyOwotCQkJICB9Ci0JCSAgICAgIH0KLQotCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gbl9pbm1lbV9zeXNkZXBfc3RyaW5nczsKLQkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiOwotCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gaW5tZW1fdHJhbnNfc3lzZGVwX3RhYjsKLQotCQkgICAgZG9tYWluLT5oYXNoX3RhYiA9IGlubWVtX2hhc2hfdGFiOwotCQkgICAgZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIgPSAwOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7Ci0JCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7Ci0JCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOwotCQkgIH0KLQotCQlmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7Ci0JCWRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKLQkJZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBpcyBhbiBpbnZhbGlkIHJldmlzaW9uLiAgKi8KLSAgICBpbnZhbGlkOgotICAgICAgLyogVGhpcyBpcyBhbiBpbnZhbGlkIC5tbyBmaWxlLiAgKi8KLSAgICAgIGlmIChkb21haW4tPm1hbGxvY2VkKQotCWZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOwotI2lmZGVmIEhBVkVfTU1BUAotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICBmcmVlIChkb21haW4pOwotICAgICAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gIC8qIE5vIGNhY2hlcyBvZiBjb252ZXJ0ZWQgdHJhbnNsYXRpb25zIHNvIGZhci4gICovCi0gIGRvbWFpbi0+Y29udmVyc2lvbnMgPSBOVUxMOwotICBkb21haW4tPm5jb252ZXJzaW9ucyA9IDA7Ci0gIGdsX3J3bG9ja19pbml0IChkb21haW4tPmNvbnZlcnNpb25zX2xvY2spOwotCi0gIC8qIEdldCB0aGUgaGVhZGVyIGVudHJ5IGFuZCBsb29rIGZvciBhIHBsdXJhbCBzcGVjaWZpY2F0aW9uLiAgKi8KLSNpZmRlZiBJTl9MSUJHTE9DQUxFCi0gIG51bGxlbnRyeSA9Ci0gICAgX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgTlVMTCwgIiIsICZudWxsZW50cnlsZW4pOwotI2Vsc2UKLSAgbnVsbGVudHJ5ID0gX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgIiIsIDAsICZudWxsZW50cnlsZW4pOwotI2VuZGlmCi0gIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKG51bGxlbnRyeSwgJmRvbWFpbi0+cGx1cmFsLCAmZG9tYWluLT5ucGx1cmFscyk7Ci0KLSBvdXQ6Ci0gIGlmIChmZCAhPSAtMSkKLSAgICBjbG9zZSAoZmQpOwotCi0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKLQotIGRvbmU6Ci0gIF9fbGliY19sb2NrX3VubG9ja19yZWN1cnNpdmUgKGxvY2spOwotfQotCi0KLSNpZmRlZiBfTElCQwotdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24gX19saWJjX2ZyZWVyZXNfZm5fc2VjdGlvbgotX25sX3VubG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4pCi17Ci0gIHNpemVfdCBpOwotCi0gIGlmIChkb21haW4tPnBsdXJhbCAhPSAmX19nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbCkKLSAgICBfX2dldHRleHRfZnJlZV9leHAgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBkb21haW4tPnBsdXJhbCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+bmNvbnZlcnNpb25zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGNvbnZlcnRlZF9kb21haW4gKmNvbnZkID0gJmRvbWFpbi0+Y29udmVyc2lvbnNbaV07Ci0KLSAgICAgIGZyZWUgKGNvbnZkLT5lbmNvZGluZyk7Ci0gICAgICBpZiAoY29udmQtPmNvbnZfdGFiICE9IE5VTEwgJiYgY29udmQtPmNvbnZfdGFiICE9IChjaGFyICoqKSAtMSkKLQlmcmVlIChjb252ZC0+Y29udl90YWIpOwotICAgICAgaWYgKGNvbnZkLT5jb252ICE9IChfX2djb252X3QpIC0xKQotCV9fZ2NvbnZfY2xvc2UgKGNvbnZkLT5jb252KTsKLSAgICB9Ci0gIGlmIChkb21haW4tPmNvbnZlcnNpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoZG9tYWluLT5jb252ZXJzaW9ucyk7Ci0gIF9fbGliY19yd2xvY2tfZmluaSAoZG9tYWluLT5jb252ZXJzaW9uc19sb2NrKTsKLQotICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKLSAgICBmcmVlIChkb21haW4tPm1hbGxvY2VkKTsKLQotIyBpZmRlZiBfUE9TSVhfTUFQUEVEX0ZJTEVTCi0gIGlmIChkb21haW4tPnVzZV9tbWFwKQotICAgIG11bm1hcCAoKGNhZGRyX3QpIGRvbWFpbi0+ZGF0YSwgZG9tYWluLT5tbWFwX3NpemUpOwotICBlbHNlCi0jIGVuZGlmCS8qIF9QT1NJWF9NQVBQRURfRklMRVMgKi8KLSAgICBmcmVlICgodm9pZCAqKSBkb21haW4tPmRhdGEpOwotCi0gIGZyZWUgKGRvbWFpbik7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbG9jYWxjaGFyc2V0LmMgYi9pbnRsL2xvY2FsY2hhcnNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk2YWU3Li4wMDAwMDAwCi0tLSBhL2ludGwvbG9jYWxjaGFyc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KLQotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2luY2x1ZGUgImxvY2FsY2hhcnNldC5oIgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCi0jIGRlZmluZSBXSU4zMl9OQVRJVkUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfX0VNWF9fCi0vKiBBc3N1bWUgRU1YIHByb2dyYW0gcnVucyBvbiBPUy8yLCBldmVuIGlmIGNvbXBpbGVkIHVuZGVyIERPUy4gICovCi0jIGRlZmluZSBPUzIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgV0lOMzJfTkFUSVZFCi0jIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAotIyAgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLSMgZWxzZQotIyAgaWYgMCAvKiBzZWUgY29tbWVudCBiZWxvdyAqLwotIyAgIGluY2x1ZGUgPGxvY2FsZS5oPgotIyAgZW5kaWYKLSMgZW5kaWYKLSMgaWZkZWYgX19DWUdXSU5fXwotIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQgV0lOMzJfTkFUSVZFCi0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQgT1MyCi0jIGRlZmluZSBJTkNMX0RPUwotIyBpbmNsdWRlIDxvczIuaD4KLSNlbmRpZgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0jZWxzZQotIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLSNlbmRpZgotCi0vKiBHZXQgTElCRElSLiAgKi8KLSNpZm5kZWYgTElCRElSCi0jIGluY2x1ZGUgImNvbmZpZ21ha2UuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0jZW5kaWYKLQotI2lmbmRlZiBESVJFQ1RPUllfU0VQQVJBVE9SCi0jIGRlZmluZSBESVJFQ1RPUllfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLSNpZm5kZWYgSVNTTEFTSAotIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09IERJUkVDVE9SWV9TRVBBUkFUT1IpCi0jZW5kaWYKLQotI2lmIEhBVkVfREVDTF9HRVRDX1VOTE9DS0VECi0jIHVuZGVmIGdldGMKLSMgZGVmaW5lIGdldGMgZ2V0Y191bmxvY2tlZAotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgc3RhdGljIHZhcmlhYmxlIGlzIGRlY2xhcmVkICd2b2xhdGlsZScgdG8gYXZvaWQgYQotICAgcG9zc2libGUgbXVsdGl0aHJlYWQgcHJvYmxlbSBpbiB0aGUgZnVuY3Rpb24gZ2V0X2NoYXJzZXRfYWxpYXNlcy4gSWYgd2UKLSAgIGFyZSBydW5uaW5nIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQsIGFuZCBpZiB0d28gdGhyZWFkcyBpbml0aWFsaXplCi0gICAnY2hhcnNldF9hbGlhc2VzJyBzaW11bHRhbmVvdXNseSwgYm90aCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgdmFsdWUsCi0gICBhbmQgZXZlcnl0aGluZyB3aWxsIGJlIG9rIGlmIHRoZSB0d28gYXNzaWdubWVudHMgdG8gJ2NoYXJzZXRfYWxpYXNlcycKLSAgIGFyZSBhdG9taWMuIEJ1dCBJIGRvbid0IGtub3cgd2hhdCB3aWxsIGhhcHBlbiBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIG1peC4gICovCi0jaWYgX19TVERDX18gIT0gMQotIyBkZWZpbmUgdm9sYXRpbGUgLyogZW1wdHkgKi8KLSNlbmRpZgotLyogUG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZSwgaWYgaXQgaGFzIGFscmVhZHkgYmVlbgotICAgcmVhZCwgZWxzZSBOVUxMLiAgSXRzIGZvcm1hdCBpczoKLSAgIEFMSUFTXzEgJ1wwJyBDQU5PTklDQUxfMSAnXDAnIC4uLiBBTElBU19uICdcMCcgQ0FOT05JQ0FMX24gJ1wwJyAnXDAnICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiB2b2xhdGlsZSBjaGFyc2V0X2FsaWFzZXM7Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2NoYXJzZXRfYWxpYXNlcyAodm9pZCkKLXsKLSAgY29uc3QgY2hhciAqY3A7Ci0KLSAgY3AgPSBjaGFyc2V0X2FsaWFzZXM7Ci0gIGlmIChjcCA9PSBOVUxMKQotICAgIHsKLSNpZiAhKGRlZmluZWQgVk1TIHx8IGRlZmluZWQgV0lOMzJfTkFUSVZFIHx8IGRlZmluZWQgX19DWUdXSU5fXykKLSAgICAgIEZJTEUgKmZwOwotICAgICAgY29uc3QgY2hhciAqZGlyOwotICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJjaGFyc2V0LmFsaWFzIjsKLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLQotICAgICAgLyogTWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgY2hhcnNldC5hbGlhcyBsb2NhdGlvbi4gIFRoaXMgaXMKLQkgbmVjZXNzYXJ5IGZvciBydW5uaW5nIHRoZSB0ZXN0c3VpdGUgYmVmb3JlICJtYWtlIGluc3RhbGwiLiAgKi8KLSAgICAgIGRpciA9IGdldGVudiAoIkNIQVJTRVRBTElBU0RJUiIpOwotICAgICAgaWYgKGRpciA9PSBOVUxMIHx8IGRpclswXSA9PSAnXDAnKQotCWRpciA9IHJlbG9jYXRlIChMSUJESVIpOwotCi0gICAgICAvKiBDb25jYXRlbmF0ZSBkaXIgYW5kIGJhc2UgaW50byBmcmVzaGx5IGFsbG9jYXRlZCBmaWxlX25hbWUuICAqLwotICAgICAgewotCXNpemVfdCBkaXJfbGVuID0gc3RybGVuIChkaXIpOwotCXNpemVfdCBiYXNlX2xlbiA9IHN0cmxlbiAoYmFzZSk7Ci0JaW50IGFkZF9zbGFzaCA9IChkaXJfbGVuID4gMCAmJiAhSVNTTEFTSCAoZGlyW2Rpcl9sZW4gLSAxXSkpOwotCWZpbGVfbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlyX2xlbiArIGFkZF9zbGFzaCArIGJhc2VfbGVuICsgMSk7Ci0JaWYgKGZpbGVfbmFtZSAhPSBOVUxMKQotCSAgewotCSAgICBtZW1jcHkgKGZpbGVfbmFtZSwgZGlyLCBkaXJfbGVuKTsKLQkgICAgaWYgKGFkZF9zbGFzaCkKLQkgICAgICBmaWxlX25hbWVbZGlyX2xlbl0gPSBESVJFQ1RPUllfU0VQQVJBVE9SOwotCSAgICBtZW1jcHkgKGZpbGVfbmFtZSArIGRpcl9sZW4gKyBhZGRfc2xhc2gsIGJhc2UsIGJhc2VfbGVuICsgMSk7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCB8fCAoZnAgPSBmb3BlbiAoZmlsZV9uYW1lLCAiciIpKSA9PSBOVUxMKQotCS8qIE91dCBvZiBtZW1vcnkgb3IgZmlsZSBub3QgZm91bmQsIHRyZWF0IGl0IGFzIGVtcHR5LiAgKi8KLQljcCA9ICIiOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFBhcnNlIHRoZSBmaWxlJ3MgY29udGVudHMuICAqLwotCSAgY2hhciAqcmVzX3B0ciA9IE5VTEw7Ci0JICBzaXplX3QgcmVzX3NpemUgPSAwOwotCi0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgaW50IGM7Ci0JICAgICAgY2hhciBidWYxWzUwKzFdOwotCSAgICAgIGNoYXIgYnVmMls1MCsxXTsKLQkgICAgICBzaXplX3QgbDEsIGwyOwotCSAgICAgIGNoYXIgKm9sZF9yZXNfcHRyOwotCi0JICAgICAgYyA9IGdldGMgKGZwKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCWJyZWFrOwotCSAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoYyA9PSAnIycpCi0JCXsKLQkJICAvKiBTa2lwIGNvbW1lbnQsIHRvIGVuZCBvZiBsaW5lLiAgKi8KLQkJICBkbwotCQkgICAgYyA9IGdldGMgKGZwKTsKLQkJICB3aGlsZSAoIShjID09IEVPRiB8fCBjID09ICdcbicpKTsKLQkJICBpZiAoYyA9PSBFT0YpCi0JCSAgICBicmVhazsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHVuZ2V0YyAoYywgZnApOwotCSAgICAgIGlmIChmc2NhbmYgKGZwLCAiJTUwcyAlNTBzIiwgYnVmMSwgYnVmMikgPCAyKQotCQlicmVhazsKLQkgICAgICBsMSA9IHN0cmxlbiAoYnVmMSk7Ci0JICAgICAgbDIgPSBzdHJsZW4gKGJ1ZjIpOwotCSAgICAgIG9sZF9yZXNfcHRyID0gcmVzX3B0cjsKLQkgICAgICBpZiAocmVzX3NpemUgPT0gMCkKLQkJewotCQkgIHJlc19zaXplID0gbDEgKyAxICsgbDIgKyAxOwotCQkgIHJlc19wdHIgPSAoY2hhciAqKSBtYWxsb2MgKHJlc19zaXplICsgMSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZXNfc2l6ZSArPSBsMSArIDEgKyBsMiArIDE7Ci0JCSAgcmVzX3B0ciA9IChjaGFyICopIHJlYWxsb2MgKHJlc19wdHIsIHJlc19zaXplICsgMSk7Ci0JCX0KLQkgICAgICBpZiAocmVzX3B0ciA9PSBOVUxMKQotCQl7Ci0JCSAgLyogT3V0IG9mIG1lbW9yeS4gKi8KLQkJICByZXNfc2l6ZSA9IDA7Ci0JCSAgaWYgKG9sZF9yZXNfcHRyICE9IE5VTEwpCi0JCSAgICBmcmVlIChvbGRfcmVzX3B0cik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpIC0gKGwxICsgMSksIGJ1ZjEpOwotCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSksIGJ1ZjIpOwotCSAgICB9Ci0JICBmY2xvc2UgKGZwKTsKLQkgIGlmIChyZXNfc2l6ZSA9PSAwKQotCSAgICBjcCA9ICIiOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKihyZXNfcHRyICsgcmVzX3NpemUpID0gJ1wwJzsKLQkgICAgICBjcCA9IHJlc19wdHI7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKLQlmcmVlIChmaWxlX25hbWUpOwotCi0jZWxzZQotCi0jIGlmIGRlZmluZWQgVk1TCi0gICAgICAvKiBUbyBhdm9pZCB0aGUgdHJvdWJsZXMgb2YgYW4gZXh0cmEgZmlsZSBjaGFyc2V0LmFsaWFzX3ZtcyBpbiB0aGUKLQkgc291cmNlcyBvZiBtYW55IEdOVSBwYWNrYWdlcywgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KLSAgICAgIC8qIFRoZSBsaXN0IG9mIGVuY29kaW5ncyBpcyB0YWtlbiBmcm9tIHRoZSBPcGVuVk1TIDcuMy0xIGRvY3VtZW50YXRpb24KLQkgIkNvbXBhcSBDIFJ1bi1UaW1lIExpYnJhcnkgUmVmZXJlbmNlIE1hbnVhbCBmb3IgT3BlblZNUyBzeXN0ZW1zIgotCSBzZWN0aW9uIDEwLjcgIkhhbmRsaW5nIERpZmZlcmVudCBDaGFyYWN0ZXIgU2V0cyIuICAqLwotICAgICAgY3AgPSAiSVNPODg1OS0xIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCi0JICAgIklTTzg4NTktMiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgotCSAgICJJU084ODU5LTUiICJcMCIgIklTTy04ODU5LTUiICJcMCIKLQkgICAiSVNPODg1OS03IiAiXDAiICJJU08tODg1OS03IiAiXDAiCi0JICAgIklTTzg4NTktOCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgotCSAgICJJU084ODU5LTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKLQkgICAvKiBKYXBhbmVzZSAqLwotCSAgICJldWNKUCIgIlwwIiAiRVVDLUpQIiAiXDAiCi0JICAgIlNKSVMiICJcMCIgIlNISUZUX0pJUyIgIlwwIgotCSAgICJERUNLQU5KSSIgIlwwIiAiREVDLUtBTkpJIiAiXDAiCi0JICAgIlNERUNLQU5KSSIgIlwwIiAiRVVDLUpQIiAiXDAiCi0JICAgLyogQ2hpbmVzZSAqLwotCSAgICJldWNUVyIgIlwwIiAiRVVDLVRXIiAiXDAiCi0JICAgIkRFQ0hBTllVIiAiXDAiICJERUMtSEFOWVUiICJcMCIKLQkgICAiREVDSEFOWkkiICJcMCIgIkdCMjMxMiIgIlwwIgotCSAgIC8qIEtvcmVhbiAqLwotCSAgICJERUNLT1JFQU4iICJcMCIgIkVVQy1LUiIgIlwwIjsKLSMgZW5kaWYKLQotIyBpZiBkZWZpbmVkIFdJTjMyX05BVElWRSB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLSAgICAgIC8qIFRvIGF2b2lkIHRoZSB0cm91YmxlcyBvZiBpbnN0YWxsaW5nIGEgc2VwYXJhdGUgZmlsZSBpbiB0aGUgc2FtZQotCSBkaXJlY3RvcnkgYXMgdGhlIERMTCBhbmQgb2YgcmV0cmlldmluZyB0aGUgRExMJ3MgZGlyZWN0b3J5IGF0Ci0JIHJ1bnRpbWUsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCi0KLSAgICAgIGNwID0gIkNQOTM2IiAiXDAiICJHQksiICJcMCIKLQkgICAiQ1AxMzYxIiAiXDAiICJKT0hBQiIgIlwwIgotCSAgICJDUDIwMTI3IiAiXDAiICJBU0NJSSIgIlwwIgotCSAgICJDUDIwODY2IiAiXDAiICJLT0k4LVIiICJcMCIKLQkgICAiQ1AyMDkzNiIgIlwwIiAiR0IyMzEyIiAiXDAiCi0JICAgIkNQMjE4NjYiICJcMCIgIktPSTgtUlUiICJcMCIKLQkgICAiQ1AyODU5MSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgotCSAgICJDUDI4NTkyIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCi0JICAgIkNQMjg1OTMiICJcMCIgIklTTy04ODU5LTMiICJcMCIKLQkgICAiQ1AyODU5NCIgIlwwIiAiSVNPLTg4NTktNCIgIlwwIgotCSAgICJDUDI4NTk1IiAiXDAiICJJU08tODg1OS01IiAiXDAiCi0JICAgIkNQMjg1OTYiICJcMCIgIklTTy04ODU5LTYiICJcMCIKLQkgICAiQ1AyODU5NyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgotCSAgICJDUDI4NTk4IiAiXDAiICJJU08tODg1OS04IiAiXDAiCi0JICAgIkNQMjg1OTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKLQkgICAiQ1AyODYwNSIgIlwwIiAiSVNPLTg4NTktMTUiICJcMCIKLQkgICAiQ1AzODU5OCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgotCSAgICJDUDUxOTMyIiAiXDAiICJFVUMtSlAiICJcMCIKLQkgICAiQ1A1MTkzNiIgIlwwIiAiR0IyMzEyIiAiXDAiCi0JICAgIkNQNTE5NDkiICJcMCIgIkVVQy1LUiIgIlwwIgotCSAgICJDUDUxOTUwIiAiXDAiICJFVUMtVFciICJcMCIKLQkgICAiQ1A1NDkzNiIgIlwwIiAiR0IxODAzMCIgIlwwIgotCSAgICJDUDY1MDAxIiAiXDAiICJVVEYtOCIgIlwwIjsKLSMgZW5kaWYKLSNlbmRpZgotCi0gICAgICBjaGFyc2V0X2FsaWFzZXMgPSBjcDsKLSAgICB9Ci0KLSAgcmV0dXJuIGNwOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgY2Fub25pY2FsaXplIGl0Ci0gICBpbnRvIG9uZSBvZiB0aGUgY2Fub25pY2FsIG5hbWVzIGxpc3RlZCBpbiBjb25maWcuY2hhcnNldC4KLSAgIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgZnJlZWQ7IGl0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLgotICAgSWYgdGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgcmVzdWx0IGlzIGEgbm9uLWNhbm9uaWNhbAotICAgbmFtZS4gICovCi0KLSNpZmRlZiBTVEFUSUMKLVNUQVRJQwotI2VuZGlmCi1jb25zdCBjaGFyICoKLWxvY2FsZV9jaGFyc2V0ICh2b2lkKQotewotICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICBjb25zdCBjaGFyICphbGlhc2VzOwotCi0jaWYgIShkZWZpbmVkIFdJTjMyX05BVElWRSB8fCBkZWZpbmVkIE9TMikKLQotIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKLQotICAvKiBNb3N0IHN5c3RlbXMgc3VwcG9ydCBubF9sYW5naW5mbyAoQ09ERVNFVCkgbm93YWRheXMuICAqLwotICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8gKENPREVTRVQpOwotCi0jICBpZmRlZiBfX0NZR1dJTl9fCi0gIC8qIEN5Z3dpbiAyMDA2IGRvZXMgbm90IGhhdmUgbG9jYWxlcy4gIG5sX2xhbmdpbmZvIChDT0RFU0VUKSBhbHdheXMKLSAgICAgcmV0dXJucyAiVVMtQVNDSUkiLiAgQXMgbG9uZyBhcyB0aGlzIGlzIG5vdCBmaXhlZCwgcmV0dXJuIHRoZSBzdWZmaXgKLSAgICAgb2YgdGhlIGxvY2FsZSBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAoaWYgcHJlc2VudCkgb3IKLSAgICAgdGhlIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLSAgaWYgKGNvZGVzZXQgIT0gTlVMTCAmJiBzdHJjbXAgKGNvZGVzZXQsICJVUy1BU0NJSSIpID09IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbG9jYWxlOwotICAgICAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotCi0gICAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKLQl7Ci0JICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19DVFlQRSIpOwotCSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotCSAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7Ci0JfQotICAgICAgaWYgKGxvY2FsZSAhPSBOVUxMICYmIGxvY2FsZVswXSAhPSAnXDAnKQotCXsKLQkgIC8qIElmIHRoZSBsb2NhbGUgbmFtZSBjb250YWlucyBhbiBlbmNvZGluZyBhZnRlciB0aGUgZG90LCByZXR1cm4KLQkgICAgIGl0LiAgKi8KLQkgIGNvbnN0IGNoYXIgKmRvdCA9IHN0cmNociAobG9jYWxlLCAnLicpOwotCi0JICBpZiAoZG90ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKLQotCSAgICAgIGRvdCsrOwotCSAgICAgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KLQkgICAgICBtb2RpZmllciA9IHN0cmNociAoZG90LCAnQCcpOwotCSAgICAgIGlmIChtb2RpZmllciA9PSBOVUxMKQotCQlyZXR1cm4gZG90OwotCSAgICAgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKLQkJewotCQkgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKLQkJICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7Ci0JCSAgcmV0dXJuIGJ1ZjsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXb2UzMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBHZXRBQ1AgKCkpOwotICAgICAgY29kZXNldCA9IGJ1ZjsKLSAgICB9Ci0jICBlbmRpZgotCi0jIGVsc2UKLQotICAvKiBPbiBvbGQgc3lzdGVtcyB3aGljaCBsYWNrIGl0LCB1c2Ugc2V0bG9jYWxlIG9yIGdldGVudi4gICovCi0gIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7Ci0KLSAgLyogQnV0IG1vc3Qgb2xkIHN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHNldCBvZiBsb2NhbGVzLiAgU29tZQotICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0Ci0gICAgIHVzZSBzZXRsb2NhbGUgaGVyZTsgaXQgd291bGQgcmV0dXJuICJDIiB3aGVuIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKLSAgICAgbG9jYWxlIG5hbWUgdGhlIHVzZXIgaGFzIHNldC4gICovCi0jICBpZiAwCi0gIGxvY2FsZSA9IHNldGxvY2FsZSAoTENfQ1RZUEUsIE5VTEwpOwotIyAgZW5kaWYKLSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOwotICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotCXsKLQkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0JICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0JICAgIGxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKLQl9Ci0gICAgfQotCi0gIC8qIE9uIHNvbWUgb2xkIHN5c3RlbXMsIG9uZSB1c2VkIHRvIHNldCBsb2NhbGUgPSAiaXNvODg1OV8xIi4gT24gb3RoZXJzLAotICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAotICAgICB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLwotICBjb2Rlc2V0ID0gbG9jYWxlOwotCi0jIGVuZGlmCi0KLSNlbGlmIGRlZmluZWQgV0lOMzJfTkFUSVZFCi0KLSAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOwotCi0gIC8qIFdvZTMyIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLwotICBzcHJpbnRmIChidWYsICJDUCV1IiwgR2V0QUNQICgpKTsKLSAgY29kZXNldCA9IGJ1ZjsKLQotI2VsaWYgZGVmaW5lZCBPUzIKLQotICBjb25zdCBjaGFyICpsb2NhbGU7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKLSAgVUxPTkcgY3BbM107Ci0gIFVMT05HIGNwbGVuOwotCi0gIC8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGNvZGVzZXQsIGFzIHNldCBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSwKLSAgICAgd2l0aCBzdGFuZGFyZCBsYW5ndWFnZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLwotICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCi0JbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOwotICAgIH0KLSAgaWYgKGxvY2FsZSAhPSBOVUxMICYmIGxvY2FsZVswXSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBsb2NhbGUgbmFtZSBjb250YWlucyBhbiBlbmNvZGluZyBhZnRlciB0aGUgZG90LCByZXR1cm4gaXQuICAqLwotICAgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyIChsb2NhbGUsICcuJyk7Ci0KLSAgICAgIGlmIChkb3QgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICptb2RpZmllcjsKLQotCSAgZG90Kys7Ci0JICAvKiBMb29rIGZvciB0aGUgcG9zc2libGUgQC4uLiB0cmFpbGVyIGFuZCByZW1vdmUgaXQsIGlmIGFueS4gICovCi0JICBtb2RpZmllciA9IHN0cmNociAoZG90LCAnQCcpOwotCSAgaWYgKG1vZGlmaWVyID09IE5VTEwpCi0JICAgIHJldHVybiBkb3Q7Ci0JICBpZiAobW9kaWZpZXIgLSBkb3QgPCBzaXplb2YgKGJ1ZikpCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKGJ1ZiwgZG90LCBtb2RpZmllciAtIGRvdCk7Ci0JICAgICAgYnVmIFttb2RpZmllciAtIGRvdF0gPSAnXDAnOwotCSAgICAgIHJldHVybiBidWY7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFJlc29sdmUgdGhyb3VnaCB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KLSAgICAgIGNvZGVzZXQgPSBsb2NhbGU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT1MvMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChEb3NRdWVyeUNwIChzaXplb2YgKGNwKSwgY3AsICZjcGxlbikpCi0JY29kZXNldCA9ICIiOwotICAgICAgZWxzZQotCXsKLQkgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBjcFswXSk7Ci0JICBjb2Rlc2V0ID0gYnVmOwotCX0KLSAgICB9Ci0KLSNlbmRpZgotCi0gIGlmIChjb2Rlc2V0ID09IE5VTEwpCi0gICAgLyogVGhlIGNhbm9uaWNhbCBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgKi8KLSAgICBjb2Rlc2V0ID0gIiI7Ci0KLSAgLyogUmVzb2x2ZSBhbGlhcy4gKi8KLSAgZm9yIChhbGlhc2VzID0gZ2V0X2NoYXJzZXRfYWxpYXNlcyAoKTsKLSAgICAgICAqYWxpYXNlcyAhPSAnXDAnOwotICAgICAgIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEsIGFsaWFzZXMgKz0gc3RybGVuIChhbGlhc2VzKSArIDEpCi0gICAgaWYgKHN0cmNtcCAoY29kZXNldCwgYWxpYXNlcykgPT0gMAotCXx8IChhbGlhc2VzWzBdID09ICcqJyAmJiBhbGlhc2VzWzFdID09ICdcMCcpKQotICAgICAgewotCWNvZGVzZXQgPSBhbGlhc2VzICsgc3RybGVuIChhbGlhc2VzKSArIDE7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogRG9uJ3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gIEdOVSBsaWJjIGFuZCBHTlUgbGliaWNvbnYgaW50ZXJwcmV0Ci0gICAgIHRoZSBlbXB0eSBzdHJpbmcgYXMgZGVub3RpbmcgInRoZSBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmciLAotICAgICB0aHVzIEdOVSBsaWJpY29udiB3b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYSBzZWNvbmQgdGltZS4gICovCi0gIGlmIChjb2Rlc2V0WzBdID09ICdcMCcpCi0gICAgY29kZXNldCA9ICJBU0NJSSI7Ci0KLSAgcmV0dXJuIGNvZGVzZXQ7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2xvY2FsY2hhcnNldC5oIGIvaW50bC9sb2NhbGNoYXJzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5ZTRhNC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvY2FsY2hhcnNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDSEFSU0VUIExpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfTE9DQUxDSEFSU0VUX0gKLSNkZWZpbmUgX0xPQ0FMQ0hBUlNFVF9ICi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKLSAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgotICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCi0gICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCi0gICBuYW1lLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogbG9jYWxlX2NoYXJzZXQgKHZvaWQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qIF9MT0NBTENIQVJTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9sb2NhbGUuYWxpYXMgYi9pbnRsL2xvY2FsZS5hbGlhcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0NGE0MC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvY2FsZS5hbGlhcworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSMgTG9jYWxlIG5hbWUgYWxpYXMgZGF0YSBiYXNlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSwyMDAzLDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSMgVVNBLgotCi0jIFRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgY29ycmVzcG9uZGluZyBmaWxlIG9mCi0jIHRoZSBYIFdpbmRvdyBTeXN0ZW0sIHdoaWNoIG5vcm1hbGx5IGNhbiBiZSBmb3VuZCBpbgotIwkvdXNyL2xpYi9YMTEvbG9jYWxlL2xvY2FsZS5hbGlhcwotIyBBIHNpbmdsZSBsaW5lIGNvbnRhaW5zIHR3byBmaWVsZHM6IGFuIGFsaWFzIGFuZCBhIHN1YnN0aXR1dGlvbiB2YWx1ZS4KLSMgQWxsIGVudHJpZXMgYXJlIGNhc2UgaW5kZXBlbmRlbnQuCi0KLSMgTm90ZTogVGhpcyBmaWxlIGlzIG9ic29sZXRlIGFuZCBpcyBrZXB0IGFyb3VuZCBmb3IgdGhlIHRpbWUgYmVpbmcgZm9yCi0jIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBOb2JvZHkgc2hvdWxkIHJlbHkgb24gdGhlIG5hbWVzIGRlZmluZWQgaGVyZS4KLSMgTG9jYWxlcyBzaG91bGQgYWx3YXlzIGJlIHNwZWNpZmllZCBieSB0aGVpciBmdWxsIG5hbWUuCi0KLSMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKLQotYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCi1ib2tt5WwJCW5iX05PLklTTy04ODU5LTEKLWNhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKLWNyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKLWN6ZWNoCQljc19DWi5JU08tODg1OS0yCi1kYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQotZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKLWRldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKLWR1dGNoCQlubF9OTC5JU08tODg1OS0xCi1lZXN0aQkJZXRfRUUuSVNPLTg4NTktMQotZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQotZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKLWZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKLWZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQotZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCi1nYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCi1nZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKLWdyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03Ci1oZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAotaHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgotaHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKLWljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCi1pdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQotamFwYW5lc2UJamFfSlAuZXVjSlAKLWphcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAotamFfSlAJCWphX0pQLmV1Y0pQCi1qYV9KUC51amlzCWphX0pQLmV1Y0pQCi1qYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKLWtvcmVhbgkJa29fS1IuZXVjS1IKLWtvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCi1rb19LUgkJa29fS1IuZXVjS1IKLWxpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMwotbm9fTk8JCW5iX05PLklTTy04ODU5LTEKLW5vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQotbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKLW55bm9yc2sJCW5uX05PLklTTy04ODU5LTEKLXBvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCi1wb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQotcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKLXJ1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01Ci1zbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgotc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKLXNsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCi1zcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQotc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKLXRoYWkJCXRoX1RILlRJUy02MjAKLXR1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05CmRpZmYgLS1naXQgYS9pbnRsL2xvY2FsZWFsaWFzLmMgYi9pbnRsL2xvY2FsZWFsaWFzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGRiNTMuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2NhbGVhbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgotICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9fX0ZTRVRMT0NLSU5HCi0jIGluY2x1ZGUgPHN0ZGlvX2V4dC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0jIGluY2x1ZGUgInJlbG9jYXRhYmxlLmgiCi0jZWxzZQotIyBkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBzdHJjYXNlY21wIF9fc3RyY2FzZWNtcAotCi0jIGlmbmRlZiBtZW1wY3B5Ci0jICBkZWZpbmUgbWVtcGNweSBfX21lbXBjcHkKLSMgZW5kaWYKLSMgZGVmaW5lIEhBVkVfTUVNUENQWQkxCi0jIGRlZmluZSBIQVZFX19fRlNFVExPQ0tJTkcJMQotI2VuZGlmCi0KLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsb2NrLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KLSNlbmRpZgotCi0vKiBTb21lIG9wdGltaXphdGlvbnMgZm9yIGdsaWJjLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgRkVPRihmcCkJCWZlb2ZfdW5sb2NrZWQgKGZwKQotIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbiwgZnApCi0jZWxzZQotIyBkZWZpbmUgRkVPRihmcCkJCWZlb2YgKGZwKQotIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHMgKGJ1ZiwgbiwgZnApCi0jZW5kaWYKLQotLyogRm9yIHRob3NlIGxvc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLSMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi0jIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQotIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQgfHwgSEFWRV9ERUNMX0ZHRVRTX1VOTE9DS0VECi0jIHVuZGVmIGZnZXRzCi0jIGRlZmluZSBmZ2V0cyhidWYsIGxlbiwgcykgZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbGVuLCBzKQotI2VuZGlmCi0jaWYgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQgfHwgSEFWRV9ERUNMX0ZFT0ZfVU5MT0NLRUQKLSMgdW5kZWYgZmVvZgotIyBkZWZpbmUgZmVvZihzKSBmZW9mX3VubG9ja2VkIChzKQotI2VuZGlmCi0KLQotX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkIChzdGF0aWMsIGxvY2spCi0KLQotc3RydWN0IGFsaWFzX21hcAotewotICBjb25zdCBjaGFyICphbGlhczsKLSAgY29uc3QgY2hhciAqdmFsdWU7Ci19OwotCi0KLSNpZm5kZWYgX0xJQkMKLSMgZGVmaW5lIGxpYmNfZnJlZXJlc19wdHIoZGVjbCkgZGVjbAotI2VuZGlmCi0KLWxpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBjaGFyICpzdHJpbmdfc3BhY2UpOwotc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfYWN0Owotc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfbWF4OwotbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcCk7Ci1zdGF0aWMgc2l6ZV90IG5tYXA7Ci1zdGF0aWMgc2l6ZV90IG1heG1hcDsKLQotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKQotICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKLXN0YXRpYyBpbnQgZXh0ZW5kX2FsaWFzX3RhYmxlICh2b2lkKTsKLXN0YXRpYyBpbnQgYWxpYXNfY29tcGFyZSAoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwKLQkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMik7Ci0KLQotY29uc3QgY2hhciAqCi1fbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqbG9jYWxlX2FsaWFzX3BhdGg7Ci0gIHN0cnVjdCBhbGlhc19tYXAgKnJldHZhbDsKLSAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKLSAgc2l6ZV90IGFkZGVkOwotCi0gIF9fbGliY19sb2NrX2xvY2sgKGxvY2spOwotCi0gIGlmIChsb2NhbGVfYWxpYXNfcGF0aCA9PSBOVUxMKQotICAgIGxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07Ci0KLSAgICAgIGl0ZW0uYWxpYXMgPSBuYW1lOwotCi0gICAgICBpZiAobm1hcCA+IDApCi0JcmV0dmFsID0gKHN0cnVjdCBhbGlhc19tYXAgKikgYnNlYXJjaCAoJml0ZW0sIG1hcCwgbm1hcCwKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCi0JCQkJCSAgICAgICAoaW50ICgqKSAoY29uc3Qgdm9pZCAqLAotCQkJCQkJCSBjb25zdCB2b2lkICopCi0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotICAgICAgZWxzZQotCXJldHZhbCA9IE5VTEw7Ci0KLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXsKLQkgIHJlc3VsdCA9IHJldHZhbC0+dmFsdWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIFBlcmhhcHMgd2UgY2FuIGZpbmQgYW5vdGhlciBhbGlhcyBmaWxlLiAgKi8KLSAgICAgIGFkZGVkID0gMDsKLSAgICAgIHdoaWxlIChhZGRlZCA9PSAwICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcpCi0JewotCSAgY29uc3QgY2hhciAqc3RhcnQ7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSBQQVRIX1NFUEFSQVRPUikKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7Ci0KLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnCi0JCSAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSBQQVRIX1NFUEFSQVRPUikKLQkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCi0JICAgIGFkZGVkID0gcmVhZF9hbGlhc19maWxlIChzdGFydCwgbG9jYWxlX2FsaWFzX3BhdGggLSBzdGFydCk7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGFkZGVkICE9IDApOwotCi0gIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgc2l6ZV90Ci1pbnRlcm5hbF9mdW5jdGlvbgotcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKLXsKLSAgRklMRSAqZnA7Ci0gIGNoYXIgKmZ1bGxfZm5hbWU7Ci0gIHNpemVfdCBhZGRlZDsKLSAgc3RhdGljIGNvbnN0IGNoYXIgYWxpYXNmaWxlW10gPSAiL2xvY2FsZS5hbGlhcyI7Ci0KLSAgZnVsbF9mbmFtZSA9IChjaGFyICopIGFsbG9jYSAoZm5hbWVfbGVuICsgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0jaWZkZWYgSEFWRV9NRU1QQ1BZCi0gIG1lbXBjcHkgKG1lbXBjcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pLAotCSAgIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0jZWxzZQotICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOwotICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0gIC8qIE5vdGUgdGhlIGZpbGUgaXMgb3BlbmVkIHdpdGggY2FuY2VsbGF0aW9uIGluIHRoZSBJL08gZnVuY3Rpb25zCi0gICAgIGRpc2FibGVkLiAgKi8KLSAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAicmMiKTsKLSNlbHNlCi0gIGZwID0gZm9wZW4gKHJlbG9jYXRlIChmdWxsX2ZuYW1lKSwgInIiKTsKLSNlbmRpZgotICBmcmVlYSAoZnVsbF9mbmFtZSk7Ci0gIGlmIChmcCA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0jaWZkZWYgSEFWRV9fX0ZTRVRMT0NLSU5HCi0gIC8qIE5vIHRocmVhZHMgcHJlc2VudC4gICovCi0gIF9fZnNldGxvY2tpbmcgKGZwLCBGU0VUTE9DS0lOR19CWUNBTExFUik7Ci0jZW5kaWYKLQotICBhZGRlZCA9IDA7Ci0gIHdoaWxlICghRkVPRiAoZnApKQotICAgIHsKLSAgICAgIC8qIEl0IGlzIGEgcmVhc29uYWJsZSBhcHByb2FjaCB0byB1c2UgYSBmaXggYnVmZmVyIGhlcmUgYmVjYXVzZQotCSBhKSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaXJzdCB0d28gZmllbGRzCi0JIGIpIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHVzYWJsZSBhcyBmaWxlIG5hbWVzIGFuZCBzbyBtdXN0IG5vdAotCSAgICBiZSB0aGF0IGxvbmcKLQkgV2UgYXZvaWQgYSBtdWx0aS1raWxvYnl0ZSBidWZmZXIgaGVyZSBzaW5jZSB0aGlzIHdvdWxkIHVzZSB1cAotCSBzdGFjayBzcGFjZSB3aGljaCB3ZSBtaWdodCBub3QgaGF2ZSBpZiB0aGUgcHJvZ3JhbSByYW4gb3V0IG9mCi0JIG1lbW9yeS4gICovCi0gICAgICBjaGFyIGJ1Zls0MDBdOwotICAgICAgY2hhciAqYWxpYXM7Ci0gICAgICBjaGFyICp2YWx1ZTsKLSAgICAgIGNoYXIgKmNwOwotICAgICAgaW50IGNvbXBsZXRlX2xpbmU7Ci0KLSAgICAgIGlmIChGR0VUUyAoYnVmLCBzaXplb2YgYnVmLCBmcCkgPT0gTlVMTCkKLQkvKiBFT0YgcmVhY2hlZC4gICovCi0JYnJlYWs7Ci0KLSAgICAgIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBsaW5lIGlzIGNvbXBsZXRlLiAgKi8KLSAgICAgIGNvbXBsZXRlX2xpbmUgPSBzdHJjaHIgKGJ1ZiwgJ1xuJykgIT0gTlVMTDsKLQotICAgICAgY3AgPSBidWY7Ci0gICAgICAvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKLQkrK2NwOwotCi0gICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLwotICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQotCXsKLQkgIGFsaWFzID0gY3ArKzsKLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotCSAgICArK2NwOwotCSAgLyogVGVybWluYXRlIGFsaWFzIG5hbWUuICAqLwotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgICpjcCsrID0gJ1wwJzsKLQotCSAgLyogTm93IGxvb2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZhbHVlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQotCSAgICArK2NwOwotCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgewotCSAgICAgIHZhbHVlID0gY3ArKzsKLQkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKLQkJKytjcDsKLQkgICAgICAvKiBUZXJtaW5hdGUgdmFsdWUuICAqLwotCSAgICAgIGlmIChjcFswXSA9PSAnXG4nKQotCQl7Ci0JCSAgLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdGVzdAotCQkgICAgIGZvciB0aGUgZW5kIG9mIGxpbmUgcG9zc2libGUuICBXZSBhcmUgbG9va2luZyBmb3IKLQkJICAgICB0aGUgdGVybWluYXRpbmcgJ1xuJyB3aGljaCBkbyBub3Qgb3ZlcndyaXRlIGhlcmUuICAqLwotCQkgICpjcCsrID0gJ1wwJzsKLQkJICAqY3AgPSAnXG4nOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoY3BbMF0gIT0gJ1wwJykKLQkJKmNwKysgPSAnXDAnOwotCi0jaWZkZWYgSU5fTElCR0xPQ0FMRQotCSAgICAgIC8qIGdsaWJjJ3MgbG9jYWxlLmFsaWFzIGNvbnRhaW5zIGVudHJpZXMgZm9yIGphX0pQIGFuZCBrb19LUgotCQkgdGhhdCBtYWtlIGl0IGltcG9zc2libGUgdG8gdXNlIGEgSmFwYW5lc2Ugb3IgS29yZWFuIFVURi04Ci0JCSBsb2NhbGUgdW5kZXIgdGhlIG5hbWUgImphX0pQIiBvciAia29fS1IiLiAgSWdub3JlIHRoZXNlCi0JCSBlbnRyaWVzLiAgKi8KLQkgICAgICBpZiAoc3RyY2hyIChhbGlhcywgJ18nKSA9PSBOVUxMKQotI2VuZGlmCi0JCXsKLQkJICBzaXplX3QgYWxpYXNfbGVuOwotCQkgIHNpemVfdCB2YWx1ZV9sZW47Ci0KLQkJICBpZiAobm1hcCA+PSBtYXhtYXApCi0JCSAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZXh0ZW5kX2FsaWFzX3RhYmxlICgpLCAwKSkKLQkJICAgICAgZ290byBvdXQ7Ci0KLQkJICBhbGlhc19sZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7Ci0JCSAgdmFsdWVfbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOwotCi0JCSAgaWYgKHN0cmluZ19zcGFjZV9hY3QgKyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiBzdHJpbmdfc3BhY2VfbWF4KQotCQkgICAgewotCQkgICAgICAvKiBJbmNyZWFzZSBzaXplIG9mIG1lbW9yeSBwb29sLiAgKi8KLQkJICAgICAgc2l6ZV90IG5ld19zaXplID0gKHN0cmluZ19zcGFjZV9tYXgKLQkJCQkJICsgKGFsaWFzX2xlbiArIHZhbHVlX2xlbiA+IDEwMjQKLQkJCQkJICAgID8gYWxpYXNfbGVuICsgdmFsdWVfbGVuIDogMTAyNCkpOwotCQkgICAgICBjaGFyICpuZXdfcG9vbCA9IChjaGFyICopIHJlYWxsb2MgKHN0cmluZ19zcGFjZSwgbmV3X3NpemUpOwotCQkgICAgICBpZiAobmV3X3Bvb2wgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwotCi0JCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChzdHJpbmdfc3BhY2UgIT0gbmV3X3Bvb2wsIDApKQotCQkJewotCQkJICBzaXplX3QgaTsKLQotCQkJICBmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKQotCQkJICAgIHsKLQkJCSAgICAgIG1hcFtpXS5hbGlhcyArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKLQkJCSAgICAgIG1hcFtpXS52YWx1ZSArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgc3RyaW5nX3NwYWNlID0gbmV3X3Bvb2w7Ci0JCSAgICAgIHN0cmluZ19zcGFjZV9tYXggPSBuZXdfc2l6ZTsKLQkJICAgIH0KLQotCQkgIG1hcFtubWFwXS5hbGlhcyA9Ci0JCSAgICAoY29uc3QgY2hhciAqKSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCi0JCQkJCSAgIGFsaWFzLCBhbGlhc19sZW4pOwotCQkgIHN0cmluZ19zcGFjZV9hY3QgKz0gYWxpYXNfbGVuOwotCi0JCSAgbWFwW25tYXBdLnZhbHVlID0KLQkJICAgIChjb25zdCBjaGFyICopIG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKLQkJCQkJICAgdmFsdWUsIHZhbHVlX2xlbik7Ci0JCSAgc3RyaW5nX3NwYWNlX2FjdCArPSB2YWx1ZV9sZW47Ci0KLQkJICArK25tYXA7Ci0JCSAgKythZGRlZDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBQb3NzaWJseSBub3QgdGhlIHdob2xlIGxpbmUgZml0cyBpbnRvIHRoZSBidWZmZXIuICBJZ25vcmUKLQkgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuICAqLwotICAgICAgaWYgKCEgY29tcGxldGVfbGluZSkKLQlkbwotCSAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQotCSAgICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKLQkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0JICAgIGJyZWFrOwotCXdoaWxlIChzdHJjaHIgKGJ1ZiwgJ1xuJykgPT0gTlVMTCk7Ci0gICAgfQotCi0gb3V0OgotICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCi0gICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KLSAgZmNsb3NlIChmcCk7Ci0KLSAgaWYgKGFkZGVkID4gMCkKLSAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCSAgIChpbnQgKCopIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpIGFsaWFzX2NvbXBhcmUpOwotCi0gIHJldHVybiBhZGRlZDsKLX0KLQotCi1zdGF0aWMgaW50Ci1leHRlbmRfYWxpYXNfdGFibGUgKCkKLXsKLSAgc2l6ZV90IG5ld19zaXplOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOwotCi0gIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOwotICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgcmVhbGxvYyAobWFwLCAobmV3X3NpemUKLQkJCQkJCSogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSkpOwotICBpZiAobmV3X21hcCA9PSBOVUxMKQotICAgIC8qIFNpbXBseSBkb24ndCBleHRlbmQ6IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY29yZS4gICovCi0gICAgcmV0dXJuIC0xOwotCi0gIG1hcCA9IG5ld19tYXA7Ci0gIG1heG1hcCA9IG5ld19zaXplOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1hbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLCBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKQotewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKLSAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7Ci0jZWxzZQotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDEtPmFsaWFzOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1hcDItPmFsaWFzOwotICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKLQotICBpZiAocDEgPT0gcDIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICAvKiBJIGtub3cgdGhpcyBzZWVtcyB0byBiZSBvZGQgYnV0IHRoZSB0b2xvd2VyKCkgZnVuY3Rpb24gaW4KLQkgc29tZSBzeXN0ZW1zIGxpYmMgY2Fubm90IGhhbmRsZSBub25hbHBoYSBjaGFyYWN0ZXJzLiAgKi8KLSAgICAgIGMxID0gaXN1cHBlciAoKnAxKSA/IHRvbG93ZXIgKCpwMSkgOiAqcDE7Ci0gICAgICBjMiA9IGlzdXBwZXIgKCpwMikgPyB0b2xvd2VyICgqcDIpIDogKnAyOwotICAgICAgaWYgKGMxID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICArK3AxOwotICAgICAgKytwMjsKLSAgICB9Ci0gIHdoaWxlIChjMSA9PSBjMik7Ci0KLSAgcmV0dXJuIGMxIC0gYzI7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2ludGwvbG9jYWxlbmFtZS5jIGIvaW50bC9sb2NhbGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNGMyMjkuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2NhbGVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA3ICswLDAgQEAKLS8qIERldGVybWluZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbG9jYWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5vcmc+LCAxOTk1LiAgKi8KLS8qIFdpbjMyIGNvZGUgd3JpdHRlbiBieSBUb3IgTGlsbHF2aXN0IDx0bWxAaWtpLmZpPi4gICovCi0vKiBNYWNPUyBYIGNvZGUgd3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2lmZGVmIElOX0xJQklOVEwKLSMgaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNlbHNlCi0jIGluY2x1ZGUgImxvY2FsZW5hbWUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlN0cmluZy5oPgotIyBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQKLSMgIGluY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NGTG9jYWxlLmg+Ci0jIGVsaWYgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0jICBpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRlByZWZlcmVuY2VzLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCi0jIGRlZmluZSBXSU4zMl9OQVRJVkUKLSNlbmRpZgotCi0jaWZkZWYgV0lOMzJfTkFUSVZFCi0jIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLS8qIExpc3Qgb2YgbGFuZ3VhZ2UgY29kZXMsIHNvcnRlZCBieSB2YWx1ZToKLSAgIDB4MDEgTEFOR19BUkFCSUMKLSAgIDB4MDIgTEFOR19CVUxHQVJJQU4KLSAgIDB4MDMgTEFOR19DQVRBTEFOCi0gICAweDA0IExBTkdfQ0hJTkVTRQotICAgMHgwNSBMQU5HX0NaRUNICi0gICAweDA2IExBTkdfREFOSVNICi0gICAweDA3IExBTkdfR0VSTUFOCi0gICAweDA4IExBTkdfR1JFRUsKLSAgIDB4MDkgTEFOR19FTkdMSVNICi0gICAweDBhIExBTkdfU1BBTklTSAotICAgMHgwYiBMQU5HX0ZJTk5JU0gKLSAgIDB4MGMgTEFOR19GUkVOQ0gKLSAgIDB4MGQgTEFOR19IRUJSRVcKLSAgIDB4MGUgTEFOR19IVU5HQVJJQU4KLSAgIDB4MGYgTEFOR19JQ0VMQU5ESUMKLSAgIDB4MTAgTEFOR19JVEFMSUFOCi0gICAweDExIExBTkdfSkFQQU5FU0UKLSAgIDB4MTIgTEFOR19LT1JFQU4KLSAgIDB4MTMgTEFOR19EVVRDSAotICAgMHgxNCBMQU5HX05PUldFR0lBTgotICAgMHgxNSBMQU5HX1BPTElTSAotICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKLSAgIDB4MTcgTEFOR19SSEFFVE9fUk9NQU5DRQotICAgMHgxOCBMQU5HX1JPTUFOSUFOCi0gICAweDE5IExBTkdfUlVTU0lBTgotICAgMHgxYSBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgotICAgMHgxYiBMQU5HX1NMT1ZBSwotICAgMHgxYyBMQU5HX0FMQkFOSUFOCi0gICAweDFkIExBTkdfU1dFRElTSAotICAgMHgxZSBMQU5HX1RIQUkKLSAgIDB4MWYgTEFOR19UVVJLSVNICi0gICAweDIwIExBTkdfVVJEVQotICAgMHgyMSBMQU5HX0lORE9ORVNJQU4KLSAgIDB4MjIgTEFOR19VS1JBSU5JQU4KLSAgIDB4MjMgTEFOR19CRUxBUlVTSUFOCi0gICAweDI0IExBTkdfU0xPVkVOSUFOCi0gICAweDI1IExBTkdfRVNUT05JQU4KLSAgIDB4MjYgTEFOR19MQVRWSUFOCi0gICAweDI3IExBTkdfTElUSFVBTklBTgotICAgMHgyOCBMQU5HX1RBSklLCi0gICAweDI5IExBTkdfRkFSU0kKLSAgIDB4MmEgTEFOR19WSUVUTkFNRVNFCi0gICAweDJiIExBTkdfQVJNRU5JQU4KLSAgIDB4MmMgTEFOR19BWkVSSQotICAgMHgyZCBMQU5HX0JBU1FVRQotICAgMHgyZSBMQU5HX1NPUkJJQU4KLSAgIDB4MmYgTEFOR19NQUNFRE9OSUFOCi0gICAweDMwIExBTkdfU1VUVQotICAgMHgzMSBMQU5HX1RTT05HQQotICAgMHgzMiBMQU5HX1RTV0FOQQotICAgMHgzMyBMQU5HX1ZFTkRBCi0gICAweDM0IExBTkdfWEhPU0EKLSAgIDB4MzUgTEFOR19aVUxVCi0gICAweDM2IExBTkdfQUZSSUtBQU5TCi0gICAweDM3IExBTkdfR0VPUkdJQU4KLSAgIDB4MzggTEFOR19GQUVST0VTRQotICAgMHgzOSBMQU5HX0hJTkRJCi0gICAweDNhIExBTkdfTUFMVEVTRQotICAgMHgzYiBMQU5HX1NBQU1JCi0gICAweDNjIExBTkdfR0FFTElDCi0gICAweDNkIExBTkdfWUlERElTSAotICAgMHgzZSBMQU5HX01BTEFZCi0gICAweDNmIExBTkdfS0FaQUsKLSAgIDB4NDAgTEFOR19LWVJHWVoKLSAgIDB4NDEgTEFOR19TV0FISUxJCi0gICAweDQyIExBTkdfVFVSS01FTgotICAgMHg0MyBMQU5HX1VaQkVLCi0gICAweDQ0IExBTkdfVEFUQVIKLSAgIDB4NDUgTEFOR19CRU5HQUxJCi0gICAweDQ2IExBTkdfUFVOSkFCSQotICAgMHg0NyBMQU5HX0dVSkFSQVRJCi0gICAweDQ4IExBTkdfT1JJWUEKLSAgIDB4NDkgTEFOR19UQU1JTAotICAgMHg0YSBMQU5HX1RFTFVHVQotICAgMHg0YiBMQU5HX0tBTk5BREEKLSAgIDB4NGMgTEFOR19NQUxBWUFMQU0KLSAgIDB4NGQgTEFOR19BU1NBTUVTRQotICAgMHg0ZSBMQU5HX01BUkFUSEkKLSAgIDB4NGYgTEFOR19TQU5TS1JJVAotICAgMHg1MCBMQU5HX01PTkdPTElBTgotICAgMHg1MSBMQU5HX1RJQkVUQU4KLSAgIDB4NTIgTEFOR19XRUxTSAotICAgMHg1MyBMQU5HX0NBTUJPRElBTgotICAgMHg1NCBMQU5HX0xBTwotICAgMHg1NSBMQU5HX0JVUk1FU0UKLSAgIDB4NTYgTEFOR19HQUxJQ0lBTgotICAgMHg1NyBMQU5HX0tPTktBTkkKLSAgIDB4NTggTEFOR19NQU5JUFVSSQotICAgMHg1OSBMQU5HX1NJTkRISQotICAgMHg1YSBMQU5HX1NZUklBQwotICAgMHg1YiBMQU5HX1NJTkhBTEVTRQotICAgMHg1YyBMQU5HX0NIRVJPS0VFCi0gICAweDVkIExBTkdfSU5VS1RJVFVUCi0gICAweDVlIExBTkdfQU1IQVJJQwotICAgMHg1ZiBMQU5HX1RBTUFaSUdIVAotICAgMHg2MCBMQU5HX0tBU0hNSVJJCi0gICAweDYxIExBTkdfTkVQQUxJCi0gICAweDYyIExBTkdfRlJJU0lBTgotICAgMHg2MyBMQU5HX1BBU0hUTwotICAgMHg2NCBMQU5HX1RBR0FMT0cKLSAgIDB4NjUgTEFOR19ESVZFSEkKLSAgIDB4NjYgTEFOR19FRE8KLSAgIDB4NjcgTEFOR19GVUxGVUxERQotICAgMHg2OCBMQU5HX0hBVVNBCi0gICAweDY5IExBTkdfSUJJQklPCi0gICAweDZhIExBTkdfWU9SVUJBCi0gICAweDcwIExBTkdfSUdCTwotICAgMHg3MSBMQU5HX0tBTlVSSQotICAgMHg3MiBMQU5HX09ST01PCi0gICAweDczIExBTkdfVElHUklOWUEKLSAgIDB4NzQgTEFOR19HVUFSQU5JCi0gICAweDc1IExBTkdfSEFXQUlJQU4KLSAgIDB4NzYgTEFOR19MQVRJTgotICAgMHg3NyBMQU5HX1NPTUFMSQotICAgMHg3OCBMQU5HX1lJCi0gICAweDc5IExBTkdfUEFQSUFNRU5UVQotKi8KLS8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KLSMgaWZuZGVmIExBTkdfQUZSSUtBQU5TCi0jIGRlZmluZSBMQU5HX0FGUklLQUFOUyAweDM2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0FMQkFOSUFOCi0jIGRlZmluZSBMQU5HX0FMQkFOSUFOIDB4MWMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQU1IQVJJQwotIyBkZWZpbmUgTEFOR19BTUhBUklDIDB4NWUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQVJBQklDCi0jIGRlZmluZSBMQU5HX0FSQUJJQyAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0FSTUVOSUFOCi0jIGRlZmluZSBMQU5HX0FSTUVOSUFOIDB4MmIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQVNTQU1FU0UKLSMgZGVmaW5lIExBTkdfQVNTQU1FU0UgMHg0ZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19BWkVSSQotIyBkZWZpbmUgTEFOR19BWkVSSSAweDJjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0JBU1FVRQotIyBkZWZpbmUgTEFOR19CQVNRVUUgMHgyZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CRUxBUlVTSUFOCi0jIGRlZmluZSBMQU5HX0JFTEFSVVNJQU4gMHgyMwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CRU5HQUxJCi0jIGRlZmluZSBMQU5HX0JFTkdBTEkgMHg0NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19CVVJNRVNFCi0jIGRlZmluZSBMQU5HX0JVUk1FU0UgMHg1NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19DQU1CT0RJQU4KLSMgZGVmaW5lIExBTkdfQ0FNQk9ESUFOIDB4NTMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQ0FUQUxBTgotIyBkZWZpbmUgTEFOR19DQVRBTEFOIDB4MDMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfQ0hFUk9LRUUKLSMgZGVmaW5lIExBTkdfQ0hFUk9LRUUgMHg1YwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ESVZFSEkKLSMgZGVmaW5lIExBTkdfRElWRUhJIDB4NjUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfRURPCi0jIGRlZmluZSBMQU5HX0VETyAweDY2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0VTVE9OSUFOCi0jIGRlZmluZSBMQU5HX0VTVE9OSUFOIDB4MjUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfRkFFUk9FU0UKLSMgZGVmaW5lIExBTkdfRkFFUk9FU0UgMHgzOAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19GQVJTSQotIyBkZWZpbmUgTEFOR19GQVJTSSAweDI5Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0ZSSVNJQU4KLSMgZGVmaW5lIExBTkdfRlJJU0lBTiAweDYyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0ZVTEZVTERFCi0jIGRlZmluZSBMQU5HX0ZVTEZVTERFIDB4NjcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfR0FFTElDCi0jIGRlZmluZSBMQU5HX0dBRUxJQyAweDNjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0dBTElDSUFOCi0jIGRlZmluZSBMQU5HX0dBTElDSUFOIDB4NTYKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfR0VPUkdJQU4KLSMgZGVmaW5lIExBTkdfR0VPUkdJQU4gMHgzNwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19HVUFSQU5JCi0jIGRlZmluZSBMQU5HX0dVQVJBTkkgMHg3NAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19HVUpBUkFUSQotIyBkZWZpbmUgTEFOR19HVUpBUkFUSSAweDQ3Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0hBVVNBCi0jIGRlZmluZSBMQU5HX0hBVVNBIDB4NjgKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSEFXQUlJQU4KLSMgZGVmaW5lIExBTkdfSEFXQUlJQU4gMHg3NQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19IRUJSRVcKLSMgZGVmaW5lIExBTkdfSEVCUkVXIDB4MGQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSElOREkKLSMgZGVmaW5lIExBTkdfSElOREkgMHgzOQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19JQklCSU8KLSMgZGVmaW5lIExBTkdfSUJJQklPIDB4NjkKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSUdCTwotIyBkZWZpbmUgTEFOR19JR0JPIDB4NzAKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSU5ET05FU0lBTgotIyBkZWZpbmUgTEFOR19JTkRPTkVTSUFOIDB4MjEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfSU5VS1RJVFVUCi0jIGRlZmluZSBMQU5HX0lOVUtUSVRVVCAweDVkCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBTk5BREEKLSMgZGVmaW5lIExBTkdfS0FOTkFEQSAweDRiCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBTlVSSQotIyBkZWZpbmUgTEFOR19LQU5VUkkgMHg3MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19LQVNITUlSSQotIyBkZWZpbmUgTEFOR19LQVNITUlSSSAweDYwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0tBWkFLCi0jIGRlZmluZSBMQU5HX0tBWkFLIDB4M2YKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfS09OS0FOSQotIyBkZWZpbmUgTEFOR19LT05LQU5JIDB4NTcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfS1lSR1laCi0jIGRlZmluZSBMQU5HX0tZUkdZWiAweDQwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xBTwotIyBkZWZpbmUgTEFOR19MQU8gMHg1NAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19MQVRJTgotIyBkZWZpbmUgTEFOR19MQVRJTiAweDc2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xBVFZJQU4KLSMgZGVmaW5lIExBTkdfTEFUVklBTiAweDI2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX0xJVEhVQU5JQU4KLSMgZGVmaW5lIExBTkdfTElUSFVBTklBTiAweDI3Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BQ0VET05JQU4KLSMgZGVmaW5lIExBTkdfTUFDRURPTklBTiAweDJmCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTEFZCi0jIGRlZmluZSBMQU5HX01BTEFZIDB4M2UKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTUFMQVlBTEFNCi0jIGRlZmluZSBMQU5HX01BTEFZQUxBTSAweDRjCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTFRFU0UKLSMgZGVmaW5lIExBTkdfTUFMVEVTRSAweDNhCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX01BTklQVVJJCi0jIGRlZmluZSBMQU5HX01BTklQVVJJIDB4NTgKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTUFSQVRISQotIyBkZWZpbmUgTEFOR19NQVJBVEhJIDB4NGUKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfTU9OR09MSUFOCi0jIGRlZmluZSBMQU5HX01PTkdPTElBTiAweDUwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX05FUEFMSQotIyBkZWZpbmUgTEFOR19ORVBBTEkgMHg2MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19PUklZQQotIyBkZWZpbmUgTEFOR19PUklZQSAweDQ4Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX09ST01PCi0jIGRlZmluZSBMQU5HX09ST01PIDB4NzIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfUEFQSUFNRU5UVQotIyBkZWZpbmUgTEFOR19QQVBJQU1FTlRVIDB4NzkKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfUEFTSFRPCi0jIGRlZmluZSBMQU5HX1BBU0hUTyAweDYzCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1BVTkpBQkkKLSMgZGVmaW5lIExBTkdfUFVOSkFCSSAweDQ2Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1JIQUVUT19ST01BTkNFCi0jIGRlZmluZSBMQU5HX1JIQUVUT19ST01BTkNFIDB4MTcKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfU0FBTUkKLSMgZGVmaW5lIExBTkdfU0FBTUkgMHgzYgotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TQU5TS1JJVAotIyBkZWZpbmUgTEFOR19TQU5TS1JJVCAweDRmCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NFUkJJQU4KLSMgZGVmaW5lIExBTkdfU0VSQklBTiAweDFhCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NJTkRISQotIyBkZWZpbmUgTEFOR19TSU5ESEkgMHg1OQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TSU5IQUxFU0UKLSMgZGVmaW5lIExBTkdfU0lOSEFMRVNFIDB4NWIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfU0xPVkFLCi0jIGRlZmluZSBMQU5HX1NMT1ZBSyAweDFiCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1NPTUFMSQotIyBkZWZpbmUgTEFOR19TT01BTEkgMHg3NwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TT1JCSUFOCi0jIGRlZmluZSBMQU5HX1NPUkJJQU4gMHgyZQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TVVRVCi0jIGRlZmluZSBMQU5HX1NVVFUgMHgzMAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TV0FISUxJCi0jIGRlZmluZSBMQU5HX1NXQUhJTEkgMHg0MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19TWVJJQUMKLSMgZGVmaW5lIExBTkdfU1lSSUFDIDB4NWEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFHQUxPRwotIyBkZWZpbmUgTEFOR19UQUdBTE9HIDB4NjQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFKSUsKLSMgZGVmaW5lIExBTkdfVEFKSUsgMHgyOAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UQU1BWklHSFQKLSMgZGVmaW5lIExBTkdfVEFNQVpJR0hUIDB4NWYKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVEFNSUwKLSMgZGVmaW5lIExBTkdfVEFNSUwgMHg0OQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UQVRBUgotIyBkZWZpbmUgTEFOR19UQVRBUiAweDQ0Ci0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1RFTFVHVQotIyBkZWZpbmUgTEFOR19URUxVR1UgMHg0YQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USEFJCi0jIGRlZmluZSBMQU5HX1RIQUkgMHgxZQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USUJFVEFOCi0jIGRlZmluZSBMQU5HX1RJQkVUQU4gMHg1MQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19USUdSSU5ZQQotIyBkZWZpbmUgTEFOR19USUdSSU5ZQSAweDczCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1RTT05HQQotIyBkZWZpbmUgTEFOR19UU09OR0EgMHgzMQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19UU1dBTkEKLSMgZGVmaW5lIExBTkdfVFNXQU5BIDB4MzIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVFVSS01FTgotIyBkZWZpbmUgTEFOR19UVVJLTUVOIDB4NDIKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVUtSQUlOSUFOCi0jIGRlZmluZSBMQU5HX1VLUkFJTklBTiAweDIyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1VSRFUKLSMgZGVmaW5lIExBTkdfVVJEVSAweDIwCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1VaQkVLCi0jIGRlZmluZSBMQU5HX1VaQkVLIDB4NDMKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfVkVOREEKLSMgZGVmaW5lIExBTkdfVkVOREEgMHgzMwotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19WSUVUTkFNRVNFCi0jIGRlZmluZSBMQU5HX1ZJRVROQU1FU0UgMHgyYQotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19XRUxTSAotIyBkZWZpbmUgTEFOR19XRUxTSCAweDUyCi0jIGVuZGlmCi0jIGlmbmRlZiBMQU5HX1hIT1NBCi0jIGRlZmluZSBMQU5HX1hIT1NBIDB4MzQKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfWUkKLSMgZGVmaW5lIExBTkdfWUkgMHg3OAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ZSURESVNICi0jIGRlZmluZSBMQU5HX1lJRERJU0ggMHgzZAotIyBlbmRpZgotIyBpZm5kZWYgTEFOR19ZT1JVQkEKLSMgZGVmaW5lIExBTkdfWU9SVUJBIDB4NmEKLSMgZW5kaWYKLSMgaWZuZGVmIExBTkdfWlVMVQotIyBkZWZpbmUgTEFOR19aVUxVIDB4MzUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0lSQVEKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfRUdZUFQKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0VHWVBUIDB4MDMKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xJQllBCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAweDA0Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19BTEdFUklBCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBIDB4MDUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX01PUk9DQ08KLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX01PUk9DQ08gMHgwNgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVFVOSVNJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVFVOSVNJQSAweDA3Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19PTUFOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19PTUFOIDB4MDgKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1lFTUVOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAweDA5Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TWVJJQQotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU1lSSUEgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfSk9SREFOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU4gMHgwYgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTEVCQU5PTgotIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19LVVdBSVQKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAweDBkCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19VQUUKLSMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAweDBlCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1FBVEFSCi0jIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAweDEwCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX0FaRVJJX0xBVElOIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMKLSMgZGVmaW5lIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfSU5ESUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0gKLSMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIIDB4MDIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVQotIyBkZWZpbmUgU1VCTEFOR19DSElORVNFX01BQ0FVIDB4MDUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EgMHgwNwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBIDB4MDgKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4KLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4gMHgwOQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0JFTElaRQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0JFTElaRSAweDBhCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAweDBiCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRSAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUyAweDBkCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBCi0jIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBIDB4MGUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORwotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9JTkRJQQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORElBIDB4MTAKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQQotIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBIDB4MTEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUKLSMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUgMHgxMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRwotIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT05BQ08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAweDA2Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTIDB4MDcKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04gMHgwOAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ09OR08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPTkdPIDB4MDkKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwKLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OIDB4MGIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRSAweDBjCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NQUxJCi0jIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NQUxJIDB4MGQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08KLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08gMHgwZQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfSEFJVEkKLSMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0hBSVRJIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcKLSMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgMHgwNAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTgotIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX0tBU0hNSVJJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBIDB4MDIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEKLSMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTQotIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX05FUEFMSV9JTkRJQQotIyBkZWZpbmUgU1VCTEFOR19ORVBBTElfSU5ESUEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfSU5ESUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOCi0jIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4gMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9ST01BTklBCi0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBCi0jIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU4gMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDCi0jIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgMHgwMwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TSU5ESElfUEFLSVNUQU4KLSMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOIDB4MDEKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX0FGR0hBTklTVEFOCi0jIGRlZmluZSBTVUJMQU5HX1NJTkRISV9BRkdIQU5JU1RBTiAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBIDB4MDQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQSAweDA1Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BIDB4MDYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgMHgwNwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSAweDA4Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAweDA5Ci0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEVSVQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgMHgwYQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSAweDBiCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUgotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgMHgwYwotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NISUxFCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgMHgwZAotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZIDB4MGUKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWQotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZIDB4MGYKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAweDEwCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUiAweDExCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMKLSMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAweDEyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBCi0jIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBIDB4MTMKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTwotIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPIDB4MTQKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5ECi0jIGRlZmluZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORCAweDAyCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMKLSMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQyAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9BTEdFUklBX0xBVElOCi0jIGRlZmluZSBTVUJMQU5HX1RBTUFaSUdIVF9BTEdFUklBX0xBVElOIDB4MDIKLSMgZW5kaWYKLSMgaWZuZGVmIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEKLSMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVRISU9QSUEgMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBCi0jIGRlZmluZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19VUkRVX1BBS0lTVEFOCi0jIGRlZmluZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU4gMHgwMQotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19VUkRVX0lORElBCi0jIGRlZmluZSBTVUJMQU5HX1VSRFVfSU5ESUEgMHgwMgotIyBlbmRpZgotIyBpZm5kZWYgU1VCTEFOR19VWkJFS19MQVRJTgotIyBkZWZpbmUgU1VCTEFOR19VWkJFS19MQVRJTiAweDAxCi0jIGVuZGlmCi0jIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0NZUklMTElDCi0jIGRlZmluZSBTVUJMQU5HX1VaQkVLX0NZUklMTElDIDB4MDIKLSMgZW5kaWYKLSNlbmRpZgotCi0jIGlmIEhBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVCB8fCBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUKLS8qIE1hY09TIFggMTAuMiBvciBuZXdlciAqLwotCi0vKiBDYW5vbmljYWxpemUgYSBNYWNPUyBYIGxvY2FsZSBuYW1lIHRvIGEgVW5peCBsb2NhbGUgbmFtZS4KLSAgIE5BTUUgaXMgYSBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyLgotICAgT24gaW5wdXQsIGl0IGNvbnRhaW5zIHRoZSBNYWNPUyBYIGxvY2FsZSBuYW1lLgotICAgT24gb3V0cHV0LCBpdCBjb250YWlucyB0aGUgVW5peCBsb2NhbGUgbmFtZS4gICovCi0jICBpZiAhZGVmaW5lZCBJTl9MSUJJTlRMCi1zdGF0aWMKLSMgIGVuZGlmCi12b2lkCi1nbF9sb2NhbGVfbmFtZV9jYW5vbmljYWxpemUgKGNoYXIgKm5hbWUpCi17Ci0gIC8qIFRoaXMgY29udmVyc2lvbiBpcyBiYXNlZCBvbiBhIHBvc3RpbmcgYnkKLSAgICAgRGVib3JhaCBHb2xkU21pdGggPGdvbGRzbWl0QGFwcGxlLmNvbT4gb24gMjAwNS0wMy0wOCwKLSAgICAgaHR0cDovL2xpc3RzLmFwcGxlLmNvbS9hcmNoaXZlcy9jYXJib24tZGV2LzIwMDUvTWFyL21zZzAwMjkzLmh0bWwgKi8KLQotICAvKiBDb252ZXJ0IGxlZ2FjeSAoTmVYVHN0ZXAgaW5oZXJpdGVkKSBFbmdsaXNoIG5hbWVzIHRvIFVuaXggKElTTyA2MzkgYW5kCi0gICAgIElTTyAzMTY2KSBuYW1lcy4gIFByaW9yIHRvIE1hY09TIFggMTAuMywgdGhlcmUgaXMgbm8gQVBJIGZvciBkb2luZyB0aGlzLgotICAgICBUaGVyZWZvcmUgd2UgZG8gaXQgb3Vyc2VsdmVzLCB1c2luZyBhIHRhYmxlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZQotICAgICBNYWNPUyBYIDEwLjMuOCBmdW5jdGlvbgotICAgICBDRkxvY2FsZUNyZWF0ZUNhbm9uaWNhbExvY2FsZUlkZW50aWZpZXJGcm9tU3RyaW5nKCkuICAqLwotICB0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGNoYXIgbGVnYWN5WzIxKzFdOyBjb25zdCBjaGFyIHVuaXh5WzUrMV07IH0KLQkgIGxlZ2FjeV9lbnRyeTsKLSAgc3RhdGljIGNvbnN0IGxlZ2FjeV9lbnRyeSBsZWdhY3lfdGFibGVbXSA9IHsKLSAgICB7ICJBZnJpa2FhbnMiLCAgICAgICAgICAgICAiYWYiIH0sCi0gICAgeyAiQWxiYW5pYW4iLCAgICAgICAgICAgICAgInNxIiB9LAotICAgIHsgIkFtaGFyaWMiLCAgICAgICAgICAgICAgICJhbSIgfSwKLSAgICB7ICJBcmFiaWMiLCAgICAgICAgICAgICAgICAiYXIiIH0sCi0gICAgeyAiQXJtZW5pYW4iLCAgICAgICAgICAgICAgImh5IiB9LAotICAgIHsgIkFzc2FtZXNlIiwgICAgICAgICAgICAgICJhcyIgfSwKLSAgICB7ICJBeW1hcmEiLCAgICAgICAgICAgICAgICAiYXkiIH0sCi0gICAgeyAiQXplcmJhaWphbmkiLCAgICAgICAgICAgImF6IiB9LAotICAgIHsgIkJhc3F1ZSIsICAgICAgICAgICAgICAgICJldSIgfSwKLSAgICB7ICJCZWxhcnVzaWFuIiwgICAgICAgICAgICAiYmUiIH0sCi0gICAgeyAiQmVsb3J1c3NpYW4iLCAgICAgICAgICAgImJlIiB9LAotICAgIHsgIkJlbmdhbGkiLCAgICAgICAgICAgICAgICJibiIgfSwKLSAgICB7ICJCcmF6aWxpYW4gUG9ydHVnZXNlIiwgICAicHRfQlIiIH0sCi0gICAgeyAiQnJhemlsaWFuIFBvcnR1Z3Vlc2UiLCAgInB0X0JSIiB9LAotICAgIHsgIkJyZXRvbiIsICAgICAgICAgICAgICAgICJiciIgfSwKLSAgICB7ICJCdWxnYXJpYW4iLCAgICAgICAgICAgICAiYmciIH0sCi0gICAgeyAiQnVybWVzZSIsICAgICAgICAgICAgICAgIm15IiB9LAotICAgIHsgIkJ5ZWxvcnVzc2lhbiIsICAgICAgICAgICJiZSIgfSwKLSAgICB7ICJDYXRhbGFuIiwgICAgICAgICAgICAgICAiY2EiIH0sCi0gICAgeyAiQ2hld2EiLCAgICAgICAgICAgICAgICAgIm55IiB9LAotICAgIHsgIkNoaWNoZXdhIiwgICAgICAgICAgICAgICJueSIgfSwKLSAgICB7ICJDaGluZXNlIiwgICAgICAgICAgICAgICAiemgiIH0sCi0gICAgeyAiQ2hpbmVzZSwgU2ltcGxpZmllZCIsICAgInpoX0NOIiB9LAotICAgIHsgIkNoaW5lc2UsIFRyYWRpdGlvbmFsIiwgICJ6aF9UVyIgfSwKLSAgICB7ICJDaGluZXNlLCBUcmFkdGlvbmFsIiwgICAiemhfVFciIH0sCi0gICAgeyAiQ3JvYXRpYW4iLCAgICAgICAgICAgICAgImhyIiB9LAotICAgIHsgIkN6ZWNoIiwgICAgICAgICAgICAgICAgICJjcyIgfSwKLSAgICB7ICJEYW5pc2giLCAgICAgICAgICAgICAgICAiZGEiIH0sCi0gICAgeyAiRHV0Y2giLCAgICAgICAgICAgICAgICAgIm5sIiB9LAotICAgIHsgIkR6b25na2hhIiwgICAgICAgICAgICAgICJkeiIgfSwKLSAgICB7ICJFbmdsaXNoIiwgICAgICAgICAgICAgICAiZW4iIH0sCi0gICAgeyAiRXNwZXJhbnRvIiwgICAgICAgICAgICAgImVvIiB9LAotICAgIHsgIkVzdG9uaWFuIiwgICAgICAgICAgICAgICJldCIgfSwKLSAgICB7ICJGYXJvZXNlIiwgICAgICAgICAgICAgICAiZm8iIH0sCi0gICAgeyAiRmFyc2kiLCAgICAgICAgICAgICAgICAgImZhIiB9LAotICAgIHsgIkZpbm5pc2giLCAgICAgICAgICAgICAgICJmaSIgfSwKLSAgICB7ICJGbGVtaXNoIiwgICAgICAgICAgICAgICAibmxfQkUiIH0sCi0gICAgeyAiRnJlbmNoIiwgICAgICAgICAgICAgICAgImZyIiB9LAotICAgIHsgIkdhbGljaWFuIiwgICAgICAgICAgICAgICJnbCIgfSwKLSAgICB7ICJHYWxsZWdhbiIsICAgICAgICAgICAgICAiZ2wiIH0sCi0gICAgeyAiR2VvcmdpYW4iLCAgICAgICAgICAgICAgImthIiB9LAotICAgIHsgIkdlcm1hbiIsICAgICAgICAgICAgICAgICJkZSIgfSwKLSAgICB7ICJHcmVlayIsICAgICAgICAgICAgICAgICAiZWwiIH0sCi0gICAgeyAiR3JlZW5sYW5kaWMiLCAgICAgICAgICAgImtsIiB9LAotICAgIHsgIkd1YXJhbmkiLCAgICAgICAgICAgICAgICJnbiIgfSwKLSAgICB7ICJHdWphcmF0aSIsICAgICAgICAgICAgICAiZ3UiIH0sCi0gICAgeyAiSGF3YWlpYW4iLCAgICAgICAgICAgICAgImhhdyIgfSwgLyogWWVzLCAiaGF3Iiwgbm90ICJjcGUiLiAgKi8KLSAgICB7ICJIZWJyZXciLCAgICAgICAgICAgICAgICAiaGUiIH0sCi0gICAgeyAiSGluZGkiLCAgICAgICAgICAgICAgICAgImhpIiB9LAotICAgIHsgIkh1bmdhcmlhbiIsICAgICAgICAgICAgICJodSIgfSwKLSAgICB7ICJJY2VsYW5kaWMiLCAgICAgICAgICAgICAiaXMiIH0sCi0gICAgeyAiSW5kb25lc2lhbiIsICAgICAgICAgICAgImlkIiB9LAotICAgIHsgIkludWt0aXR1dCIsICAgICAgICAgICAgICJpdSIgfSwKLSAgICB7ICJJcmlzaCIsICAgICAgICAgICAgICAgICAiZ2EiIH0sCi0gICAgeyAiSXRhbGlhbiIsICAgICAgICAgICAgICAgIml0IiB9LAotICAgIHsgIkphcGFuZXNlIiwgICAgICAgICAgICAgICJqYSIgfSwKLSAgICB7ICJKYXZhbmVzZSIsICAgICAgICAgICAgICAianYiIH0sCi0gICAgeyAiS2FsYWFsbGlzdXQiLCAgICAgICAgICAgImtsIiB9LAotICAgIHsgIkthbm5hZGEiLCAgICAgICAgICAgICAgICJrbiIgfSwKLSAgICB7ICJLYXNobWlyaSIsICAgICAgICAgICAgICAia3MiIH0sCi0gICAgeyAiS2F6YWtoIiwgICAgICAgICAgICAgICAgImtrIiB9LAotICAgIHsgIktobWVyIiwgICAgICAgICAgICAgICAgICJrbSIgfSwKLSAgICB7ICJLaW55YXJ3YW5kYSIsICAgICAgICAgICAicnciIH0sCi0gICAgeyAiS2lyZ2hpeiIsICAgICAgICAgICAgICAgImt5IiB9LAotICAgIHsgIktvcmVhbiIsICAgICAgICAgICAgICAgICJrbyIgfSwKLSAgICB7ICJLdXJkaXNoIiwgICAgICAgICAgICAgICAia3UiIH0sCi0gICAgeyAiTGF0aW4iLCAgICAgICAgICAgICAgICAgImxhIiB9LAotICAgIHsgIkxhdHZpYW4iLCAgICAgICAgICAgICAgICJsdiIgfSwKLSAgICB7ICJMaXRodWFuaWFuIiwgICAgICAgICAgICAibHQiIH0sCi0gICAgeyAiTWFjZWRvbmlhbiIsICAgICAgICAgICAgIm1rIiB9LAotICAgIHsgIk1hbGFnYXN5IiwgICAgICAgICAgICAgICJtZyIgfSwKLSAgICB7ICJNYWxheSIsICAgICAgICAgICAgICAgICAibXMiIH0sCi0gICAgeyAiTWFsYXlhbGFtIiwgICAgICAgICAgICAgIm1sIiB9LAotICAgIHsgIk1hbHRlc2UiLCAgICAgICAgICAgICAgICJtdCIgfSwKLSAgICB7ICJNYW54IiwgICAgICAgICAgICAgICAgICAiZ3YiIH0sCi0gICAgeyAiTWFyYXRoaSIsICAgICAgICAgICAgICAgIm1yIiB9LAotICAgIHsgIk1vbGRhdmlhbiIsICAgICAgICAgICAgICJtbyIgfSwKLSAgICB7ICJNb25nb2xpYW4iLCAgICAgICAgICAgICAibW4iIH0sCi0gICAgeyAiTmVwYWxpIiwgICAgICAgICAgICAgICAgIm5lIiB9LAotICAgIHsgIk5vcndlZ2lhbiIsICAgICAgICAgICAgICJuYiIgfSwgLyogWWVzLCAibmIiLCBub3QgdGhlIG9ic29sZXRlICJubyIuICAqLwotICAgIHsgIk55YW5qYSIsICAgICAgICAgICAgICAgICJueSIgfSwKLSAgICB7ICJOeW5vcnNrIiwgICAgICAgICAgICAgICAibm4iIH0sCi0gICAgeyAiT3JpeWEiLCAgICAgICAgICAgICAgICAgIm9yIiB9LAotICAgIHsgIk9yb21vIiwgICAgICAgICAgICAgICAgICJvbSIgfSwKLSAgICB7ICJQYW5qYWJpIiwgICAgICAgICAgICAgICAicGEiIH0sCi0gICAgeyAiUGFzaHRvIiwgICAgICAgICAgICAgICAgInBzIiB9LAotICAgIHsgIlBlcnNpYW4iLCAgICAgICAgICAgICAgICJmYSIgfSwKLSAgICB7ICJQb2xpc2giLCAgICAgICAgICAgICAgICAicGwiIH0sCi0gICAgeyAiUG9ydHVndWVzZSIsICAgICAgICAgICAgInB0IiB9LAotICAgIHsgIlBvcnR1Z3Vlc2UsIEJyYXppbGlhbiIsICJwdF9CUiIgfSwKLSAgICB7ICJQdW5qYWJpIiwgICAgICAgICAgICAgICAicGEiIH0sCi0gICAgeyAiUHVzaHRvIiwgICAgICAgICAgICAgICAgInBzIiB9LAotICAgIHsgIlF1ZWNodWEiLCAgICAgICAgICAgICAgICJxdSIgfSwKLSAgICB7ICJSb21hbmlhbiIsICAgICAgICAgICAgICAicm8iIH0sCi0gICAgeyAiUnVhbmRhIiwgICAgICAgICAgICAgICAgInJ3IiB9LAotICAgIHsgIlJ1bmRpIiwgICAgICAgICAgICAgICAgICJybiIgfSwKLSAgICB7ICJSdXNzaWFuIiwgICAgICAgICAgICAgICAicnUiIH0sCi0gICAgeyAiU2FtaSIsICAgICAgICAgICAgICAgICAgInNlX05PIiB9LCAvKiBOb3QganVzdCAic2UiLiAgKi8KLSAgICB7ICJTYW5za3JpdCIsICAgICAgICAgICAgICAic2EiIH0sCi0gICAgeyAiU2NvdHRpc2giLCAgICAgICAgICAgICAgImdkIiB9LAotICAgIHsgIlNlcmJpYW4iLCAgICAgICAgICAgICAgICJzciIgfSwKLSAgICB7ICJTaW1wbGlmaWVkIENoaW5lc2UiLCAgICAiemhfQ04iIH0sCi0gICAgeyAiU2luZGhpIiwgICAgICAgICAgICAgICAgInNkIiB9LAotICAgIHsgIlNpbmhhbGVzZSIsICAgICAgICAgICAgICJzaSIgfSwKLSAgICB7ICJTbG92YWsiLCAgICAgICAgICAgICAgICAic2siIH0sCi0gICAgeyAiU2xvdmVuaWFuIiwgICAgICAgICAgICAgInNsIiB9LAotICAgIHsgIlNvbWFsaSIsICAgICAgICAgICAgICAgICJzbyIgfSwKLSAgICB7ICJTcGFuaXNoIiwgICAgICAgICAgICAgICAiZXMiIH0sCi0gICAgeyAiU3VuZGFuZXNlIiwgICAgICAgICAgICAgInN1IiB9LAotICAgIHsgIlN3YWhpbGkiLCAgICAgICAgICAgICAgICJzdyIgfSwKLSAgICB7ICJTd2VkaXNoIiwgICAgICAgICAgICAgICAic3YiIH0sCi0gICAgeyAiVGFnYWxvZyIsICAgICAgICAgICAgICAgInRsIiB9LAotICAgIHsgIlRhamlrIiwgICAgICAgICAgICAgICAgICJ0ZyIgfSwKLSAgICB7ICJUYWppa2kiLCAgICAgICAgICAgICAgICAidGciIH0sCi0gICAgeyAiVGFtaWwiLCAgICAgICAgICAgICAgICAgInRhIiB9LAotICAgIHsgIlRhdGFyIiwgICAgICAgICAgICAgICAgICJ0dCIgfSwKLSAgICB7ICJUZWx1Z3UiLCAgICAgICAgICAgICAgICAidGUiIH0sCi0gICAgeyAiVGhhaSIsICAgICAgICAgICAgICAgICAgInRoIiB9LAotICAgIHsgIlRpYmV0YW4iLCAgICAgICAgICAgICAgICJibyIgfSwKLSAgICB7ICJUaWdyaW55YSIsICAgICAgICAgICAgICAidGkiIH0sCi0gICAgeyAiVG9uZ2FuIiwgICAgICAgICAgICAgICAgInRvIiB9LAotICAgIHsgIlRyYWRpdGlvbmFsIENoaW5lc2UiLCAgICJ6aF9UVyIgfSwKLSAgICB7ICJUdXJraXNoIiwgICAgICAgICAgICAgICAidHIiIH0sCi0gICAgeyAiVHVya21lbiIsICAgICAgICAgICAgICAgInRrIiB9LAotICAgIHsgIlVpZ2h1ciIsICAgICAgICAgICAgICAgICJ1ZyIgfSwKLSAgICB7ICJVa3JhaW5pYW4iLCAgICAgICAgICAgICAidWsiIH0sCi0gICAgeyAiVXJkdSIsICAgICAgICAgICAgICAgICAgInVyIiB9LAotICAgIHsgIlV6YmVrIiwgICAgICAgICAgICAgICAgICJ1eiIgfSwKLSAgICB7ICJWaWV0bmFtZXNlIiwgICAgICAgICAgICAidmkiIH0sCi0gICAgeyAiV2Vsc2giLCAgICAgICAgICAgICAgICAgImN5IiB9LAotICAgIHsgIllpZGRpc2giLCAgICAgICAgICAgICAgICJ5aSIgfQotICB9OwotCi0gIC8qIENvbnZlcnQgbmV3LXN0eWxlIGxvY2FsZSBuYW1lcyB3aXRoIGxhbmd1YWdlIHRhZ3MgKElTTyA2MzkgYW5kIElTTyAxNTkyNCkKLSAgICAgdG8gVW5peCAoSVNPIDYzOSBhbmQgSVNPIDMxNjYpIG5hbWVzLiAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBjaGFyIGxhbmd0YWdbNysxXTsgY29uc3QgY2hhciB1bml4eVsxMisxXTsgfQotCSAgbGFuZ3RhZ19lbnRyeTsKLSAgc3RhdGljIGNvbnN0IGxhbmd0YWdfZW50cnkgbGFuZ3RhZ190YWJsZVtdID0gewotICAgIC8qIE1hY09TIFggaGFzICJhei1BcmFiIiwgImF6LUN5cmwiLCAiYXotTGF0biIuCi0gICAgICAgVGhlIGRlZmF1bHQgc2NyaXB0IGZvciBheiBvbiBVbml4IGlzIExhdGluLiAgKi8KLSAgICB7ICJhei1MYXRuIiwgImF6IiB9LAotICAgIC8qIE1hY09TIFggaGFzICJnYS1kb3RzIi4gIERvZXMgbm90IHlldCBleGlzdCBvbiBVbml4LiAgKi8KLSAgICB7ICJnYS1kb3RzIiwgImdhIiB9LAotICAgIC8qIE1hY09TIFggaGFzICJray1DeXJsIi4gIERvZXMgbm90IHlldCBleGlzdCBvbiBVbml4LiAgKi8KLSAgICAvKiBNYWNPUyBYIGhhcyAibW4tQ3lybCIsICJtbi1Nb25nIi4KLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIG1uIG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotICAgIHsgIm1uLUN5cmwiLCAibW4iIH0sCi0gICAgLyogTWFjT1MgWCBoYXMgIm1zLUFyYWIiLCAibXMtTGF0biIuCi0gICAgICAgVGhlIGRlZmF1bHQgc2NyaXB0IGZvciBtcyBvbiBVbml4IGlzIExhdGluLiAgKi8KLSAgICB7ICJtcy1MYXRuIiwgIm1zIiB9LAotICAgIC8qIE1hY09TIFggaGFzICJ0Zy1DeXJsIi4KLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIHRnIG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotICAgIHsgInRnLUN5cmwiLCAidGciIH0sCi0gICAgLyogTWFjT1MgWCBoYXMgInRrLUN5cmwiLiAgRG9lcyBub3QgeWV0IGV4aXN0IG9uIFVuaXguICAqLwotICAgIC8qIE1hY09TIFggaGFzICJ0dC1DeXJsIi4KLSAgICAgICBUaGUgZGVmYXVsdCBzY3JpcHQgZm9yIHR0IG9uIFVuaXggaXMgQ3lyaWxsaWMuICAqLwotICAgIHsgInR0LUN5cmwiLCAidHQiIH0sCi0gICAgLyogTWFjT1MgWCBoYXMgInpoLUhhbnMiLCAiemgtSGFudCIuCi0gICAgICAgQ291bnRyeSBjb2RlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBvbiBVbml4LiAgKi8KLSAgICB7ICJ6aC1IYW5zIiwgInpoX0NOIiB9LAotICAgIHsgInpoLUhhbnQiLCAiemhfVFciIH0KLSAgfTsKLQotICAvKiBDb252ZXJ0IHNjcmlwdCBuYW1lcyAoSVNPIDE1OTI0KSB0byBVbml4IGNvbnZlbnRpb25zLgotICAgICBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9pc28xNTkyNC9pc28xNTkyNC1jb2Rlcy5odG1sICAqLwotICB0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGNoYXIgc2NyaXB0WzQrMV07IGNvbnN0IGNoYXIgdW5peHlbOSsxXTsgfQotCSAgc2NyaXB0X2VudHJ5OwotICBzdGF0aWMgY29uc3Qgc2NyaXB0X2VudHJ5IHNjcmlwdF90YWJsZVtdID0gewotICAgIHsgIkFyYWIiLCAiYXJhYmljIiB9LAotICAgIHsgIkN5cmwiLCAiY3lyaWxsaWMiIH0sCi0gICAgeyAiTW9uZyIsICJtb25nb2xpYW4iIH0KLSAgfTsKLQotICAvKiBTdGVwIDE6IENvbnZlcnQgdXNpbmcgbGVnYWN5X3RhYmxlLiAgKi8KLSAgaWYgKG5hbWVbMF0gPj0gJ0EnICYmIG5hbWVbMF0gPD0gJ1onKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpMSwgaTI7Ci0gICAgICBpMSA9IDA7Ci0gICAgICBpMiA9IHNpemVvZiAobGVnYWN5X3RhYmxlKSAvIHNpemVvZiAobGVnYWN5X2VudHJ5KTsKLSAgICAgIHdoaWxlIChpMiAtIGkxID4gMSkKLQl7Ci0JICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBpZiBuYW1lIG9jY3VycyBpbiBsZWdhY3lfdGFibGUsCi0JICAgICBpdHMgaW5kZXggbXVzdCBiZSA+PSBpMSBhbmQgPCBpMi4gICovCi0JICB1bnNpZ25lZCBpbnQgaSA9IChpMSArIGkyKSA+PiAxOwotCSAgY29uc3QgbGVnYWN5X2VudHJ5ICpwID0gJmxlZ2FjeV90YWJsZVtpXTsKLQkgIGlmIChzdHJjbXAgKG5hbWUsIHAtPmxlZ2FjeSkgPCAwKQotCSAgICBpMiA9IGk7Ci0JICBlbHNlCi0JICAgIGkxID0gaTsKLQl9Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBsZWdhY3lfdGFibGVbaTFdLmxlZ2FjeSkgPT0gMCkKLQl7Ci0JICBzdHJjcHkgKG5hbWUsIGxlZ2FjeV90YWJsZVtpMV0udW5peHkpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogU3RlcCAyOiBDb252ZXJ0IHVzaW5nIGxhbmd0YWdfdGFibGUgYW5kIHNjcmlwdF90YWJsZS4gICovCi0gIGlmIChzdHJsZW4gKG5hbWUpID09IDcgJiYgbmFtZVsyXSA9PSAnLScpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGkxLCBpMjsKLSAgICAgIGkxID0gMDsKLSAgICAgIGkyID0gc2l6ZW9mIChsYW5ndGFnX3RhYmxlKSAvIHNpemVvZiAobGFuZ3RhZ19lbnRyeSk7Ci0gICAgICB3aGlsZSAoaTIgLSBpMSA+IDEpCi0JewotCSAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgaWYgbmFtZSBvY2N1cnMgaW4gbGFuZ3RhZ190YWJsZSwKLQkgICAgIGl0cyBpbmRleCBtdXN0IGJlID49IGkxIGFuZCA8IGkyLiAgKi8KLQkgIHVuc2lnbmVkIGludCBpID0gKGkxICsgaTIpID4+IDE7Ci0JICBjb25zdCBsYW5ndGFnX2VudHJ5ICpwID0gJmxhbmd0YWdfdGFibGVbaV07Ci0JICBpZiAoc3RyY21wIChuYW1lLCBwLT5sYW5ndGFnKSA8IDApCi0JICAgIGkyID0gaTsKLQkgIGVsc2UKLQkgICAgaTEgPSBpOwotCX0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGxhbmd0YWdfdGFibGVbaTFdLmxhbmd0YWcpID09IDApCi0JewotCSAgc3RyY3B5IChuYW1lLCBsYW5ndGFnX3RhYmxlW2kxXS51bml4eSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpMSA9IDA7Ci0gICAgICBpMiA9IHNpemVvZiAoc2NyaXB0X3RhYmxlKSAvIHNpemVvZiAoc2NyaXB0X2VudHJ5KTsKLSAgICAgIHdoaWxlIChpMiAtIGkxID4gMSkKLQl7Ci0JICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBpZiAobmFtZSArIDMpIG9jY3VycyBpbiBzY3JpcHRfdGFibGUsCi0JICAgICBpdHMgaW5kZXggbXVzdCBiZSA+PSBpMSBhbmQgPCBpMi4gICovCi0JICB1bnNpZ25lZCBpbnQgaSA9IChpMSArIGkyKSA+PiAxOwotCSAgY29uc3Qgc2NyaXB0X2VudHJ5ICpwID0gJnNjcmlwdF90YWJsZVtpXTsKLQkgIGlmIChzdHJjbXAgKG5hbWUgKyAzLCBwLT5zY3JpcHQpIDwgMCkKLQkgICAgaTIgPSBpOwotCSAgZWxzZQotCSAgICBpMSA9IGk7Ci0JfQotICAgICAgaWYgKHN0cmNtcCAobmFtZSArIDMsIHNjcmlwdF90YWJsZVtpMV0uc2NyaXB0KSA9PSAwKQotCXsKLQkgIG5hbWVbMl0gPSAnQCc7Ci0JICBzdHJjcHkgKG5hbWUgKyAzLCBzY3JpcHRfdGFibGVbaTFdLnVuaXh5KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIFN0ZXAgMzogQ29udmVydCBuZXctc3R5bGUgZGFzaCB0byBVbml4IHVuZGVyc2NvcmUuICovCi0gIHsKLSAgICBjaGFyICpwOwotICAgIGZvciAocCA9IG5hbWU7ICpwICE9ICdcMCc7IHArKykKLSAgICAgIGlmICgqcCA9PSAnLScpCi0JKnAgPSAnXyc7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mICdzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICAiRGlyZWN0cyAnc2V0bG9jYWxlKCknIHRvIHF1ZXJ5ICdjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgIHNldHRpbmcgb2YgJ2xvY2FsJy4iCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIE5laXRoZXIgZG8gU1VTVjIgYW5kCi0gICBJU08gQyA5OS4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQgc3lzdGVtcyAoZS5nLgotICAgdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyKQotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBuYW1lLCBhbmQgY2Fub25pY2FsaXplIGl0IGludG8gWFBHIHN5bnRheAotICAgICBsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXQotICAgVGhlIGNvZGVzZXQgcGFydCBpbiB0aGUgcmVzdWx0IGlzIG5vdCByZWxpYWJsZTsgdGhlIGxvY2FsZV9jaGFyc2V0KCkKLSAgIHNob3VsZCBiZSB1c2VkIGZvciBjb2Rlc2V0IGluZm9ybWF0aW9uIGluc3RlYWQuCi0gICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gICovCi0KLWNvbnN0IGNoYXIgKgotZ2xfbG9jYWxlX25hbWVfcG9zaXggKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQotewotICAvKiBVc2UgdGhlIFBPU0lYIG1ldGhvZHMgb2YgbG9va2luZyB0byAnTENfQUxMJywgJ0xDX3h4eCcsIGFuZCAnTEFORycuCi0gICAgIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSAnc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICByZXR1cm4gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7Ci0jZWxzZQotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcnJpZGVzIGFsbCBvdGhlci4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0gIC8qIExhc3QgcG9zc2liaWxpdHkgaXMgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HIik7Ci0gIGlmIChyZXR2YWwgIT0gTlVMTCAmJiByZXR2YWxbMF0gIT0gJ1wwJykKLSAgICByZXR1cm4gcmV0dmFsOwotCi0gIHJldHVybiBOVUxMOwotI2VuZGlmCi19Ci0KLWNvbnN0IGNoYXIgKgotZ2xfbG9jYWxlX25hbWVfZGVmYXVsdCAodm9pZCkKLXsKLSAgLyogUE9TSVg6MjAwMSBzYXlzOgotICAgICAiQWxsIGltcGxlbWVudGF0aW9ucyBzaGFsbCBkZWZpbmUgYSBsb2NhbGUgYXMgdGhlIGRlZmF1bHQgbG9jYWxlLCB0byBiZQotICAgICAgaW52b2tlZCB3aGVuIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0LCBvciBzZXQgdG8gdGhlIGVtcHR5Ci0gICAgICBzdHJpbmcuICBUaGlzIGRlZmF1bHQgbG9jYWxlIGNhbiBiZSB0aGUgUE9TSVggbG9jYWxlIG9yIGFueSBvdGhlcgotICAgICAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBsb2NhbGUuICBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZQotICAgICAgZmFjaWxpdGllcyBmb3IgbG9jYWwgaW5zdGFsbGF0aW9uIGFkbWluaXN0cmF0b3JzIHRvIHNldCB0aGUgZGVmYXVsdAotICAgICAgbG9jYWxlLCBjdXN0b21pemluZyBpdCBmb3IgZWFjaCBsb2NhdGlvbi4gIFBPU0lYOjIwMDEgZG9lcyBub3QgcmVxdWlyZQotICAgICAgc3VjaCBhIGZhY2lsaXR5LiAgKi8KLQotI2lmICEoSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UIHx8IEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSB8fCBkZWZpbmVkKFdJTjMyX05BVElWRSkpCi0KLSAgLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgd2F5IG9mIHNldHRpbmcgdGhlIGxvY2FsZSwgb3RoZXIgdGhhbiB0aGUKLSAgICAgUE9TSVggc3BlY2lmaWVkIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIFdlIHVzZSBDIGFzIGRlZmF1bHQgbG9jYWxlLiAgKi8KLSAgcmV0dXJuICJDIjsKLQotI2Vsc2UKLQotICAvKiBSZXR1cm4gYW4gWFBHIHN0eWxlIGxvY2FsZSBuYW1lIGxhbmd1YWdlW190ZXJyaXRvcnldW0Btb2RpZmllcl0uCi0gICAgIERvbid0IGV2ZW4gYm90aGVyIGRldGVybWluaW5nIHRoZSBjb2Rlc2V0OyBpdCdzIG5vdCB1c2VmdWwgaW4gdGhpcwotICAgICBjb250ZXh0LCBiZWNhdXNlIG1lc3NhZ2UgY2F0YWxvZ3MgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHNpbmdsZQotICAgICBjb2Rlc2V0LiAgKi8KLQotIyBpZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgfHwgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFCi0gIC8qIE1hY09TIFggMTAuMiBvciBuZXdlciAqLwotICB7Ci0gICAgLyogQ2FjaGUgdGhlIGxvY2FsZSBuYW1lLCBzaW5jZSBDb3JlRm91bmRhdGlvbiBjYWxscyBhcmUgZXhwZW5zaXZlLiAgKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY2FjaGVkX2xvY2FsZW5hbWU7Ci0KLSAgICBpZiAoY2FjaGVkX2xvY2FsZW5hbWUgPT0gTlVMTCkKLSAgICAgIHsKLQljaGFyIG5hbWVidWZbMjU2XTsKLSMgIGlmIEhBVkVfQ0ZMT0NBTEVDT1BZQ1VSUkVOVCAvKiBNYWNPUyBYIDEwLjMgb3IgbmV3ZXIgKi8KLQlDRkxvY2FsZVJlZiBsb2NhbGUgPSBDRkxvY2FsZUNvcHlDdXJyZW50ICgpOwotCUNGU3RyaW5nUmVmIG5hbWUgPSBDRkxvY2FsZUdldElkZW50aWZpZXIgKGxvY2FsZSk7Ci0KLQlpZiAoQ0ZTdHJpbmdHZXRDU3RyaW5nIChuYW1lLCBuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksCi0JCQkJa0NGU3RyaW5nRW5jb2RpbmdBU0NJSSkpCi0JICB7Ci0JICAgIGdsX2xvY2FsZV9uYW1lX2Nhbm9uaWNhbGl6ZSAobmFtZWJ1Zik7Ci0JICAgIGNhY2hlZF9sb2NhbGVuYW1lID0gc3RyZHVwIChuYW1lYnVmKTsKLQkgIH0KLQlDRlJlbGVhc2UgKGxvY2FsZSk7Ci0jICBlbGlmIEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSAvKiBNYWNPUyBYIDEwLjIgb3IgbmV3ZXIgKi8KLQlDRlR5cGVSZWYgdmFsdWUgPQotCSAgQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSAoQ0ZTVFIgKCJBcHBsZUxvY2FsZSIpLAotCQkJCSAgICAga0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotCWlmICh2YWx1ZSAhPSBOVUxMCi0JICAgICYmIENGR2V0VHlwZUlEICh2YWx1ZSkgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQgKCkKLQkgICAgJiYgQ0ZTdHJpbmdHZXRDU3RyaW5nICgoQ0ZTdHJpbmdSZWYpdmFsdWUsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwKLQkJCQkgICBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSkKLQkgIHsKLQkgICAgZ2xfbG9jYWxlX25hbWVfY2Fub25pY2FsaXplIChuYW1lYnVmKTsKLQkgICAgY2FjaGVkX2xvY2FsZW5hbWUgPSBzdHJkdXAgKG5hbWVidWYpOwotCSAgfQotIyAgZW5kaWYKLQlpZiAoY2FjaGVkX2xvY2FsZW5hbWUgPT0gTlVMTCkKLQkgIGNhY2hlZF9sb2NhbGVuYW1lID0gIkMiOwotICAgICAgfQotICAgIHJldHVybiBjYWNoZWRfbG9jYWxlbmFtZTsKLSAgfQotCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChXSU4zMl9OQVRJVkUpIC8qIFdJTjMyLCBub3QgQ3lnd2luICovCi0gIHsKLSAgICBMQ0lEIGxjaWQ7Ci0gICAgTEFOR0lEIGxhbmdpZDsKLSAgICBpbnQgcHJpbWFyeSwgc3ViOwotCi0gICAgLyogVXNlIG5hdGl2ZSBXaW4zMiBBUEkgbG9jYWxlIElELiAgKi8KLSAgICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOwotCi0gICAgLyogU3RyaXAgb2ZmIHRoZSBzb3J0aW5nIHJ1bGVzLCBrZWVwIG9ubHkgdGhlIGxhbmd1YWdlIHBhcnQuICAqLwotICAgIGxhbmdpZCA9IExBTkdJREZST01MQ0lEIChsY2lkKTsKLQotICAgIC8qIFNwbGl0IGludG8gbGFuZ3VhZ2UgYW5kIHRlcnJpdG9yeSBwYXJ0LiAgKi8KLSAgICBwcmltYXJ5ID0gUFJJTUFSWUxBTkdJRCAobGFuZ2lkKTsKLSAgICBzdWIgPSBTVUJMQU5HSUQgKGxhbmdpZCk7Ci0KLSAgICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KLSAgICAgICBTZWUgYWxzbyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvb25saW5lZGF0L2xhbmd1YWdlcy5odG1sIC4KLSAgICAgICBGb3IgZGV0YWlscyBhYm91dCBsYW5ndWFnZXMsIHNlZSBodHRwOi8vd3d3LmV0aG5vbG9ndWUuY29tLyAuICAqLwotICAgIHN3aXRjaCAocHJpbWFyeSkKLSAgICAgIHsKLSAgICAgIGNhc2UgTEFOR19BRlJJS0FBTlM6IHJldHVybiAiYWZfWkEiOwotICAgICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKLSAgICAgIGNhc2UgTEFOR19BTUhBUklDOiByZXR1cm4gImFtX0VUIjsKLSAgICAgIGNhc2UgTEFOR19BUkFCSUM6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQTogcmV0dXJuICJhcl9TQSI7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0lSQVE6IHJldHVybiAiYXJfSVEiOwotCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19FR1lQVDogcmV0dXJuICJhcl9FRyI7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX0xJQllBOiByZXR1cm4gImFyX0xZIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfQUxHRVJJQTogcmV0dXJuICJhcl9EWiI7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX01PUk9DQ086IHJldHVybiAiYXJfTUEiOwotCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBOiByZXR1cm4gImFyX1ROIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfT01BTjogcmV0dXJuICJhcl9PTSI7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1lFTUVOOiByZXR1cm4gImFyX1lFIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfU1lSSUE6IHJldHVybiAiYXJfU1kiOwotCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU46IHJldHVybiAiYXJfSk8iOwotCSAgY2FzZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OOiByZXR1cm4gImFyX0xCIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfS1VXQUlUOiByZXR1cm4gImFyX0tXIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfVUFFOiByZXR1cm4gImFyX0FFIjsKLQkgIGNhc2UgU1VCTEFOR19BUkFCSUNfQkFIUkFJTjogcmV0dXJuICJhcl9CSCI7Ci0JICBjYXNlIFNVQkxBTkdfQVJBQklDX1FBVEFSOiByZXR1cm4gImFyX1FBIjsKLQkgIH0KLQlyZXR1cm4gImFyIjsKLSAgICAgIGNhc2UgTEFOR19BUk1FTklBTjogcmV0dXJuICJoeV9BTSI7Ci0gICAgICBjYXNlIExBTkdfQVNTQU1FU0U6IHJldHVybiAiYXNfSU4iOwotICAgICAgY2FzZSBMQU5HX0FaRVJJOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gQXplcmJhaWphbmkgbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0JICBjYXNlIFNVQkxBTkdfQVpFUklfTEFUSU46IHJldHVybiAiYXpfQVpAbGF0aW4iOwotCSAgY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKLQkgIH0KLQlyZXR1cm4gImF6IjsKLSAgICAgIGNhc2UgTEFOR19CQVNRVUU6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJldV9FUyI7Ci0JICB9Ci0JcmV0dXJuICJldSI7IC8qIEFtYmlndW91czogY291bGQgYmUgImV1X0VTIiBvciAiZXVfRlIiLiAgKi8KLSAgICAgIGNhc2UgTEFOR19CRUxBUlVTSUFOOiByZXR1cm4gImJlX0JZIjsKLSAgICAgIGNhc2UgTEFOR19CRU5HQUxJOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX0JFTkdBTElfSU5ESUE6IHJldHVybiAiYm5fSU4iOwotCSAgY2FzZSBTVUJMQU5HX0JFTkdBTElfQkFOR0xBREVTSDogcmV0dXJuICJibl9CRCI7Ci0JICB9Ci0JcmV0dXJuICJibiI7Ci0gICAgICBjYXNlIExBTkdfQlVMR0FSSUFOOiByZXR1cm4gImJnX0JHIjsKLSAgICAgIGNhc2UgTEFOR19CVVJNRVNFOiByZXR1cm4gIm15X01NIjsKLSAgICAgIGNhc2UgTEFOR19DQU1CT0RJQU46IHJldHVybiAia21fS0giOwotICAgICAgY2FzZSBMQU5HX0NBVEFMQU46IHJldHVybiAiY2FfRVMiOwotICAgICAgY2FzZSBMQU5HX0NIRVJPS0VFOiByZXR1cm4gImNocl9VUyI7Ci0gICAgICBjYXNlIExBTkdfQ0hJTkVTRToKLQlzd2l0Y2ggKHN1YikKLQkgIHsKLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX1RSQURJVElPTkFMOiByZXR1cm4gInpoX1RXIjsKLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQ6IHJldHVybiAiemhfQ04iOwotCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfSE9OR0tPTkc6IHJldHVybiAiemhfSEsiOwotCSAgY2FzZSBTVUJMQU5HX0NISU5FU0VfU0lOR0FQT1JFOiByZXR1cm4gInpoX1NHIjsKLQkgIGNhc2UgU1VCTEFOR19DSElORVNFX01BQ0FVOiByZXR1cm4gInpoX01PIjsKLQkgIH0KLQlyZXR1cm4gInpoIjsKLSAgICAgIGNhc2UgTEFOR19DUk9BVElBTjogICAgICAgLyogTEFOR19DUk9BVElBTiA9PSBMQU5HX1NFUkJJQU4KLQkJCQkgKiBXaGF0IHVzZWQgdG8gYmUgY2FsbGVkIFNlcmJvLUNyb2F0aWFuCi0JCQkJICogc2hvdWxkIHJlYWxseSBub3cgYmUgdHdvIHNlcGFyYXRlCi0JCQkJICogbGFuZ3VhZ2VzIGJlY2F1c2Ugb2YgcG9saXRpY2FsIHJlYXNvbnMuCi0JCQkJICogKFNheXMgdG1sLCB3aG8ga25vd3Mgbm90aGluZyBhYm91dCBTZXJiaWFuCi0JCQkJICogb3IgQ3JvYXRpYW4uKQotCQkJCSAqIChJIGNhbiBmZWVsIHRob3NlIGZsYW1lcyBjb21pbmcgYWxyZWFkeS4pCi0JCQkJICovCi0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJocl9IUiI7Ci0JICBjYXNlIFNVQkxBTkdfU0VSQklBTl9MQVRJTjogcmV0dXJuICJzcl9DUyI7Ci0JICBjYXNlIFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQzogcmV0dXJuICJzcl9DU0BjeXJpbGxpYyI7Ci0JICB9Ci0JcmV0dXJuICJociI7Ci0gICAgICBjYXNlIExBTkdfQ1pFQ0g6IHJldHVybiAiY3NfQ1oiOwotICAgICAgY2FzZSBMQU5HX0RBTklTSDogcmV0dXJuICJkYV9ESyI7Ci0gICAgICBjYXNlIExBTkdfRElWRUhJOiByZXR1cm4gImR2X01WIjsKLSAgICAgIGNhc2UgTEFOR19EVVRDSDoKLQlzd2l0Y2ggKHN1YikKLQkgIHsKLQkgIGNhc2UgU1VCTEFOR19EVVRDSDogcmV0dXJuICJubF9OTCI7Ci0JICBjYXNlIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTjogLyogRkxFTUlTSCwgVkxBQU1TICovIHJldHVybiAibmxfQkUiOwotCSAgfQotCXJldHVybiAibmwiOwotICAgICAgY2FzZSBMQU5HX0VETzogcmV0dXJuICJiaW5fTkciOwotICAgICAgY2FzZSBMQU5HX0VOR0xJU0g6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICAvKiBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiBIZWguIEkgdGhvdWdodAotCSAgICogRW5nbGlzaCB3YXMgdGhlIGxhbmd1YWdlIHNwb2tlbiBpbiBFbmdsYW5kLgotCSAgICogT2ggd2VsbC4KLQkgICAqLwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVVM6IHJldHVybiAiZW5fVVMiOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVUs6IHJldHVybiAiZW5fR0IiOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfQVVTOiByZXR1cm4gImVuX0FVIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0NBTjogcmV0dXJuICJlbl9DQSI7Ci0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9OWjogcmV0dXJuICJlbl9OWiI7Ci0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9FSVJFOiByZXR1cm4gImVuX0lFIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQTogcmV0dXJuICJlbl9aQSI7Ci0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBOiByZXR1cm4gImVuX0pNIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0NBUklCQkVBTjogcmV0dXJuICJlbl9HRCI7IC8qIEdyZW5hZGE/ICovCi0JICBjYXNlIFNVQkxBTkdfRU5HTElTSF9CRUxJWkU6IHJldHVybiAiZW5fQloiOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQ6IHJldHVybiAiZW5fVFQiOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0U6IHJldHVybiAiZW5fWlciOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVM6IHJldHVybiAiZW5fUEgiOwotCSAgY2FzZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBOiByZXR1cm4gImVuX0lEIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HOiByZXR1cm4gImVuX0hLIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX0lORElBOiByZXR1cm4gImVuX0lOIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBOiByZXR1cm4gImVuX01ZIjsKLQkgIGNhc2UgU1VCTEFOR19FTkdMSVNIX1NJTkdBUE9SRTogcmV0dXJuICJlbl9TRyI7Ci0JICB9Ci0JcmV0dXJuICJlbiI7Ci0gICAgICBjYXNlIExBTkdfRVNUT05JQU46IHJldHVybiAiZXRfRUUiOwotICAgICAgY2FzZSBMQU5HX0ZBRVJPRVNFOiByZXR1cm4gImZvX0ZPIjsKLSAgICAgIGNhc2UgTEFOR19GQVJTSTogcmV0dXJuICJmYV9JUiI7Ci0gICAgICBjYXNlIExBTkdfRklOTklTSDogcmV0dXJuICJmaV9GSSI7Ci0gICAgICBjYXNlIExBTkdfRlJFTkNIOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSDogcmV0dXJuICJmcl9GUiI7Ci0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU46IC8qIFdBTExPT04gKi8gcmV0dXJuICJmcl9CRSI7Ci0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOOiByZXR1cm4gImZyX0NBIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfU1dJU1M6IHJldHVybiAiZnJfQ0giOwotCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHOiByZXR1cm4gImZyX0xVIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfTU9OQUNPOiByZXR1cm4gImZyX01DIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfV0VTVElORElFUzogcmV0dXJuICJmciI7IC8qIENhcmliYmVhbj8gKi8KLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfUkVVTklPTjogcmV0dXJuICJmcl9SRSI7Ci0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0NPTkdPOiByZXR1cm4gImZyX0NHIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfU0VORUdBTDogcmV0dXJuICJmcl9TTiI7Ci0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OOiByZXR1cm4gImZyX0NNIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfQ09URURJVk9JUkU6IHJldHVybiAiZnJfQ0kiOwotCSAgY2FzZSBTVUJMQU5HX0ZSRU5DSF9NQUxJOiByZXR1cm4gImZyX01MIjsKLQkgIGNhc2UgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTzogcmV0dXJuICJmcl9NQSI7Ci0JICBjYXNlIFNVQkxBTkdfRlJFTkNIX0hBSVRJOiByZXR1cm4gImZyX0hUIjsKLQkgIH0KLQlyZXR1cm4gImZyIjsKLSAgICAgIGNhc2UgTEFOR19GUklTSUFOOiByZXR1cm4gImZ5X05MIjsKLSAgICAgIGNhc2UgTEFOR19GVUxGVUxERToKLQkvKiBTcG9rZW4gaW4gTmlnZXJpYSwgR3VpbmVhLCBTZW5lZ2FsLCBNYWxpLCBOaWdlciwgQ2FtZXJvb24sIEJlbmluLiAgKi8KLQlyZXR1cm4gImZmX05HIjsKLSAgICAgIGNhc2UgTEFOR19HQUVMSUM6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIDB4MDE6IC8qIFNDT1RUSVNIICovIHJldHVybiAiZ2RfR0IiOwotCSAgY2FzZSAweDAyOiAvKiBJUklTSCAqLyByZXR1cm4gImdhX0lFIjsKLQkgIH0KLQlyZXR1cm4gIkMiOwotICAgICAgY2FzZSBMQU5HX0dBTElDSUFOOiByZXR1cm4gImdsX0VTIjsKLSAgICAgIGNhc2UgTEFOR19HRU9SR0lBTjogcmV0dXJuICJrYV9HRSI7Ci0gICAgICBjYXNlIExBTkdfR0VSTUFOOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX0dFUk1BTjogcmV0dXJuICJkZV9ERSI7Ci0JICBjYXNlIFNVQkxBTkdfR0VSTUFOX1NXSVNTOiByZXR1cm4gImRlX0NIIjsKLQkgIGNhc2UgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU46IHJldHVybiAiZGVfQVQiOwotCSAgY2FzZSBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHOiByZXR1cm4gImRlX0xVIjsKLQkgIGNhc2UgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTjogcmV0dXJuICJkZV9MSSI7Ci0JICB9Ci0JcmV0dXJuICJkZSI7Ci0gICAgICBjYXNlIExBTkdfR1JFRUs6IHJldHVybiAiZWxfR1IiOwotICAgICAgY2FzZSBMQU5HX0dVQVJBTkk6IHJldHVybiAiZ25fUFkiOwotICAgICAgY2FzZSBMQU5HX0dVSkFSQVRJOiByZXR1cm4gImd1X0lOIjsKLSAgICAgIGNhc2UgTEFOR19IQVVTQTogcmV0dXJuICJoYV9ORyI7Ci0gICAgICBjYXNlIExBTkdfSEFXQUlJQU46Ci0JLyogRklYTUU6IERvIHRoZXkgbWVhbiBIYXdhaWlhbiAoImhhd19VUyIsIDEwMDAgc3BlYWtlcnMpCi0JICAgb3IgSGF3YWlpIENyZW9sZSBFbmdsaXNoICgiY3BlX1VTIiwgNjAwMDAwIHNwZWFrZXJzKT8gICovCi0JcmV0dXJuICJjcGVfVVMiOwotICAgICAgY2FzZSBMQU5HX0hFQlJFVzogcmV0dXJuICJoZV9JTCI7Ci0gICAgICBjYXNlIExBTkdfSElOREk6IHJldHVybiAiaGlfSU4iOwotICAgICAgY2FzZSBMQU5HX0hVTkdBUklBTjogcmV0dXJuICJodV9IVSI7Ci0gICAgICBjYXNlIExBTkdfSUJJQklPOiByZXR1cm4gIm5pY19ORyI7Ci0gICAgICBjYXNlIExBTkdfSUNFTEFORElDOiByZXR1cm4gImlzX0lTIjsKLSAgICAgIGNhc2UgTEFOR19JR0JPOiByZXR1cm4gImlnX05HIjsKLSAgICAgIGNhc2UgTEFOR19JTkRPTkVTSUFOOiByZXR1cm4gImlkX0lEIjsKLSAgICAgIGNhc2UgTEFOR19JTlVLVElUVVQ6IHJldHVybiAiaXVfQ0EiOwotICAgICAgY2FzZSBMQU5HX0lUQUxJQU46Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfSVRBTElBTjogcmV0dXJuICJpdF9JVCI7Ci0JICBjYXNlIFNVQkxBTkdfSVRBTElBTl9TV0lTUzogcmV0dXJuICJpdF9DSCI7Ci0JICB9Ci0JcmV0dXJuICJpdCI7Ci0gICAgICBjYXNlIExBTkdfSkFQQU5FU0U6IHJldHVybiAiamFfSlAiOwotICAgICAgY2FzZSBMQU5HX0tBTk5BREE6IHJldHVybiAia25fSU4iOwotICAgICAgY2FzZSBMQU5HX0tBTlVSSTogcmV0dXJuICJrcl9ORyI7Ci0gICAgICBjYXNlIExBTkdfS0FTSE1JUkk6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJrc19QSyI7Ci0JICBjYXNlIFNVQkxBTkdfS0FTSE1JUklfSU5ESUE6IHJldHVybiAia3NfSU4iOwotCSAgfQotCXJldHVybiAia3MiOwotICAgICAgY2FzZSBMQU5HX0tBWkFLOiByZXR1cm4gImtrX0taIjsKLSAgICAgIGNhc2UgTEFOR19LT05LQU5JOgotCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCi0JcmV0dXJuICJrb2tfSU4iOwotICAgICAgY2FzZSBMQU5HX0tPUkVBTjogcmV0dXJuICJrb19LUiI7Ci0gICAgICBjYXNlIExBTkdfS1lSR1laOiByZXR1cm4gImt5X0tHIjsKLSAgICAgIGNhc2UgTEFOR19MQU86IHJldHVybiAibG9fTEEiOwotICAgICAgY2FzZSBMQU5HX0xBVElOOiByZXR1cm4gImxhX1ZBIjsKLSAgICAgIGNhc2UgTEFOR19MQVRWSUFOOiByZXR1cm4gImx2X0xWIjsKLSAgICAgIGNhc2UgTEFOR19MSVRIVUFOSUFOOiByZXR1cm4gImx0X0xUIjsKLSAgICAgIGNhc2UgTEFOR19NQUNFRE9OSUFOOiByZXR1cm4gIm1rX01LIjsKLSAgICAgIGNhc2UgTEFOR19NQUxBWToKLQlzd2l0Y2ggKHN1YikKLQkgIHsKLQkgIGNhc2UgU1VCTEFOR19NQUxBWV9NQUxBWVNJQTogcmV0dXJuICJtc19NWSI7Ci0JICBjYXNlIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU06IHJldHVybiAibXNfQk4iOwotCSAgfQotCXJldHVybiAibXMiOwotICAgICAgY2FzZSBMQU5HX01BTEFZQUxBTTogcmV0dXJuICJtbF9JTiI7Ci0gICAgICBjYXNlIExBTkdfTUFMVEVTRTogcmV0dXJuICJtdF9NVCI7Ci0gICAgICBjYXNlIExBTkdfTUFOSVBVUkk6Ci0JLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gc3VjaCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KLQlyZXR1cm4gIm1uaV9JTiI7Ci0gICAgICBjYXNlIExBTkdfTUFSQVRISTogcmV0dXJuICJtcl9JTiI7Ci0gICAgICBjYXNlIExBTkdfTU9OR09MSUFOOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAibW5fTU4iOwotCSAgfQotCXJldHVybiAibW4iOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJtbl9DTiIgb3IgIm1uX01OIi4gICovCi0gICAgICBjYXNlIExBTkdfTkVQQUxJOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAibmVfTlAiOwotCSAgY2FzZSBTVUJMQU5HX05FUEFMSV9JTkRJQTogcmV0dXJuICJuZV9JTiI7Ci0JICB9Ci0JcmV0dXJuICJuZSI7Ci0gICAgICBjYXNlIExBTkdfTk9SV0VHSUFOOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX05PUldFR0lBTl9CT0tNQUw6IHJldHVybiAibmJfTk8iOwotCSAgY2FzZSBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLOiByZXR1cm4gIm5uX05PIjsKLQkgIH0KLQlyZXR1cm4gIm5vIjsKLSAgICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7Ci0gICAgICBjYXNlIExBTkdfT1JPTU86IHJldHVybiAib21fRVQiOwotICAgICAgY2FzZSBMQU5HX1BBUElBTUVOVFU6IHJldHVybiAicGFwX0FOIjsKLSAgICAgIGNhc2UgTEFOR19QQVNIVE86Ci0JcmV0dXJuICJwcyI7IC8qIEFtYmlndW91czogY291bGQgYmUgInBzX1BLIiBvciAicHNfQUYiLiAgKi8KLSAgICAgIGNhc2UgTEFOR19QT0xJU0g6IHJldHVybiAicGxfUEwiOwotICAgICAgY2FzZSBMQU5HX1BPUlRVR1VFU0U6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfUE9SVFVHVUVTRTogcmV0dXJuICJwdF9QVCI7Ci0JICAvKiBIbW0uIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gPT0gU1VCTEFOR19ERUZBVUxULgotCSAgICAgU2FtZSBwaGVub21lbm9uIGFzIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuICovCi0JICBjYXNlIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU46IHJldHVybiAicHRfQlIiOwotCSAgfQotCXJldHVybiAicHQiOwotICAgICAgY2FzZSBMQU5HX1BVTkpBQkk6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfUFVOSkFCSV9JTkRJQTogcmV0dXJuICJwYV9JTiI7IC8qIEd1cm11a2hpIHNjcmlwdCAqLwotCSAgY2FzZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU46IHJldHVybiAicGFfUEsiOyAvKiBBcmFiaWMgc2NyaXB0ICovCi0JICB9Ci0JcmV0dXJuICJwYSI7Ci0gICAgICBjYXNlIExBTkdfUkhBRVRPX1JPTUFOQ0U6IHJldHVybiAicm1fQ0giOwotICAgICAgY2FzZSBMQU5HX1JPTUFOSUFOOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUE6IHJldHVybiAicm9fUk8iOwotCSAgY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOwotCSAgfQotCXJldHVybiAicm8iOwotICAgICAgY2FzZSBMQU5HX1JVU1NJQU46Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJydV9SVSI7Ci0JICB9Ci0JcmV0dXJuICJydSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInJ1X1JVIiBvciAicnVfVUEiIG9yICJydV9NRCIuICAqLwotICAgICAgY2FzZSBMQU5HX1NBQU1JOiAvKiBhY3R1YWxseSBOb3J0aGVybiBTYW1pICovIHJldHVybiAic2VfTk8iOwotICAgICAgY2FzZSBMQU5HX1NBTlNLUklUOiByZXR1cm4gInNhX0lOIjsKLSAgICAgIGNhc2UgTEFOR19TSU5ESEk6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOOiByZXR1cm4gInNkX1BLIjsKLQkgIGNhc2UgU1VCTEFOR19TSU5ESElfQUZHSEFOSVNUQU46IHJldHVybiAic2RfQUYiOwotCSAgfQotCXJldHVybiAic2QiOwotICAgICAgY2FzZSBMQU5HX1NJTkhBTEVTRTogcmV0dXJuICJzaV9MSyI7Ci0gICAgICBjYXNlIExBTkdfU0xPVkFLOiByZXR1cm4gInNrX1NLIjsKLSAgICAgIGNhc2UgTEFOR19TTE9WRU5JQU46IHJldHVybiAic2xfU0kiOwotICAgICAgY2FzZSBMQU5HX1NPTUFMSTogcmV0dXJuICJzb19TTyI7Ci0gICAgICBjYXNlIExBTkdfU09SQklBTjoKLQkvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotCXJldHVybiAid2VuX0RFIjsKLSAgICAgIGNhc2UgTEFOR19TUEFOSVNIOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0g6IHJldHVybiAiZXNfRVMiOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTjogcmV0dXJuICJlc19NWCI7Ci0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9NT0RFUk46Ci0JICAgIHJldHVybiAiZXNfRVNAbW9kZXJuIjsJLyogbm90IHNlZW4gb24gVW5peCAqLwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBOiByZXR1cm4gImVzX0dUIjsKLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0E6IHJldHVybiAiZXNfQ1IiOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BOiByZXR1cm4gImVzX1BBIjsKLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTl9SRVBVQkxJQzogcmV0dXJuICJlc19ETyI7Ci0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEE6IHJldHVybiAiZXNfVkUiOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUE6IHJldHVybiAiZXNfQ08iOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfUEVSVTogcmV0dXJuICJlc19QRSI7Ci0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkE6IHJldHVybiAiZXNfQVIiOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUjogcmV0dXJuICJlc19FQyI7Ci0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9DSElMRTogcmV0dXJuICJlc19DTCI7Ci0JICBjYXNlIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZOiByZXR1cm4gImVzX1VZIjsKLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZOiByZXR1cm4gImVzX1BZIjsKLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX0JPTElWSUE6IHJldHVybiAiZXNfQk8iOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1I6IHJldHVybiAiZXNfU1YiOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVM6IHJldHVybiAiZXNfSE4iOwotCSAgY2FzZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBOiByZXR1cm4gImVzX05JIjsKLQkgIGNhc2UgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPOiByZXR1cm4gImVzX1BSIjsKLQkgIH0KLQlyZXR1cm4gImVzIjsKLSAgICAgIGNhc2UgTEFOR19TVVRVOiByZXR1cm4gImJudF9UWiI7IC8qIG9yICJzdF9MUyIgb3IgIm5zb19aQSI/ICovCi0gICAgICBjYXNlIExBTkdfU1dBSElMSTogcmV0dXJuICJzd19LRSI7Ci0gICAgICBjYXNlIExBTkdfU1dFRElTSDoKLQlzd2l0Y2ggKHN1YikKLQkgIHsKLQkgIGNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gInN2X1NFIjsKLQkgIGNhc2UgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQ6IHJldHVybiAic3ZfRkkiOwotCSAgfQotCXJldHVybiAic3YiOwotICAgICAgY2FzZSBMQU5HX1NZUklBQzogcmV0dXJuICJzeXJfVFIiOyAvKiBBbiBleHRpbmN0IGxhbmd1YWdlLiAgKi8KLSAgICAgIGNhc2UgTEFOR19UQUdBTE9HOiByZXR1cm4gInRsX1BIIjsKLSAgICAgIGNhc2UgTEFOR19UQUpJSzogcmV0dXJuICJ0Z19USiI7Ci0gICAgICBjYXNlIExBTkdfVEFNQVpJR0hUOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgLyogRklYTUU6IEFkanVzdCB0aGlzIHdoZW4gVGFtYXppZ2h0IGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLwotCSAgY2FzZSBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUM6IHJldHVybiAiYmVyX01BQGFyYWJpYyI7Ci0JICBjYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0FMR0VSSUFfTEFUSU46IHJldHVybiAiYmVyX0RaQGxhdGluIjsKLQkgIH0KLQlyZXR1cm4gImJlcl9NQSI7Ci0gICAgICBjYXNlIExBTkdfVEFNSUw6Ci0Jc3dpdGNoIChzdWIpCi0JICB7Ci0JICBjYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJ0YV9JTiI7Ci0JICB9Ci0JcmV0dXJuICJ0YSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInRhX0lOIiBvciAidGFfTEsiIG9yICJ0YV9TRyIuICAqLwotICAgICAgY2FzZSBMQU5HX1RBVEFSOiByZXR1cm4gInR0X1JVIjsKLSAgICAgIGNhc2UgTEFOR19URUxVR1U6IHJldHVybiAidGVfSU4iOwotICAgICAgY2FzZSBMQU5HX1RIQUk6IHJldHVybiAidGhfVEgiOwotICAgICAgY2FzZSBMQU5HX1RJQkVUQU46IHJldHVybiAiYm9fQ04iOwotICAgICAgY2FzZSBMQU5HX1RJR1JJTllBOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX1RJR1JJTllBX0VUSElPUElBOiByZXR1cm4gInRpX0VUIjsKLQkgIGNhc2UgU1VCTEFOR19USUdSSU5ZQV9FUklUUkVBOiByZXR1cm4gInRpX0VSIjsKLQkgIH0KLQlyZXR1cm4gInRpIjsKLSAgICAgIGNhc2UgTEFOR19UU09OR0E6IHJldHVybiAidHNfWkEiOwotICAgICAgY2FzZSBMQU5HX1RTV0FOQTogcmV0dXJuICJ0bl9CVyI7Ci0gICAgICBjYXNlIExBTkdfVFVSS0lTSDogcmV0dXJuICJ0cl9UUiI7Ci0gICAgICBjYXNlIExBTkdfVFVSS01FTjogcmV0dXJuICJ0a19UTSI7Ci0gICAgICBjYXNlIExBTkdfVUtSQUlOSUFOOiByZXR1cm4gInVrX1VBIjsKLSAgICAgIGNhc2UgTEFOR19VUkRVOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU46IHJldHVybiAidXJfUEsiOwotCSAgY2FzZSBTVUJMQU5HX1VSRFVfSU5ESUE6IHJldHVybiAidXJfSU4iOwotCSAgfQotCXJldHVybiAidXIiOwotICAgICAgY2FzZSBMQU5HX1VaQkVLOgotCXN3aXRjaCAoc3ViKQotCSAgewotCSAgY2FzZSBTVUJMQU5HX1VaQkVLX0xBVElOOiByZXR1cm4gInV6X1VaIjsKLQkgIGNhc2UgU1VCTEFOR19VWkJFS19DWVJJTExJQzogcmV0dXJuICJ1el9VWkBjeXJpbGxpYyI7Ci0JICB9Ci0JcmV0dXJuICJ1eiI7Ci0gICAgICBjYXNlIExBTkdfVkVOREE6IHJldHVybiAidmVfWkEiOwotICAgICAgY2FzZSBMQU5HX1ZJRVROQU1FU0U6IHJldHVybiAidmlfVk4iOwotICAgICAgY2FzZSBMQU5HX1dFTFNIOiByZXR1cm4gImN5X0dCIjsKLSAgICAgIGNhc2UgTEFOR19YSE9TQTogcmV0dXJuICJ4aF9aQSI7Ci0gICAgICBjYXNlIExBTkdfWUk6IHJldHVybiAic2l0X0NOIjsKLSAgICAgIGNhc2UgTEFOR19ZSURESVNIOiByZXR1cm4gInlpX0lMIjsKLSAgICAgIGNhc2UgTEFOR19ZT1JVQkE6IHJldHVybiAieW9fTkciOwotICAgICAgY2FzZSBMQU5HX1pVTFU6IHJldHVybiAienVfWkEiOwotICAgICAgZGVmYXVsdDogcmV0dXJuICJDIjsKLSAgICAgIH0KLSAgfQotIyBlbmRpZgotI2VuZGlmCi19Ci0KLWNvbnN0IGNoYXIgKgotZ2xfbG9jYWxlX25hbWUgKGludCBjYXRlZ29yeSwgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKQotewotICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLSAgcmV0dmFsID0gZ2xfbG9jYWxlX25hbWVfcG9zaXggKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOwotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICByZXR1cm4gZ2xfbG9jYWxlX25hbWVfZGVmYXVsdCAoKTsKLX0KZGlmZiAtLWdpdCBhL2ludGwvbG9jay5jIGIvaW50bC9sb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGE4ZDkuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyogTG9ja2luZyBpbiBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwNS4KLSAgIEJhc2VkIG9uIEdDQydzIGd0aHItcG9zaXguaCwgZ3Roci1wb3NpeDk1LmgsIGd0aHItc29sYXJpcy5oLAotICAgZ3Roci13aW4zMi5oLiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0jaW5jbHVkZSAibG9jay5oIgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBVU0VfUE9TSVhfVEhSRUFEUwotCi0vKiBVc2UgdGhlIFBPU0lYIHRocmVhZHMgbGlicmFyeS4gICovCi0KLSMgaWYgUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLQotLyogVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJ5IGEgZHVtbXkgdGhyZWFkLiAgKi8KLXN0YXRpYyB2b2lkICoKLWR1bW15X3RocmVhZF9mdW5jICh2b2lkICphcmcpCi17Ci0gIHJldHVybiBhcmc7Ci19Ci0KLWludAotZ2x0aHJlYWRfaW5fdXNlICh2b2lkKQotewotICBzdGF0aWMgaW50IHRlc3RlZDsKLSAgc3RhdGljIGludCByZXN1bHQ7IC8qIDE6IGxpbmtlZCB3aXRoIC1scHRocmVhZCwgMDogb25seSB3aXRoIGxpYmMgKi8KLQotICBpZiAoIXRlc3RlZCkKLSAgICB7Ci0gICAgICBwdGhyZWFkX3QgdGhyZWFkOwotCi0gICAgICBpZiAocHRocmVhZF9jcmVhdGUgKCZ0aHJlYWQsIE5VTEwsIGR1bW15X3RocmVhZF9mdW5jLCBOVUxMKSAhPSAwKQotCS8qIFRocmVhZCBjcmVhdGlvbiBmYWlsZWQuICAqLwotCXJlc3VsdCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhyZWFkIGNyZWF0aW9uIHdvcmtzLiAgKi8KLQkgIHZvaWQgKnJldHZhbDsKLQkgIGlmIChwdGhyZWFkX2pvaW4gKHRocmVhZCwgJnJldHZhbCkgIT0gMCkKLQkgICAgYWJvcnQgKCk7Ci0JICByZXN1bHQgPSAxOwotCX0KLSAgICAgIHRlc3RlZCA9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0jIGVuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotIyBpZiBIQVZFX1BUSFJFQURfUldMT0NLCi0KLSMgIGlmICFkZWZpbmVkIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSCi0KLXZvaWQKLWdsdGhyZWFkX3J3bG9ja19pbml0IChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKHB0aHJlYWRfcndsb2NrX2luaXQgKCZsb2NrLT5yd2xvY2ssIE5VTEwpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGxvY2stPmluaXRpYWxpemVkID0gMTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi17Ci0gIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPmd1YXJkKSAhPSAwKQotCWFib3J0ICgpOwotICAgICAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLQlnbHRocmVhZF9yd2xvY2tfaW5pdCAobG9jayk7Ci0gICAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChwdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZsb2NrLT5yd2xvY2spICE9IDApCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0JZ2x0aHJlYWRfcndsb2NrX2luaXQgKGxvY2spOwotICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+Z3VhcmQpICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgfQotICBpZiAocHRocmVhZF9yd2xvY2tfd3Jsb2NrICgmbG9jay0+cndsb2NrKSAhPSAwKQotICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1nbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHB0aHJlYWRfcndsb2NrX3VubG9jayAoJmxvY2stPnJ3bG9jaykgIT0gMCkKLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotICAgIGFib3J0ICgpOwotICBpZiAocHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJmxvY2stPnJ3bG9jaykgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgbG9jay0+aW5pdGlhbGl6ZWQgPSAwOwotfQotCi0jICBlbmRpZgotCi0jIGVsc2UKLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKQotewotICBpZiAocHRocmVhZF9tdXRleF9pbml0ICgmbG9jay0+bG9jaywgTlVMTCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHB0aHJlYWRfY29uZF9pbml0ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzLCBOVUxMKSAhPSAwKQotICAgIGFib3J0ICgpOwotICBpZiAocHRocmVhZF9jb25kX2luaXQgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMsIE5VTEwpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCA9IDA7Ci0gIGxvY2stPnJ1bmNvdW50ID0gMDsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi17Ci0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotICAgIGFib3J0ICgpOwotICAvKiBUZXN0IHdoZXRoZXIgb25seSByZWFkZXJzIGFyZSBjdXJyZW50bHkgcnVubmluZywgYW5kIHdoZXRoZXIgdGhlIHJ1bmNvdW50Ci0gICAgIGZpZWxkIHdpbGwgbm90IG92ZXJmbG93LiAgKi8KLSAgLyogUE9TSVggc2F5czogIkl0IGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgd2hldGhlciB0aGUgY2FsbGluZyB0aHJlYWQKLSAgICAgYWNxdWlyZXMgdGhlIGxvY2sgd2hlbiBhIHdyaXRlciBkb2VzIG5vdCBob2xkIHRoZSBsb2NrIGFuZCB0aGVyZSBhcmUKLSAgICAgd3JpdGVycyBibG9ja2VkIG9uIHRoZSBsb2NrLiIgIExldCdzIHNheSwgbm86IGdpdmUgdGhlIHdyaXRlcnMgYSBoaWdoZXIKLSAgICAgcHJpb3JpdHkuICAqLwotICB3aGlsZSAoIShsb2NrLT5ydW5jb3VudCArIDEgPiAwICYmIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHRocmVhZCBoYXMgdG8gd2FpdCBmb3IgYSB3aGlsZS4gIEVucXVldWUgaXQgYW1vbmcgdGhlCi0JIHdhaXRpbmdfcmVhZGVycy4gICovCi0gICAgICBpZiAocHRocmVhZF9jb25kX3dhaXQgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMsICZsb2NrLT5sb2NrKSAhPSAwKQotCWFib3J0ICgpOwotICAgIH0KLSAgbG9jay0+cnVuY291bnQrKzsKLSAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+bG9jaykgIT0gMCkKLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spCi17Ci0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotICAgIGFib3J0ICgpOwotICAvKiBUZXN0IHdoZXRoZXIgbm8gcmVhZGVycyBvciB3cml0ZXJzIGFyZSBjdXJyZW50bHkgcnVubmluZy4gICovCi0gIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ID09IDApKQotICAgIHsKLSAgICAgIC8qIFRoaXMgdGhyZWFkIGhhcyB0byB3YWl0IGZvciBhIHdoaWxlLiAgRW5xdWV1ZSBpdCBhbW9uZyB0aGUKLQkgd2FpdGluZ193cml0ZXJzLiAgKi8KLSAgICAgIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudCsrOwotICAgICAgaWYgKHB0aHJlYWRfY29uZF93YWl0ICgmbG9jay0+d2FpdGluZ193cml0ZXJzLCAmbG9jay0+bG9jaykgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPndhaXRpbmdfd3JpdGVyc19jb3VudC0tOwotICAgIH0KLSAgbG9jay0+cnVuY291bnQtLTsgLyogcnVuY291bnQgYmVjb21lcyAtMSAqLwotICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5sb2NrKSAhPSAwKQotICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1nbHRocmVhZF9yd2xvY2tfdW5sb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPmxvY2spICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChsb2NrLT5ydW5jb3VudCA8IDApCi0gICAgewotICAgICAgLyogRHJvcCBhIHdyaXRlciBsb2NrLiAgKi8KLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID09IC0xKSkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPnJ1bmNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEcm9wIGEgcmVhZGVyIGxvY2suICAqLwotICAgICAgaWYgKCEobG9jay0+cnVuY291bnQgPiAwKSkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPnJ1bmNvdW50LS07Ci0gICAgfQotICBpZiAobG9jay0+cnVuY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBQT1NJWCByZWNvbW1lbmRzIHRoYXQgIndyaXRlIGxvY2tzIHNoYWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHJlYWQKLQkgbG9ja3MiLCB0byBhdm9pZCAid3JpdGVyIHN0YXJ2YXRpb24iLiAgKi8KLSAgICAgIGlmIChsb2NrLT53YWl0aW5nX3dyaXRlcnNfY291bnQgPiAwKQotCXsKLQkgIC8qIFdha2UgdXAgb25lIG9mIHRoZSB3YWl0aW5nIHdyaXRlcnMuICAqLwotCSAgaWYgKHB0aHJlYWRfY29uZF9zaWduYWwgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMpICE9IDApCi0JICAgIGFib3J0ICgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXYWtlIHVwIGFsbCB3YWl0aW5nIHJlYWRlcnMuICAqLwotCSAgaWYgKHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMpICE9IDApCi0JICAgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIGlmIChwdGhyZWFkX211dGV4X3VubG9jayAoJmxvY2stPmxvY2spICE9IDApCi0gICAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJmxvY2stPmxvY2spICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChwdGhyZWFkX2NvbmRfZGVzdHJveSAoJmxvY2stPndhaXRpbmdfcmVhZGVycykgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHB0aHJlYWRfY29uZF9kZXN0cm95ICgmbG9jay0+d2FpdGluZ193cml0ZXJzKSAhPSAwKQotICAgIGFib3J0ICgpOwotfQotCi0jIGVuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jIGlmIEhBVkVfUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUKLQotIyAgaWYgIShkZWZpbmVkIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSIHx8IGRlZmluZWQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCi0KLXZvaWQKLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi17Ci0gIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlczsKLQotICBpZiAocHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJmF0dHJpYnV0ZXMpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmYXR0cmlidXRlcywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChwdGhyZWFkX211dGV4X2luaXQgKCZsb2NrLT5yZWNtdXRleCwgJmF0dHJpYnV0ZXMpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmYXR0cmlidXRlcykgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgbG9jay0+aW5pdGlhbGl6ZWQgPSAxOwotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmICghbG9jay0+aW5pdGlhbGl6ZWQpCi0JZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAobG9jayk7Ci0gICAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5ndWFyZCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZsb2NrLT5yZWNtdXRleCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmluaXRpYWxpemVkKQotICAgIGFib3J0ICgpOwotICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZsb2NrLT5yZWNtdXRleCkgIT0gMCkKLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5pbml0aWFsaXplZCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJmxvY2stPnJlY211dGV4KSAhPSAwKQotICAgIGFib3J0ICgpOwotICBsb2NrLT5pbml0aWFsaXplZCA9IDA7Ci19Ci0KLSMgIGVuZGlmCi0KLSMgZWxzZQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAocHRocmVhZF9tdXRleF9pbml0ICgmbG9jay0+bXV0ZXgsIE5VTEwpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGxvY2stPm93bmVyID0gKHB0aHJlYWRfdCkgMDsKLSAgbG9jay0+ZGVwdGggPSAwOwotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBwdGhyZWFkX3Qgc2VsZiA9IHB0aHJlYWRfc2VsZiAoKTsKLSAgaWYgKGxvY2stPm93bmVyICE9IHNlbGYpCi0gICAgewotICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJmxvY2stPm11dGV4KSAhPSAwKQotCWFib3J0ICgpOwotICAgICAgbG9jay0+b3duZXIgPSBzZWxmOwotICAgIH0KLSAgaWYgKCsrKGxvY2stPmRlcHRoKSA9PSAwKSAvKiB3cmFwYXJvdW5kPyAqLwotICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi17Ci0gIGlmIChsb2NrLT5vd25lciAhPSBwdGhyZWFkX3NlbGYgKCkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChsb2NrLT5kZXB0aCA9PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAoLS0obG9jay0+ZGVwdGgpID09IDApCi0gICAgewotICAgICAgbG9jay0+b3duZXIgPSAocHRocmVhZF90KSAwOwotICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbG9jay0+bXV0ZXgpICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobG9jay0+b3duZXIgIT0gKHB0aHJlYWRfdCkgMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJmxvY2stPm11dGV4KSAhPSAwKQotICAgIGFib3J0ICgpOwotfQotCi0jIGVuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgY29uc3QgcHRocmVhZF9vbmNlX3QgZnJlc2hfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOwotCi1pbnQKLWdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wpCi17Ci0gIC8qIFdlIGRvbid0IGtub3cgd2hldGhlciBwdGhyZWFkX29uY2VfdCBpcyBhbiBpbnRlZ2VyIHR5cGUsIGEgZmxvYXRpbmctcG9pbnQKLSAgICAgdHlwZSwgYSBwb2ludGVyIHR5cGUsIG9yIGEgc3RydWN0dXJlIHR5cGUuICAqLwotICBjaGFyICpmaXJzdGJ5dGUgPSAoY2hhciAqKW9uY2VfY29udHJvbDsKLSAgaWYgKCpmaXJzdGJ5dGUgPT0gKihjb25zdCBjaGFyICopJmZyZXNoX29uY2UpCi0gICAgewotICAgICAgLyogRmlyc3QgdGltZSB1c2Ugb2Ygb25jZV9jb250cm9sLiAgSW52ZXJ0IHRoZSBmaXJzdCBieXRlLiAgKi8KLSAgICAgICpmaXJzdGJ5dGUgPSB+ICooY29uc3QgY2hhciAqKSZmcmVzaF9vbmNlOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBVU0VfUFRIX1RIUkVBRFMKLQotLyogVXNlIHRoZSBHTlUgUHRoIHRocmVhZHMgbGlicmFyeS4gICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkCi1nbHRocmVhZF9vbmNlX2NhbGwgKHZvaWQgKmFyZykKLXsKLSAgdm9pZCAoKipnbF9vbmNlX3RlbXBfYWRkcikgKHZvaWQpID0gKHZvaWQgKCoqKSAodm9pZCkpIGFyZzsKLSAgdm9pZCAoKmluaXRmdW5jdGlvbikgKHZvaWQpID0gKmdsX29uY2VfdGVtcF9hZGRyOwotICBpbml0ZnVuY3Rpb24gKCk7Ci19Ci0KLWludAotZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAocHRoX29uY2VfdCAqb25jZV9jb250cm9sKQotewotICAvKiBXZSBrbm93IHRoYXQgcHRoX29uY2VfdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICAqLwotICBpZiAoKm9uY2VfY29udHJvbCA9PSBQVEhfT05DRV9JTklUKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IHRpbWUgdXNlIG9mIG9uY2VfY29udHJvbC4gIEludmVydCB0aGUgbWFya2VyLiAgKi8KLSAgICAgICpvbmNlX2NvbnRyb2wgPSB+IFBUSF9PTkNFX0lOSVQ7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIFVTRV9TT0xBUklTX1RIUkVBRFMKLQotLyogVXNlIHRoZSBvbGQgU29sYXJpcyB0aHJlYWRzIGxpYnJhcnkuICAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobXV0ZXhfaW5pdCAoJmxvY2stPm11dGV4LCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGxvY2stPm93bmVyID0gKHRocmVhZF90KSAwOwotICBsb2NrLT5kZXB0aCA9IDA7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spCi17Ci0gIHRocmVhZF90IHNlbGYgPSB0aHJfc2VsZiAoKTsKLSAgaWYgKGxvY2stPm93bmVyICE9IHNlbGYpCi0gICAgewotICAgICAgaWYgKG11dGV4X2xvY2sgKCZsb2NrLT5tdXRleCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPm93bmVyID0gc2VsZjsKLSAgICB9Ci0gIGlmICgrKyhsb2NrLT5kZXB0aCkgPT0gMCkgLyogd3JhcGFyb3VuZD8gKi8KLSAgICBhYm9ydCAoKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobG9jay0+b3duZXIgIT0gdGhyX3NlbGYgKCkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChsb2NrLT5kZXB0aCA9PSAwKQotICAgIGFib3J0ICgpOwotICBpZiAoLS0obG9jay0+ZGVwdGgpID09IDApCi0gICAgewotICAgICAgbG9jay0+b3duZXIgPSAodGhyZWFkX3QpIDA7Ci0gICAgICBpZiAobXV0ZXhfdW5sb2NrICgmbG9jay0+bXV0ZXgpICE9IDApCi0JYWJvcnQgKCk7Ci0gICAgfQotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobG9jay0+b3duZXIgIT0gKHRocmVhZF90KSAwKQotICAgIGFib3J0ICgpOwotICBpZiAobXV0ZXhfZGVzdHJveSAoJmxvY2stPm11dGV4KSAhPSAwKQotICAgIGFib3J0ICgpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZAotZ2x0aHJlYWRfb25jZSAoZ2xfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSkKLXsKLSAgaWYgKCFvbmNlX2NvbnRyb2wtPmluaXRlZCkKLSAgICB7Ci0gICAgICAvKiBVc2UgdGhlIG11dGV4IHRvIGd1YXJhbnRlZSB0aGF0IGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgY2FsbGluZwotCSB0aGUgaW5pdGZ1bmN0aW9uLCB0aGlzIHRocmVhZCB3YWl0cyB1bnRpbCBpdCdzIGZpbmlzaGVkLiAgKi8KLSAgICAgIGlmIChtdXRleF9sb2NrICgmb25jZV9jb250cm9sLT5tdXRleCkgIT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmICghb25jZV9jb250cm9sLT5pbml0ZWQpCi0JewotCSAgb25jZV9jb250cm9sLT5pbml0ZWQgPSAxOwotCSAgaW5pdGZ1bmN0aW9uICgpOwotCX0KLSAgICAgIGlmIChtdXRleF91bmxvY2sgKCZvbmNlX2NvbnRyb2wtPm11dGV4KSAhPSAwKQotCWFib3J0ICgpOwotICAgIH0KLX0KLQotaW50Ci1nbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChnbF9vbmNlX3QgKm9uY2VfY29udHJvbCkKLXsKLSAgLyogV2Uga25vdyB0aGF0IGdsX29uY2VfdCBjb250YWlucyBhbiBpbnRlZ2VyIHR5cGUuICAqLwotICBpZiAoIW9uY2VfY29udHJvbC0+aW5pdGVkKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IHRpbWUgdXNlIG9mIG9uY2VfY29udHJvbC4gIEludmVydCB0aGUgbWFya2VyLiAgKi8KLSAgICAgIG9uY2VfY29udHJvbC0+aW5pdGVkID0gfiAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBVU0VfV0lOMzJfVEhSRUFEUwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZAotZ2x0aHJlYWRfbG9ja19pbml0IChnbF9sb2NrX3QgKmxvY2spCi17Ci0gIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDE7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX2xvY2tfbG9jayAoZ2xfbG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0gICAgewotICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmbG9jay0+Z3VhcmQuc3RhcnRlZCkgPT0gMCkKLQkvKiBUaGlzIHRocmVhZCBpcyB0aGUgZmlyc3Qgb25lIHRvIG5lZWQgdGhpcyBsb2NrLiAgSW5pdGlhbGl6ZSBpdC4gICovCi0JZ2x0aHJlYWRfbG9ja19pbml0IChsb2NrKTsKLSAgICAgIGVsc2UKLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotCSAgIGluaXRpYWxpemluZyB0aGlzIGxvY2suICAqLwotCXdoaWxlICghbG9jay0+Z3VhcmQuZG9uZSkKLQkgIFNsZWVwICgwKTsKLSAgICB9Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX2xvY2tfdW5sb2NrIChnbF9sb2NrX3QgKmxvY2spCi17Ci0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLSAgICBhYm9ydCAoKTsKLSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfbG9ja19kZXN0cm95IChnbF9sb2NrX3QgKmxvY2spCi17Ci0gIGlmICghbG9jay0+Z3VhcmQuZG9uZSkKLSAgICBhYm9ydCAoKTsKLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIGxvY2stPmd1YXJkLmRvbmUgPSAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkCi1nbF93YWl0cXVldWVfaW5pdCAoZ2xfd2FpdHF1ZXVlX3QgKndxKQotewotICB3cS0+YXJyYXkgPSBOVUxMOwotICB3cS0+Y291bnQgPSAwOwotICB3cS0+YWxsb2MgPSAwOwotICB3cS0+b2Zmc2V0ID0gMDsKLX0KLQotLyogRW5xdWV1ZXMgdGhlIGN1cnJlbnQgdGhyZWFkLCByZXByZXNlbnRlZCBieSBhbiBldmVudCwgaW4gYSB3YWl0IHF1ZXVlLgotICAgUmV0dXJucyBJTlZBTElEX0hBTkRMRV9WQUxVRSBpZiBhbiBhbGxvY2F0aW9uIGZhaWx1cmUgb2NjdXJzLiAgKi8KLXN0YXRpYyBIQU5ETEUKLWdsX3dhaXRxdWV1ZV9hZGQgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLXsKLSAgSEFORExFIGV2ZW50OwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLSAgaWYgKHdxLT5jb3VudCA9PSB3cS0+YWxsb2MpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5ld19hbGxvYyA9IDIgKiB3cS0+YWxsb2MgKyAxOwotICAgICAgSEFORExFICpuZXdfYXJyYXkgPQotCShIQU5ETEUgKikgcmVhbGxvYyAod3EtPmFycmF5LCBuZXdfYWxsb2MgKiBzaXplb2YgKEhBTkRMRSkpOwotICAgICAgaWYgKG5ld19hcnJheSA9PSBOVUxMKQotCS8qIE5vIG1vcmUgbWVtb3J5LiAgKi8KLQlyZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gICAgICAvKiBOb3cgaXMgYSBnb29kIG9wcG9ydHVuaXR5IHRvIHJvdGF0ZSB0aGUgYXJyYXkgc28gdGhhdCBpdHMgY29udGVudHMKLQkgc3RhcnRzIGF0IG9mZnNldCAwLiAgKi8KLSAgICAgIGlmICh3cS0+b2Zmc2V0ID4gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgb2xkX2NvdW50ID0gd3EtPmNvdW50OwotCSAgdW5zaWduZWQgaW50IG9sZF9hbGxvYyA9IHdxLT5hbGxvYzsKLQkgIHVuc2lnbmVkIGludCBvbGRfb2Zmc2V0ID0gd3EtPm9mZnNldDsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgaWYgKG9sZF9vZmZzZXQgKyBvbGRfY291bnQgPiBvbGRfYWxsb2MpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgbGltaXQgPSBvbGRfb2Zmc2V0ICsgb2xkX2NvdW50IC0gb2xkX2FsbG9jOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKQotCQluZXdfYXJyYXlbb2xkX2FsbG9jICsgaV0gPSBuZXdfYXJyYXlbaV07Ci0JICAgIH0KLQkgIGZvciAoaSA9IDA7IGkgPCBvbGRfY291bnQ7IGkrKykKLQkgICAgbmV3X2FycmF5W2ldID0gbmV3X2FycmF5W29sZF9vZmZzZXQgKyBpXTsKLQkgIHdxLT5vZmZzZXQgPSAwOwotCX0KLSAgICAgIHdxLT5hcnJheSA9IG5ld19hcnJheTsKLSAgICAgIHdxLT5hbGxvYyA9IG5ld19hbGxvYzsKLSAgICB9Ci0gIGV2ZW50ID0gQ3JlYXRlRXZlbnQgKE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKLSAgaWYgKGV2ZW50ID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgIC8qIE5vIHdheSB0byBhbGxvY2F0ZSBhbiBldmVudC4gICovCi0gICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbmRleCA9IHdxLT5vZmZzZXQgKyB3cS0+Y291bnQ7Ci0gIGlmIChpbmRleCA+PSB3cS0+YWxsb2MpCi0gICAgaW5kZXggLT0gd3EtPmFsbG9jOwotICB3cS0+YXJyYXlbaW5kZXhdID0gZXZlbnQ7Ci0gIHdxLT5jb3VudCsrOwotICByZXR1cm4gZXZlbnQ7Ci19Ci0KLS8qIE5vdGlmaWVzIHRoZSBmaXJzdCB0aHJlYWQgZnJvbSBhIHdhaXQgcXVldWUgYW5kIGRlcXVldWVzIGl0LiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotZ2xfd2FpdHF1ZXVlX25vdGlmeV9maXJzdCAoZ2xfd2FpdHF1ZXVlX3QgKndxKQotewotICBTZXRFdmVudCAod3EtPmFycmF5W3dxLT5vZmZzZXQgKyAwXSk7Ci0gIHdxLT5vZmZzZXQrKzsKLSAgd3EtPmNvdW50LS07Ci0gIGlmICh3cS0+Y291bnQgPT0gMCB8fCB3cS0+b2Zmc2V0ID09IHdxLT5hbGxvYykKLSAgICB3cS0+b2Zmc2V0ID0gMDsKLX0KLQotLyogTm90aWZpZXMgYWxsIHRocmVhZHMgZnJvbSBhIHdhaXQgcXVldWUgYW5kIGRlcXVldWVzIHRoZW0gYWxsLiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotZ2xfd2FpdHF1ZXVlX25vdGlmeV9hbGwgKGdsX3dhaXRxdWV1ZV90ICp3cSkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHdxLT5jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IHdxLT5vZmZzZXQgKyBpOwotICAgICAgaWYgKGluZGV4ID49IHdxLT5hbGxvYykKLQlpbmRleCAtPSB3cS0+YWxsb2M7Ci0gICAgICBTZXRFdmVudCAod3EtPmFycmF5W2luZGV4XSk7Ci0gICAgfQotICB3cS0+Y291bnQgPSAwOwotICB3cS0+b2Zmc2V0ID0gMDsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKQotewotICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIGdsX3dhaXRxdWV1ZV9pbml0ICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKTsKLSAgZ2xfd2FpdHF1ZXVlX2luaXQgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMpOwotICBsb2NrLT5ydW5jb3VudCA9IDA7Ci0gIGxvY2stPmd1YXJkLmRvbmUgPSAxOwotfQotCi12b2lkCi1nbHRocmVhZF9yd2xvY2tfcmRsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotICAgIHsKLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJmxvY2stPmd1YXJkLnN0YXJ0ZWQpID09IDApCi0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotCWdsdGhyZWFkX3J3bG9ja19pbml0IChsb2NrKTsKLSAgICAgIGVsc2UKLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotCSAgIGluaXRpYWxpemluZyB0aGlzIGxvY2suICAqLwotCXdoaWxlICghbG9jay0+Z3VhcmQuZG9uZSkKLQkgIFNsZWVwICgwKTsKLSAgICB9Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIC8qIFRlc3Qgd2hldGhlciBvbmx5IHJlYWRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLCBhbmQgd2hldGhlciB0aGUgcnVuY291bnQKLSAgICAgZmllbGQgd2lsbCBub3Qgb3ZlcmZsb3cuICAqLwotICBpZiAoIShsb2NrLT5ydW5jb3VudCArIDEgPiAwKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHRocmVhZCBoYXMgdG8gd2FpdCBmb3IgYSB3aGlsZS4gIEVucXVldWUgaXQgYW1vbmcgdGhlCi0JIHdhaXRpbmdfcmVhZGVycy4gICovCi0gICAgICBIQU5ETEUgZXZlbnQgPSBnbF93YWl0cXVldWVfYWRkICgmbG9jay0+d2FpdGluZ19yZWFkZXJzKTsKLSAgICAgIGlmIChldmVudCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQl7Ci0JICBEV09SRCByZXN1bHQ7Ci0JICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotCSAgLyogV2FpdCB1bnRpbCBhbm90aGVyIHRocmVhZCBzaWduYWxzIHRoaXMgZXZlbnQuICAqLwotCSAgcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCAoZXZlbnQsIElORklOSVRFKTsKLQkgIGlmIChyZXN1bHQgPT0gV0FJVF9GQUlMRUQgfHwgcmVzdWx0ID09IFdBSVRfVElNRU9VVCkKLQkgICAgYWJvcnQgKCk7Ci0JICBDbG9zZUhhbmRsZSAoZXZlbnQpOwotCSAgLyogVGhlIHRocmVhZCB3aGljaCBzaWduYWxsZWQgdGhlIGV2ZW50IGFscmVhZHkgZGlkIHRoZSBib29ra2VlcGluZzoKLQkgICAgIHJlbW92ZWQgdXMgZnJvbSB0aGUgd2FpdGluZ19yZWFkZXJzLCBpbmNyZW1lbnRlZCBsb2NrLT5ydW5jb3VudC4gICovCi0JICBpZiAoIShsb2NrLT5ydW5jb3VudCA+IDApKQotCSAgICBhYm9ydCAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGlvbiBmYWlsdXJlLiAgV2VpcmQuICAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0JICAgICAgU2xlZXAgKDEpOwotCSAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0JICAgIH0KLQkgIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ICsgMSA+IDApKTsKLQl9Ci0gICAgfQotICBsb2NrLT5ydW5jb3VudCsrOwotICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotfQotCi12b2lkCi1nbHRocmVhZF9yd2xvY2tfd3Jsb2NrIChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotICAgIHsKLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJmxvY2stPmd1YXJkLnN0YXJ0ZWQpID09IDApCi0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotCWdsdGhyZWFkX3J3bG9ja19pbml0IChsb2NrKTsKLSAgICAgIGVsc2UKLQkvKiBZaWVsZCB0aGUgQ1BVIHdoaWxlIHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGZpbmlzaAotCSAgIGluaXRpYWxpemluZyB0aGlzIGxvY2suICAqLwotCXdoaWxlICghbG9jay0+Z3VhcmQuZG9uZSkKLQkgIFNsZWVwICgwKTsKLSAgICB9Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIC8qIFRlc3Qgd2hldGhlciBubyByZWFkZXJzIG9yIHdyaXRlcnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLiAgKi8KLSAgaWYgKCEobG9jay0+cnVuY291bnQgPT0gMCkpCi0gICAgewotICAgICAgLyogVGhpcyB0aHJlYWQgaGFzIHRvIHdhaXQgZm9yIGEgd2hpbGUuICBFbnF1ZXVlIGl0IGFtb25nIHRoZQotCSB3YWl0aW5nX3dyaXRlcnMuICAqLwotICAgICAgSEFORExFIGV2ZW50ID0gZ2xfd2FpdHF1ZXVlX2FkZCAoJmxvY2stPndhaXRpbmdfd3JpdGVycyk7Ci0gICAgICBpZiAoZXZlbnQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JewotCSAgRFdPUkQgcmVzdWx0OwotCSAgTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLQkgIC8qIFdhaXQgdW50aWwgYW5vdGhlciB0aHJlYWQgc2lnbmFscyB0aGlzIGV2ZW50LiAgKi8KLQkgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QgKGV2ZW50LCBJTkZJTklURSk7Ci0JICBpZiAocmVzdWx0ID09IFdBSVRfRkFJTEVEIHx8IHJlc3VsdCA9PSBXQUlUX1RJTUVPVVQpCi0JICAgIGFib3J0ICgpOwotCSAgQ2xvc2VIYW5kbGUgKGV2ZW50KTsKLQkgIC8qIFRoZSB0aHJlYWQgd2hpY2ggc2lnbmFsbGVkIHRoZSBldmVudCBhbHJlYWR5IGRpZCB0aGUgYm9va2tlZXBpbmc6Ci0JICAgICByZW1vdmVkIHVzIGZyb20gdGhlIHdhaXRpbmdfd3JpdGVycywgc2V0IGxvY2stPnJ1bmNvdW50ID0gLTEuICAqLwotCSAgaWYgKCEobG9jay0+cnVuY291bnQgPT0gLTEpKQotCSAgICBhYm9ydCAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGlvbiBmYWlsdXJlLiAgV2VpcmQuICAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0JICAgICAgU2xlZXAgKDEpOwotCSAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0JICAgIH0KLQkgIHdoaWxlICghKGxvY2stPnJ1bmNvdW50ID09IDApKTsKLQl9Ci0gICAgfQotICBsb2NrLT5ydW5jb3VudC0tOyAvKiBydW5jb3VudCBiZWNvbWVzIC0xICovCi0gIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKQotewotICBpZiAoIWxvY2stPmd1YXJkLmRvbmUpCi0gICAgYWJvcnQgKCk7Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIGlmIChsb2NrLT5ydW5jb3VudCA8IDApCi0gICAgewotICAgICAgLyogRHJvcCBhIHdyaXRlciBsb2NrLiAgKi8KLSAgICAgIGlmICghKGxvY2stPnJ1bmNvdW50ID09IC0xKSkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPnJ1bmNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBEcm9wIGEgcmVhZGVyIGxvY2suICAqLwotICAgICAgaWYgKCEobG9jay0+cnVuY291bnQgPiAwKSkKLQlhYm9ydCAoKTsKLSAgICAgIGxvY2stPnJ1bmNvdW50LS07Ci0gICAgfQotICBpZiAobG9jay0+cnVuY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBQT1NJWCByZWNvbW1lbmRzIHRoYXQgIndyaXRlIGxvY2tzIHNoYWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHJlYWQKLQkgbG9ja3MiLCB0byBhdm9pZCAid3JpdGVyIHN0YXJ2YXRpb24iLiAgKi8KLSAgICAgIGlmIChsb2NrLT53YWl0aW5nX3dyaXRlcnMuY291bnQgPiAwKQotCXsKLQkgIC8qIFdha2UgdXAgb25lIG9mIHRoZSB3YWl0aW5nIHdyaXRlcnMuICAqLwotCSAgbG9jay0+cnVuY291bnQtLTsKLQkgIGdsX3dhaXRxdWV1ZV9ub3RpZnlfZmlyc3QgKCZsb2NrLT53YWl0aW5nX3dyaXRlcnMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXYWtlIHVwIGFsbCB3YWl0aW5nIHJlYWRlcnMuICAqLwotCSAgbG9jay0+cnVuY291bnQgKz0gbG9jay0+d2FpdGluZ19yZWFkZXJzLmNvdW50OwotCSAgZ2xfd2FpdHF1ZXVlX25vdGlmeV9hbGwgKCZsb2NrLT53YWl0aW5nX3JlYWRlcnMpOwotCX0KLSAgICB9Ci0gIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci19Ci0KLXZvaWQKLWdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotICAgIGFib3J0ICgpOwotICBpZiAobG9jay0+cnVuY291bnQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIGlmIChsb2NrLT53YWl0aW5nX3JlYWRlcnMuYXJyYXkgIT0gTlVMTCkKLSAgICBmcmVlIChsb2NrLT53YWl0aW5nX3JlYWRlcnMuYXJyYXkpOwotICBpZiAobG9jay0+d2FpdGluZ193cml0ZXJzLmFycmF5ICE9IE5VTEwpCi0gICAgZnJlZSAobG9jay0+d2FpdGluZ193cml0ZXJzLmFycmF5KTsKLSAgbG9jay0+Z3VhcmQuZG9uZSA9IDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBsb2NrLT5vd25lciA9IDA7Ci0gIGxvY2stPmRlcHRoID0gMDsKLSAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiAoJmxvY2stPmxvY2spOwotICBsb2NrLT5ndWFyZC5kb25lID0gMTsKLX0KLQotdm9pZAotZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jaykKLXsKLSAgaWYgKCFsb2NrLT5ndWFyZC5kb25lKQotICAgIHsKLSAgICAgIGlmIChJbnRlcmxvY2tlZEluY3JlbWVudCAoJmxvY2stPmd1YXJkLnN0YXJ0ZWQpID09IDApCi0JLyogVGhpcyB0aHJlYWQgaXMgdGhlIGZpcnN0IG9uZSB0byBuZWVkIHRoaXMgbG9jay4gIEluaXRpYWxpemUgaXQuICAqLwotCWdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGxvY2spOwotICAgICAgZWxzZQotCS8qIFlpZWxkIHRoZSBDUFUgd2hpbGUgd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQgdG8gZmluaXNoCi0JICAgaW5pdGlhbGl6aW5nIHRoaXMgbG9jay4gICovCi0Jd2hpbGUgKCFsb2NrLT5ndWFyZC5kb25lKQotCSAgU2xlZXAgKDApOwotICAgIH0KLSAgewotICAgIERXT1JEIHNlbGYgPSBHZXRDdXJyZW50VGhyZWFkSWQgKCk7Ci0gICAgaWYgKGxvY2stPm93bmVyICE9IHNlbGYpCi0gICAgICB7Ci0JRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZsb2NrLT5sb2NrKTsKLQlsb2NrLT5vd25lciA9IHNlbGY7Ci0gICAgICB9Ci0gICAgaWYgKCsrKGxvY2stPmRlcHRoKSA9PSAwKSAvKiB3cmFwYXJvdW5kPyAqLwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotdm9pZAotZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobG9jay0+b3duZXIgIT0gR2V0Q3VycmVudFRocmVhZElkICgpKQotICAgIGFib3J0ICgpOwotICBpZiAobG9jay0+ZGVwdGggPT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKC0tKGxvY2stPmRlcHRoKSA9PSAwKQotICAgIHsKLSAgICAgIGxvY2stPm93bmVyID0gMDsKLSAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gICAgfQotfQotCi12b2lkCi1nbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKQotewotICBpZiAobG9jay0+b3duZXIgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uICgmbG9jay0+bG9jayk7Ci0gIGxvY2stPmd1YXJkLmRvbmUgPSAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZAotZ2x0aHJlYWRfb25jZSAoZ2xfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSkKLXsKLSAgaWYgKG9uY2VfY29udHJvbC0+aW5pdGVkIDw9IDApCi0gICAgewotICAgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50ICgmb25jZV9jb250cm9sLT5zdGFydGVkKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgdGhyZWFkIGlzIHRoZSBmaXJzdCBvbmUgdG8gY29tZSB0byB0aGlzIG9uY2VfY29udHJvbC4gICovCi0JICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLQkgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLQkgIG9uY2VfY29udHJvbC0+aW5pdGVkID0gMDsKLQkgIGluaXRmdW5jdGlvbiAoKTsKLQkgIG9uY2VfY29udHJvbC0+aW5pdGVkID0gMTsKLQkgIExlYXZlQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVW5kbyBsYXN0IG9wZXJhdGlvbi4gICovCi0JICBJbnRlcmxvY2tlZERlY3JlbWVudCAoJm9uY2VfY29udHJvbC0+c3RhcnRlZCk7Ci0JICAvKiBTb21lIG90aGVyIHRocmVhZCBoYXMgYWxyZWFkeSBzdGFydGVkIHRoZSBpbml0aWFsaXphdGlvbi4KLQkgICAgIFlpZWxkIHRoZSBDUFUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBmaW5pc2gKLQkgICAgIGluaXRpYWxpemluZyBhbmQgdGFraW5nIHRoZSBsb2NrLiAgKi8KLQkgIHdoaWxlIChvbmNlX2NvbnRyb2wtPmluaXRlZCA8IDApCi0JICAgIFNsZWVwICgwKTsKLQkgIGlmIChvbmNlX2NvbnRyb2wtPmluaXRlZCA8PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGFrZSB0aGUgbG9jay4gIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBvdGhlciB0aHJlYWQgaGFzCi0JCSBmaW5pc2hlZCBjYWxsaW5nIHRoZSBpbml0ZnVuY3Rpb24uICAqLwotCSAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uICgmb25jZV9jb250cm9sLT5sb2NrKTsKLQkgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJm9uY2VfY29udHJvbC0+bG9jayk7Ci0JICAgICAgaWYgKCEob25jZV9jb250cm9sLT5pbml0ZWQgPiAwKSkKLQkJYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvaW50bC9sb2NrLmggYi9pbnRsL2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0NTMxZC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDExMDUgKzAsMCBAQAotLyogTG9ja2luZyBpbiBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwNS4KLSAgIEJhc2VkIG9uIEdDQydzIGd0aHItcG9zaXguaCwgZ3Roci1wb3NpeDk1LmgsIGd0aHItc29sYXJpcy5oLAotICAgZ3Roci13aW4zMi5oLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGxvY2tpbmcgcHJpbWl0aXZlcyBmb3IgdXNlIHdpdGggYSBnaXZlbiB0aHJlYWQgbGlicmFyeS4KLSAgIEl0IGRvZXMgbm90IGNvbnRhaW4gcHJpbWl0aXZlcyBmb3IgY3JlYXRpbmcgdGhyZWFkcyBvciBmb3Igb3RoZXIKLSAgIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgotCi0gICBOb3JtYWwgKG5vbi1yZWN1cnNpdmUpIGxvY2tzOgotICAgICBUeXBlOiAgICAgICAgICAgICAgICBnbF9sb2NrX3QKLSAgICAgRGVjbGFyYXRpb246ICAgICAgICAgZ2xfbG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZCgsIG5hbWUpCi0gICAgIEluaXRpYWxpemF0aW9uOiAgICAgIGdsX2xvY2tfaW5pdCAobmFtZSk7Ci0gICAgIFRha2luZyB0aGUgbG9jazogICAgIGdsX2xvY2tfbG9jayAobmFtZSk7Ci0gICAgIFJlbGVhc2luZyB0aGUgbG9jazogIGdsX2xvY2tfdW5sb2NrIChuYW1lKTsKLSAgICAgRGUtaW5pdGlhbGl6YXRpb246ICAgZ2xfbG9ja19kZXN0cm95IChuYW1lKTsKLQotICAgUmVhZC1Xcml0ZSAobm9uLXJlY3Vyc2l2ZSkgbG9ja3M6Ci0gICAgIFR5cGU6ICAgICAgICAgICAgICAgIGdsX3J3bG9ja190Ci0gICAgIERlY2xhcmF0aW9uOiAgICAgICAgIGdsX3J3bG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKCwgbmFtZSkKLSAgICAgSW5pdGlhbGl6YXRpb246ICAgICAgZ2xfcndsb2NrX2luaXQgKG5hbWUpOwotICAgICBUYWtpbmcgdGhlIGxvY2s6ICAgICBnbF9yd2xvY2tfcmRsb2NrIChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcndsb2NrX3dybG9jayAobmFtZSk7Ci0gICAgIFJlbGVhc2luZyB0aGUgbG9jazogIGdsX3J3bG9ja191bmxvY2sgKG5hbWUpOwotICAgICBEZS1pbml0aWFsaXphdGlvbjogICBnbF9yd2xvY2tfZGVzdHJveSAobmFtZSk7Ci0KLSAgIFJlY3Vyc2l2ZSBsb2NrczoKLSAgICAgVHlwZTogICAgICAgICAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdAotICAgICBEZWNsYXJhdGlvbjogICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoZXh0ZXJuLCBuYW1lKQotICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoLCBuYW1lKQotICAgICBJbml0aWFsaXphdGlvbjogICAgICBnbF9yZWN1cnNpdmVfbG9ja19pbml0IChuYW1lKTsKLSAgICAgVGFraW5nIHRoZSBsb2NrOiAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayAobmFtZSk7Ci0gICAgIFJlbGVhc2luZyB0aGUgbG9jazogIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAobmFtZSk7Ci0gICAgIERlLWluaXRpYWxpemF0aW9uOiAgIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKG5hbWUpOwotCi0gIE9uY2Utb25seSBleGVjdXRpb246Ci0gICAgIFR5cGU6ICAgICAgICAgICAgICAgIGdsX29uY2VfdAotICAgICBJbml0aWFsaXplcjogICAgICAgICBnbF9vbmNlX2RlZmluZShleHRlcm4sIG5hbWUpCi0gICAgIEV4ZWN1dGlvbjogICAgICAgICAgIGdsX29uY2UgKG5hbWUsIGluaXRmdW5jdGlvbik7Ci0qLwotCi0KLSNpZm5kZWYgX0xPQ0tfSAotI2RlZmluZSBfTE9DS19ICi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIFVTRV9QT1NJWF9USFJFQURTCi0KLS8qIFVzZSB0aGUgUE9TSVggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLQotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotCi0jIGlmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSMgZW5kaWYKLQotIyBpZiBQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotCi0vKiBUaGUgcHRocmVhZF9pbl91c2UoKSBkZXRlY3Rpb24gbmVlZHMgdG8gYmUgZG9uZSBhdCBydW50aW1lLiAgKi8KLSMgIGRlZmluZSBwdGhyZWFkX2luX3VzZSgpIFwKLSAgICAgZ2x0aHJlYWRfaW5fdXNlICgpCi1leHRlcm4gaW50IGdsdGhyZWFkX2luX3VzZSAodm9pZCk7Ci0KLSMgZW5kaWYKLQotIyBpZiBVU0VfUE9TSVhfVEhSRUFEU19XRUFLCi0KLS8qIFVzZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIFBPU0lYIHRocmVhZHMgbGlicmFyeS4gICovCi0KLS8qIFdlYWsgcmVmZXJlbmNlcyBhdm9pZCBkcmFnZ2luZyBpbiBleHRlcm5hbCBsaWJyYXJpZXMgaWYgdGhlIG90aGVyIHBhcnRzCi0gICBvZiB0aGUgcHJvZ3JhbSBkb24ndCB1c2UgdGhlbS4gIEhlcmUgd2UgdXNlIHRoZW0sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgZXZlcnkgcHJvZ3JhbSB0aGF0IHVzZXMgbGliaW50bCB0byBkZXBlbmQgb24gbGlicHRocmVhZC4gIFRoaXMgYXNzdW1lcwotICAgdGhhdCBsaWJwdGhyZWFkIHdvdWxkIG5vdCBiZSBsb2FkZWQgYWZ0ZXIgbGliaW50bDsgaS5lLiBpZiBsaWJpbnRsIGlzCi0gICBsb2FkZWQgZmlyc3QsIGJ5IGFuIGV4ZWN1dGFibGUgdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gbGlicHRocmVhZCwgYW5kCi0gICB0aGVuIGEgbW9kdWxlIGlzIGR5bmFtaWNhbGx5IGxvYWRlZCB0aGF0IGRlcGVuZHMgb24gbGlicHRocmVhZCwgbGliaW50bAotICAgd2lsbCBub3QgYmUgbXVsdGl0aHJlYWQtc2FmZS4gICovCi0KLS8qIFRoZSB3YXkgdG8gdGVzdCBhdCBydW50aW1lIHdoZXRoZXIgbGlicHRocmVhZCBpcyBwcmVzZW50IGlzIHRvIHRlc3QKLSAgIHdoZXRoZXIgYSBmdW5jdGlvbiBwb2ludGVyJ3MgdmFsdWUsIHN1Y2ggYXMgJnB0aHJlYWRfbXV0ZXhfaW5pdCwgaXMKLSAgIG5vbi1OVUxMLiAgSG93ZXZlciwgc29tZSB2ZXJzaW9ucyBvZiBHQ0MgaGF2ZSBhIGJ1ZyB0aHJvdWdoIHdoaWNoLCBpbgotICAgUElDIG1vZGUsICZmb28gIT0gTlVMTCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWUgaWYgdGhlcmUgaXMgYSBkaXJlY3QKLSAgIGNhbGwgdG8gZm9vKC4uLikgaW4gdGhlIHNhbWUgZnVuY3Rpb24uICBUbyBhdm9pZCB0aGlzLCB3ZSB0ZXN0IHRoZQotICAgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIGluIGxpYnB0aHJlYWQgdGhhdCB3ZSBkb24ndCB1c2UuICAqLwotCi0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4X2luaXQKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfbG9jawotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9tdXRleF91bmxvY2sKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfbXV0ZXhfZGVzdHJveQotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfaW5pdAotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfcmRsb2NrCi0jICBwcmFnbWEgd2VhayBwdGhyZWFkX3J3bG9ja193cmxvY2sKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfcndsb2NrX3VubG9jawotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9yd2xvY2tfZGVzdHJveQotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9vbmNlCi0jICBwcmFnbWEgd2VhayBwdGhyZWFkX2NvbmRfaW5pdAotIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9jb25kX3dhaXQKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9zaWduYWwKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9icm9hZGNhc3QKLSMgIHByYWdtYSB3ZWFrIHB0aHJlYWRfY29uZF9kZXN0cm95Ci0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4YXR0cl9pbml0Ci0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlCi0jICBwcmFnbWEgd2VhayBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95Ci0jICBpZm5kZWYgcHRocmVhZF9zZWxmCi0jICAgcHJhZ21hIHdlYWsgcHRocmVhZF9zZWxmCi0jICBlbmRpZgotCi0jICBpZiAhUFRIUkVBRF9JTl9VU0VfREVURUNUSU9OX0hBUkQKLSMgICBwcmFnbWEgd2VhayBwdGhyZWFkX2NhbmNlbAotIyAgIGRlZmluZSBwdGhyZWFkX2luX3VzZSgpIChwdGhyZWFkX2NhbmNlbCAhPSBOVUxMKQotIyAgZW5kaWYKLQotIyBlbHNlCi0KLSMgIGlmICFQVEhSRUFEX0lOX1VTRV9ERVRFQ1RJT05fSEFSRAotIyAgIGRlZmluZSBwdGhyZWFkX2luX3VzZSgpIDEKLSMgIGVuZGlmCi0KLSMgZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgcHRocmVhZF9tdXRleF90IGdsX2xvY2tfdDsKLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX211dGV4X3QgTkFNRTsKLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX211dGV4X3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9sb2NrX2luaXRpYWxpemVyIFwKLSAgICBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCi0jIGRlZmluZSBnbF9sb2NrX2luaXQoTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9pbml0ICgmTkFNRSwgTlVMTCkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotIyBkZWZpbmUgZ2xfbG9ja19sb2NrKE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfbG9jayAoJk5BTUUpICE9IDApIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X3VubG9jayAoJk5BTUUpICE9IDApIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9kZXN0cm95ICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3J3bG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotIyBpZiBIQVZFX1BUSFJFQURfUldMT0NLCi0KLSMgIGlmZGVmIFBUSFJFQURfUldMT0NLX0lOSVRJQUxJWkVSCi0KLXR5cGVkZWYgcHRocmVhZF9yd2xvY2tfdCBnbF9yd2xvY2tfdDsKLSMgICBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICAgIFNUT1JBR0VDTEFTUyBwdGhyZWFkX3J3bG9ja190IE5BTUU7Ci0jICAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9yd2xvY2tfdCBOQU1FID0gZ2xfcndsb2NrX2luaXRpYWxpemVyOwotIyAgIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgICAgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIKLSMgICBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja19pbml0ICgmTkFNRSwgTlVMTCkgIT0gMCkgXAotICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0jICAgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9yd2xvY2tfcmRsb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlICgwKQotIyAgIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpICE9IDApIFwKLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLSMgICBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX3J3bG9ja191bmxvY2sgKCZOQU1FKSAhPSAwKSBcCi0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0jICAgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpICE9IDApIFwKLSAgICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlICgwKQotCi0jICBlbHNlCi0KLXR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgaW5pdGlhbGl6ZWQ7Ci0gICAgICAgICAgcHRocmVhZF9tdXRleF90IGd1YXJkOyAgIC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotICAgICAgICAgIHB0aHJlYWRfcndsb2NrX3Qgcndsb2NrOyAvKiByZWFkLXdyaXRlIGxvY2sgKi8KLSAgICAgICAgfQotICAgICAgICBnbF9yd2xvY2tfdDsKLSMgICBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICAgIFNUT1JBR0VDTEFTUyBnbF9yd2xvY2tfdCBOQU1FOwotIyAgIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICAgU1RPUkFHRUNMQVNTIGdsX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0jICAgZGVmaW5lIGdsX3J3bG9ja19pbml0aWFsaXplciBcCi0gICAgICB7IDAsIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgfQotIyAgIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICBcCi0gICAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfaW5pdCAoJk5BTUUpOyBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLSMgICBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0gICAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfcmRsb2NrICgmTkFNRSk7IFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0jICAgZGVmaW5lIGdsX3J3bG9ja193cmxvY2soTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgXAotICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpOyBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlICgwKQotIyAgIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKCZOQU1FKTsgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLSMgICBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgXAotICAgICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKCZOQU1FKTsgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfaW5pdCAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKTsKLQotIyAgZW5kaWYKLQotIyBlbHNlCi0KLXR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbG9jazsgLyogcHJvdGVjdHMgdGhlIHJlbWFpbmluZyBmaWVsZHMgKi8KLSAgICAgICAgICBwdGhyZWFkX2NvbmRfdCB3YWl0aW5nX3JlYWRlcnM7IC8qIHdhaXRpbmcgcmVhZGVycyAqLwotICAgICAgICAgIHB0aHJlYWRfY29uZF90IHdhaXRpbmdfd3JpdGVyczsgLyogd2FpdGluZyB3cml0ZXJzICovCi0gICAgICAgICAgdW5zaWduZWQgaW50IHdhaXRpbmdfd3JpdGVyc19jb3VudDsgLyogbnVtYmVyIG9mIHdhaXRpbmcgd3JpdGVycyAqLwotICAgICAgICAgIGludCBydW5jb3VudDsgLyogbnVtYmVyIG9mIHJlYWRlcnMgcnVubmluZywgb3IgLTEgd2hlbiBhIHdyaXRlciBydW5zICovCi0gICAgICAgIH0KLSAgICAgICAgZ2xfcndsb2NrX3Q7Ci0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBnbF9yd2xvY2tfdCBOQU1FOwotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLSMgZGVmaW5lIGdsX3J3bG9ja19pbml0aWFsaXplciBcCi0gICAgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSLCBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVIsIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwgMCwgMCB9Ci0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKSBcCi0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICBcCi0gICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX2luaXQgKCZOQU1FKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgXAotICAgICAgICAgIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpOyBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfdW5sb2NrICgmTkFNRSk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpOyBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2luaXQgKGdsX3J3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja193cmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja191bmxvY2sgKGdsX3J3bG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3J3bG9ja19kZXN0cm95IChnbF9yd2xvY2tfdCAqbG9jayk7Ci0KLSMgZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSMgaWYgSEFWRV9QVEhSRUFEX01VVEVYX1JFQ1VSU0lWRQotCi0jICBpZiBkZWZpbmVkIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSIHx8IGRlZmluZWQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKLQotdHlwZWRlZiBwdGhyZWFkX211dGV4X3QgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICAgU1RPUkFHRUNMQVNTIHB0aHJlYWRfbXV0ZXhfdCBOQU1FOwotIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9tdXRleF90IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLSMgICBpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUgotIyAgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgICAgIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCi0jICAgZWxzZQotIyAgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgICAgIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCi0jICAgZW5kaWYKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X2luaXQgKCZOQU1FLCBOVUxMKSAhPSAwKSBcCi0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkgJiYgcHRocmVhZF9tdXRleF9sb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlICgwKQotIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpICYmIHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVzdHJveShOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSAmJiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCZOQU1FKSAhPSAwKSBcCi0gICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0KLSMgIGVsc2UKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCByZWNtdXRleDsgLyogcmVjdXJzaXZlIG11dGV4ICovCi0gICAgICAgICAgcHRocmVhZF9tdXRleF90IGd1YXJkOyAgICAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgICBpbnQgaW5pdGlhbGl6ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRTsKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRSA9IGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXRpYWxpemVyOwotIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0gICAgICB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIDAgfQotIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKCZOQU1FKTsgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLSMgICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayhOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmIChwdGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSk7IFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgd2hpbGUgKDApCi0jICAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKSBcCi0gICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKCZOQU1FKTsgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlICgwKQotIyAgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKCZOQU1FKTsgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB3aGlsZSAoMCkKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0KLSMgIGVuZGlmCi0KLSMgZWxzZQotCi0vKiBPbGQgdmVyc2lvbnMgb2YgUE9TSVggdGhyZWFkcyBvbiBTb2xhcmlzIGRpZCBub3QgaGF2ZSByZWN1cnNpdmUgbG9ja3MuCi0gICBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGVtIG91cnNlbHZlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0gICAgICAgICAgcHRocmVhZF90IG93bmVyOwotICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVwdGg7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgIFNUT1JBR0VDTEFTUyBnbF9yZWN1cnNpdmVfbG9ja190IE5BTUU7Ci0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgICB7IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsIChwdGhyZWFkX3QpIDAsIDAgfQotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2luaXQoTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSk7IFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSk7IFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKSBcCi0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoJk5BTUUpOyBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLQotIyBlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBwdGhyZWFkX29uY2VfdCBnbF9vbmNlX3Q7Ci0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRSA9IFBUSFJFQURfT05DRV9JTklUOwotIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmIChwdGhyZWFkX29uY2UgKCZOQU1FLCBJTklURlVOQ1RJT04pICE9IDApIFwKLSAgICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmIChnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkICgmTkFNRSkpICAgIFwKLSAgICAgICAgICAgICAgSU5JVEZVTkNUSU9OICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLWV4dGVybiBpbnQgZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCk7Ci0KLSMgaWZkZWYgX19jcGx1c3BsdXMKLX0KLSMgZW5kaWYKLQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmIFVTRV9QVEhfVEhSRUFEUwotCi0vKiBVc2UgdGhlIEdOVSBQdGggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLQotIyBpbmNsdWRlIDxwdGguaD4KLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSMgaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotIyBlbmRpZgotCi0jIGlmIFVTRV9QVEhfVEhSRUFEU19XRUFLCi0KLS8qIFVzZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIEdOVSBQdGggdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLQotIyAgcHJhZ21hIHdlYWsgcHRoX211dGV4X2luaXQKLSMgIHByYWdtYSB3ZWFrIHB0aF9tdXRleF9hY3F1aXJlCi0jICBwcmFnbWEgd2VhayBwdGhfbXV0ZXhfcmVsZWFzZQotIyAgcHJhZ21hIHdlYWsgcHRoX3J3bG9ja19pbml0Ci0jICBwcmFnbWEgd2VhayBwdGhfcndsb2NrX2FjcXVpcmUKLSMgIHByYWdtYSB3ZWFrIHB0aF9yd2xvY2tfcmVsZWFzZQotIyAgcHJhZ21hIHdlYWsgcHRoX29uY2UKLQotIyAgcHJhZ21hIHdlYWsgcHRoX2NhbmNlbAotIyAgZGVmaW5lIHB0aF9pbl91c2UoKSAocHRoX2NhbmNlbCAhPSBOVUxMKQotCi0jIGVsc2UKLQotIyAgZGVmaW5lIHB0aF9pbl91c2UoKSAxCi0KLSMgZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgcHRoX211dGV4X3QgZ2xfbG9ja190OwotIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgU1RPUkFHRUNMQVNTIHB0aF9tdXRleF90IE5BTUU7Ci0jIGRlZmluZSBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgcHRoX211dGV4X3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9sb2NrX2luaXRpYWxpemVyIFwKLSAgICBQVEhfTVVURVhfSU5JVAotIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9pbml0ICgmTkFNRSkpIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X2FjcXVpcmUgKCZOQU1FLCAwLCBOVUxMKSkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9tdXRleF9yZWxlYXNlICgmTkFNRSkpIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgICh2b2lkKSgmTkFNRSkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yd2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgcHRoX3J3bG9ja190IGdsX3J3bG9ja190OwotIyAgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgIFNUT1JBR0VDTEFTUyBwdGhfcndsb2NrX3QgTkFNRTsKLSMgIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgICBTVE9SQUdFQ0xBU1MgcHRoX3J3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0jICBkZWZpbmUgZ2xfcndsb2NrX2luaXRpYWxpemVyIFwKLSAgICAgUFRIX1JXTE9DS19JTklUCi0jICBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfcndsb2NrX2luaXQgKCZOQU1FKSkgXAotICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotIyAgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmICFwdGhfcndsb2NrX2FjcXVpcmUgKCZOQU1FLCBQVEhfUldMT0NLX1JELCAwLCBOVUxMKSkgXAotICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB3aGlsZSAoMCkKLSMgIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKLSAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiAhcHRoX3J3bG9ja19hY3F1aXJlICgmTkFNRSwgUFRIX1JXTE9DS19SVywgMCwgTlVMTCkpIFwKLSAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgd2hpbGUgKDApCi0jICBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKSBcCi0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGlmIChwdGhfaW5fdXNlKCkgJiYgIXB0aF9yd2xvY2tfcmVsZWFzZSAoJk5BTUUpKSBcCi0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgd2hpbGUgKDApCi0jICBkZWZpbmUgZ2xfcndsb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgICAodm9pZCkoJk5BTUUpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9yZWN1cnNpdmVfbG9ja190IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJbiBQdGgsIG11dGV4ZXMgYXJlIHJlY3Vyc2l2ZSBieSBkZWZhdWx0LiAgKi8KLXR5cGVkZWYgcHRoX211dGV4X3QgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgIFNUT1JBR0VDTEFTUyBwdGhfbXV0ZXhfdCBOQU1FOwotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICAgU1RPUkFHRUNMQVNTIHB0aF9tdXRleF90IE5BTUUgPSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplcjsKLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0gICAgIFBUSF9NVVRFWF9JTklUCi0jICBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0gICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBpZiAocHRoX2luX3VzZSgpICYmICFwdGhfbXV0ZXhfaW5pdCAoJk5BTUUpKSBcCi0gICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHdoaWxlICgwKQotIyAgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X2FjcXVpcmUgKCZOQU1FLCAwLCBOVUxMKSkgXAotICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB3aGlsZSAoMCkKLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja191bmxvY2soTkFNRSkgXAotICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgaWYgKHB0aF9pbl91c2UoKSAmJiAhcHRoX211dGV4X3JlbGVhc2UgKCZOQU1FKSkgXAotICAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB3aGlsZSAoMCkKLSMgIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICAgKHZvaWQpKCZOQU1FKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9vbmNlX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBwdGhfb25jZV90IGdsX29uY2VfdDsKLSMgZGVmaW5lIGdsX29uY2VfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBwdGhfb25jZV90IE5BTUUgPSBQVEhfT05DRV9JTklUOwotIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAocHRoX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB2b2lkICgqZ2xfb25jZV90ZW1wKSAodm9pZCkgPSBJTklURlVOQ1RJT047ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCFwdGhfb25jZSAoJk5BTUUsIGdsdGhyZWFkX29uY2VfY2FsbCwgJmdsX29uY2VfdGVtcCkpIFwKLSAgICAgICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoZ2x0aHJlYWRfb25jZV9zaW5nbGV0aHJlYWRlZCAoJk5BTUUpKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBJTklURlVOQ1RJT04gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfb25jZV9jYWxsICh2b2lkICphcmcpOwotZXh0ZXJuIGludCBnbHRocmVhZF9vbmNlX3NpbmdsZXRocmVhZGVkIChwdGhfb25jZV90ICpvbmNlX2NvbnRyb2wpOwotCi0jIGlmZGVmIF9fY3BsdXNwbHVzCi19Ci0jIGVuZGlmCi0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiBVU0VfU09MQVJJU19USFJFQURTCi0KLS8qIFVzZSB0aGUgb2xkIFNvbGFyaXMgdGhyZWFkcyBsaWJyYXJ5LiAgKi8KLQotIyBpbmNsdWRlIDx0aHJlYWQuaD4KLSMgaW5jbHVkZSA8c3luY2guaD4KLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSMgaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotIyBlbmRpZgotCi0jIGlmIFVTRV9TT0xBUklTX1RIUkVBRFNfV0VBSwotCi0vKiBVc2Ugd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvbGQgU29sYXJpcyB0aHJlYWRzIGxpYnJhcnkuICAqLwotCi0jICBwcmFnbWEgd2VhayBtdXRleF9pbml0Ci0jICBwcmFnbWEgd2VhayBtdXRleF9sb2NrCi0jICBwcmFnbWEgd2VhayBtdXRleF91bmxvY2sKLSMgIHByYWdtYSB3ZWFrIG11dGV4X2Rlc3Ryb3kKLSMgIHByYWdtYSB3ZWFrIHJ3bG9ja19pbml0Ci0jICBwcmFnbWEgd2VhayByd19yZGxvY2sKLSMgIHByYWdtYSB3ZWFrIHJ3X3dybG9jawotIyAgcHJhZ21hIHdlYWsgcndfdW5sb2NrCi0jICBwcmFnbWEgd2VhayByd2xvY2tfZGVzdHJveQotIyAgcHJhZ21hIHdlYWsgdGhyX3NlbGYKLQotIyAgcHJhZ21hIHdlYWsgdGhyX3N1c3BlbmQKLSMgIGRlZmluZSB0aHJlYWRfaW5fdXNlKCkgKHRocl9zdXNwZW5kICE9IE5VTEwpCi0KLSMgZWxzZQotCi0jICBkZWZpbmUgdGhyZWFkX2luX3VzZSgpIDEKLQotIyBlbmRpZgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBtdXRleF90IGdsX2xvY2tfdDsKLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBtdXRleF90IE5BTUU7Ci0jIGRlZmluZSBnbF9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgbXV0ZXhfdCBOQU1FID0gZ2xfbG9ja19pbml0aWFsaXplcjsKLSMgZGVmaW5lIGdsX2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgIERFRkFVTFRNVVRFWAotIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIG11dGV4X2luaXQgKCZOQU1FLCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiBtdXRleF9sb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotIyBkZWZpbmUgZ2xfbG9ja191bmxvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgbXV0ZXhfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX2xvY2tfZGVzdHJveShOQU1FKSBcCi0gICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpICYmIG11dGV4X2Rlc3Ryb3kgKCZOQU1FKSAhPSAwKSBcCi0gICAgICAgICAgYWJvcnQgKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIHJ3bG9ja190IGdsX3J3bG9ja190OwotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1Mgcndsb2NrX3QgTkFNRTsKLSMgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgU1RPUkFHRUNMQVNTIHJ3bG9ja190IE5BTUUgPSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdGlhbGl6ZXIgXAotICAgIERFRkFVTFRSV0xPQ0sKLSMgZGVmaW5lIGdsX3J3bG9ja19pbml0KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndsb2NrX2luaXQgKCZOQU1FLCBVU1lOQ19USFJFQUQsIE5VTEwpICE9IDApIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndfcmRsb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja193cmxvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndfd3Jsb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja191bmxvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkgJiYgcndfdW5sb2NrICgmTkFNRSkgIT0gMCkgXAotICAgICAgICAgIGFib3J0ICgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSAmJiByd2xvY2tfZGVzdHJveSAoJk5BTUUpICE9IDApIFwKLSAgICAgICAgICBhYm9ydCAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogT2xkIFNvbGFyaXMgdGhyZWFkcyBkaWQgbm90IGhhdmUgcmVjdXJzaXZlIGxvY2tzLgotICAgV2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlbSBvdXJzZWx2ZXMuICAqLwotCi10eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgICAgbXV0ZXhfdCBtdXRleDsKLSAgICAgICAgICB0aHJlYWRfdCBvd25lcjsKLSAgICAgICAgICB1bnNpZ25lZCBsb25nIGRlcHRoOwotICAgICAgICB9Ci0gICAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRTsKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0gICAgeyBERUZBVUxUTVVURVgsICh0aHJlYWRfdCkgMCwgMCB9Ci0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19pbml0ICgmTkFNRSk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2xvY2soTkFNRSkgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2xvY2sgKCZOQU1FKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh0aHJlYWRfaW5fdXNlICgpKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKCZOQU1FKTsgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHRocmVhZF9pbl91c2UgKCkpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95ICgmTkFNRSk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAoMCkKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2luaXQgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfbG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja191bmxvY2sgKGdsX3JlY3Vyc2l2ZV9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfZGVzdHJveSAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgICAgdm9sYXRpbGUgaW50IGluaXRlZDsKLSAgICAgICAgICBtdXRleF90IG11dGV4OwotICAgICAgICB9Ci0gICAgICAgIGdsX29uY2VfdDsKLSMgZGVmaW5lIGdsX29uY2VfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBnbF9vbmNlX3QgTkFNRSA9IHsgMCwgREVGQVVMVE1VVEVYIH07Ci0jIGRlZmluZSBnbF9vbmNlKE5BTUUsIElOSVRGVU5DVElPTikgXAotICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAodGhyZWFkX2luX3VzZSAoKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZ2x0aHJlYWRfb25jZSAoJk5BTUUsIElOSVRGVU5DVElPTik7ICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKCZOQU1FKSkgXAotICAgICAgICAgICAgICBJTklURlVOQ1RJT04gKCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgwKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfb25jZSAoZ2xfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0ZnVuY3Rpb24pICh2b2lkKSk7Ci1leHRlcm4gaW50IGdsdGhyZWFkX29uY2Vfc2luZ2xldGhyZWFkZWQgKGdsX29uY2VfdCAqb25jZV9jb250cm9sKTsKLQotIyBpZmRlZiBfX2NwbHVzcGx1cwotfQotIyBlbmRpZgotCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jaWYgVVNFX1dJTjMyX1RIUkVBRFMKLQotIyBpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSMgaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotIyBlbmRpZgotCi0vKiBXZSBjYW4gdXNlIENSSVRJQ0FMX1NFQ1RJT04gZGlyZWN0bHksIHJhdGhlciB0aGFuIHRoZSBXaW4zMiBFdmVudCwgTXV0ZXgsCi0gICBTZW1hcGhvcmUgdHlwZXMsIGJlY2F1c2UKLSAgICAgLSB3ZSBuZWVkIG9ubHkgdG8gc3luY2hyb25pemUgaW5zaWRlIGEgc2luZ2xlIHByb2Nlc3MgKGFkZHJlc3Mgc3BhY2UpLAotICAgICAgIG5vdCBpbnRlci1wcm9jZXNzIGxvY2tpbmcsCi0gICAgIC0gd2UgZG9uJ3QgbmVlZCB0byBzdXBwb3J0IHRyeWxvY2sgb3BlcmF0aW9ucy4gIChUcnlFbnRlckNyaXRpY2FsU2VjdGlvbgotICAgICAgIGRvZXMgbm90IHdvcmsgb24gV2luZG93cyA5NS85OC9NRS4gIFBhY2thZ2VzIHRoYXQgbmVlZCB0cnlsb2NrIHVzdWFsbHkKLSAgICAgICBkZWZpbmUgdGhlaXIgb3duIG11dGV4IHR5cGUuKSAgKi8KLQotLyogVGhlcmUgaXMgbm8gd2F5IHRvIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBhIENSSVRJQ0FMX1NFQ1RJT04uICBJdCBuZWVkcwotICAgdG8gYmUgZG9uZSBsYXppbHksIG9uY2Ugb25seS4gIEZvciB0aGlzIHdlIG5lZWQgc3BpbmxvY2tzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgZG9uZTsgdm9sYXRpbGUgbG9uZyBzdGFydGVkOyB9IGdsX3NwaW5sb2NrX3Q7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgICAgZ2xfc3BpbmxvY2tfdCBndWFyZDsgLyogcHJvdGVjdHMgdGhlIGluaXRpYWxpemF0aW9uICovCi0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotICAgICAgICB9Ci0gICAgICAgIGdsX2xvY2tfdDsKLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBnbF9sb2NrX3QgTkFNRTsKLSMgZGVmaW5lIGdsX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBnbF9sb2NrX3QgTkFNRSA9IGdsX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9sb2NrX2luaXRpYWxpemVyIFwKLSAgICB7IHsgMCwgLTEgfSB9Ci0jIGRlZmluZSBnbF9sb2NrX2luaXQoTkFNRSkgXAotICAgIGdsdGhyZWFkX2xvY2tfaW5pdCAoJk5BTUUpCi0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkgXAotICAgIGdsdGhyZWFkX2xvY2tfbG9jayAoJk5BTUUpCi0jIGRlZmluZSBnbF9sb2NrX3VubG9jayhOQU1FKSBcCi0gICAgZ2x0aHJlYWRfbG9ja191bmxvY2sgKCZOQU1FKQotIyBkZWZpbmUgZ2xfbG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICBnbHRocmVhZF9sb2NrX2Rlc3Ryb3kgKCZOQU1FKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfbG9ja19pbml0IChnbF9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfbG9ja19sb2NrIChnbF9sb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfbG9ja191bmxvY2sgKGdsX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9sb2NrX2Rlc3Ryb3kgKGdsX2xvY2tfdCAqbG9jayk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJdCBpcyBpbXBvc3NpYmxlIHRvIGltcGxlbWVudCByZWFkLXdyaXRlIGxvY2tzIHVzaW5nIHBsYWluIGxvY2tzLCB3aXRob3V0Ci0gICBpbnRyb2R1Y2luZyBhbiBleHRyYSB0aHJlYWQgZGVkaWNhdGVkIHRvIG1hbmFnaW5nIHJlYWQtd3JpdGUgbG9ja3MuCi0gICBUaGVyZWZvcmUgaGVyZSB3ZSBuZWVkIHRvIHVzZSB0aGUgbG93LWxldmVsIEV2ZW50IHR5cGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgICAgSEFORExFICphcnJheTsgLyogYXJyYXkgb2Ygd2FpdGluZyB0aHJlYWRzLCBlYWNoIHJlcHJlc2VudGVkIGJ5IGFuIGV2ZW50ICovCi0gICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50OyAvKiBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzICovCi0gICAgICAgICAgdW5zaWduZWQgaW50IGFsbG9jOyAvKiBsZW5ndGggb2YgYWxsb2NhdGVkIGFycmF5ICovCi0gICAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsgLyogaW5kZXggb2YgZmlyc3Qgd2FpdGluZyB0aHJlYWQgaW4gYXJyYXkgKi8KLSAgICAgICAgfQotICAgICAgICBnbF93YWl0cXVldWVfdDsKLXR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICBnbF9zcGlubG9ja190IGd1YXJkOyAvKiBwcm90ZWN0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7IC8qIHByb3RlY3RzIHRoZSByZW1haW5pbmcgZmllbGRzICovCi0gICAgICAgICAgZ2xfd2FpdHF1ZXVlX3Qgd2FpdGluZ19yZWFkZXJzOyAvKiB3YWl0aW5nIHJlYWRlcnMgKi8KLSAgICAgICAgICBnbF93YWl0cXVldWVfdCB3YWl0aW5nX3dyaXRlcnM7IC8qIHdhaXRpbmcgd3JpdGVycyAqLwotICAgICAgICAgIGludCBydW5jb3VudDsgLyogbnVtYmVyIG9mIHJlYWRlcnMgcnVubmluZywgb3IgLTEgd2hlbiBhIHdyaXRlciBydW5zICovCi0gICAgICAgIH0KLSAgICAgICAgZ2xfcndsb2NrX3Q7Ci0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lKFNUT1JBR0VDTEFTUywgTkFNRSkgXAotICAgIFNUT1JBR0VDTEFTUyBnbF9yd2xvY2tfdCBOQU1FOwotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcndsb2NrX3QgTkFNRSA9IGdsX3J3bG9ja19pbml0aWFsaXplcjsKLSMgZGVmaW5lIGdsX3J3bG9ja19pbml0aWFsaXplciBcCi0gICAgeyB7IDAsIC0xIH0gfQotIyBkZWZpbmUgZ2xfcndsb2NrX2luaXQoTkFNRSkgXAotICAgIGdsdGhyZWFkX3J3bG9ja19pbml0ICgmTkFNRSkKLSMgZGVmaW5lIGdsX3J3bG9ja19yZGxvY2soTkFNRSkgXAotICAgIGdsdGhyZWFkX3J3bG9ja19yZGxvY2sgKCZOQU1FKQotIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKSBcCi0gICAgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoJk5BTUUpCi0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrKE5BTUUpIFwKLSAgICBnbHRocmVhZF9yd2xvY2tfdW5sb2NrICgmTkFNRSkKLSMgZGVmaW5lIGdsX3J3bG9ja19kZXN0cm95KE5BTUUpIFwKLSAgICBnbHRocmVhZF9yd2xvY2tfZGVzdHJveSAoJk5BTUUpCi1leHRlcm4gdm9pZCBnbHRocmVhZF9yd2xvY2tfaW5pdCAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3JkbG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3dybG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX3VubG9jayAoZ2xfcndsb2NrX3QgKmxvY2spOwotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKGdsX3J3bG9ja190ICpsb2NrKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFRoZSBXaW4zMiBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBDUklUSUNBTF9TRUNUSU9OIGFscmVhZHkgaW1wbGVtZW50cyBhCi0gICByZWN1cnNpdmUgbG9jay4gIEJ1dCB3ZSBuZWVkIG5vdCByZWx5IG9uIGl0OiBJdCdzIGVhc3kgdG8gaW1wbGVtZW50IGEKLSAgIHJlY3Vyc2l2ZSBsb2NrIHdpdGhvdXQgdGhpcyBhc3N1bXB0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICAgIGdsX3NwaW5sb2NrX3QgZ3VhcmQ7IC8qIHByb3RlY3RzIHRoZSBpbml0aWFsaXphdGlvbiAqLwotICAgICAgICAgIERXT1JEIG93bmVyOwotICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVwdGg7Ci0gICAgICAgICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotICAgICAgICB9Ci0gICAgICAgIGdsX3JlY3Vyc2l2ZV9sb2NrX3Q7Ci0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgU1RPUkFHRUNMQVNTIGdsX3JlY3Vyc2l2ZV9sb2NrX3QgTkFNRTsKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgZ2xfcmVjdXJzaXZlX2xvY2tfdCBOQU1FID0gZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdGlhbGl6ZXI7Ci0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19pbml0aWFsaXplciBcCi0gICAgeyB7IDAsIC0xIH0sIDAsIDAgfQotIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKSBcCi0gICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoJk5BTUUpCi0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19sb2NrKE5BTUUpIFwKLSAgICBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrICgmTkFNRSkKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayhOQU1FKSBcCi0gICAgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfdW5sb2NrICgmTkFNRSkKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3koTkFNRSkgXAotICAgIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX2Rlc3Ryb3kgKCZOQU1FKQotZXh0ZXJuIHZvaWQgZ2x0aHJlYWRfcmVjdXJzaXZlX2xvY2tfaW5pdCAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19sb2NrIChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLWV4dGVybiB2b2lkIGdsdGhyZWFkX3JlY3Vyc2l2ZV9sb2NrX3VubG9jayAoZ2xfcmVjdXJzaXZlX2xvY2tfdCAqbG9jayk7Ci1leHRlcm4gdm9pZCBnbHRocmVhZF9yZWN1cnNpdmVfbG9ja19kZXN0cm95IChnbF9yZWN1cnNpdmVfbG9ja190ICpsb2NrKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfb25jZV90IGRhdGF0eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICB2b2xhdGlsZSBpbnQgaW5pdGVkOwotICAgICAgICAgIHZvbGF0aWxlIGxvbmcgc3RhcnRlZDsKLSAgICAgICAgICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7Ci0gICAgICAgIH0KLSAgICAgICAgZ2xfb25jZV90OwotIyBkZWZpbmUgZ2xfb25jZV9kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKSBcCi0gICAgU1RPUkFHRUNMQVNTIGdsX29uY2VfdCBOQU1FID0geyAtMSwgLTEgfTsKLSMgZGVmaW5lIGdsX29uY2UoTkFNRSwgSU5JVEZVTkNUSU9OKSBcCi0gICAgZ2x0aHJlYWRfb25jZSAoJk5BTUUsIElOSVRGVU5DVElPTikKLWV4dGVybiB2b2lkIGdsdGhyZWFkX29uY2UgKGdsX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdGZ1bmN0aW9uKSAodm9pZCkpOwotCi0jIGlmZGVmIF9fY3BsdXNwbHVzCi19Ci0jIGVuZGlmCi0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiAhKFVTRV9QT1NJWF9USFJFQURTIHx8IFVTRV9QVEhfVEhSRUFEUyB8fCBVU0VfU09MQVJJU19USFJFQURTIHx8IFVTRV9XSU4zMl9USFJFQURTKQotCi0vKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRocmVhZHMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnbF9sb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBpbnQgZ2xfbG9ja190OwotIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKQotIyBkZWZpbmUgZ2xfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKQotIyBkZWZpbmUgZ2xfbG9ja19pbml0KE5BTUUpCi0jIGRlZmluZSBnbF9sb2NrX2xvY2soTkFNRSkKLSMgZGVmaW5lIGdsX2xvY2tfdW5sb2NrKE5BTUUpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcndsb2NrX3QgZGF0YXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIGludCBnbF9yd2xvY2tfdDsKLSMgZGVmaW5lIGdsX3J3bG9ja19kZWZpbmUoU1RPUkFHRUNMQVNTLCBOQU1FKQotIyBkZWZpbmUgZ2xfcndsb2NrX2RlZmluZV9pbml0aWFsaXplZChTVE9SQUdFQ0xBU1MsIE5BTUUpCi0jIGRlZmluZSBnbF9yd2xvY2tfaW5pdChOQU1FKQotIyBkZWZpbmUgZ2xfcndsb2NrX3JkbG9jayhOQU1FKQotIyBkZWZpbmUgZ2xfcndsb2NrX3dybG9jayhOQU1FKQotIyBkZWZpbmUgZ2xfcndsb2NrX3VubG9jayhOQU1FKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xfcmVjdXJzaXZlX2xvY2tfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdHlwZWRlZiBpbnQgZ2xfcmVjdXJzaXZlX2xvY2tfdDsKLSMgZGVmaW5lIGdsX3JlY3Vyc2l2ZV9sb2NrX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpCi0jIGRlZmluZSBnbF9yZWN1cnNpdmVfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoU1RPUkFHRUNMQVNTLCBOQU1FKQotIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfaW5pdChOQU1FKQotIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfbG9jayhOQU1FKQotIyBkZWZpbmUgZ2xfcmVjdXJzaXZlX2xvY2tfdW5sb2NrKE5BTUUpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdsX29uY2VfdCBkYXRhdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi10eXBlZGVmIGludCBnbF9vbmNlX3Q7Ci0jIGRlZmluZSBnbF9vbmNlX2RlZmluZShTVE9SQUdFQ0xBU1MsIE5BTUUpIFwKLSAgICBTVE9SQUdFQ0xBU1MgZ2xfb25jZV90IE5BTUUgPSAwOwotIyBkZWZpbmUgZ2xfb25jZShOQU1FLCBJTklURlVOQ1RJT04pIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChOQU1FID09IDApICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTkFNRSA9IH4gMDsgICAgICBcCi0gICAgICAgICAgICBJTklURlVOQ1RJT04gKCk7IFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgd2hpbGUgKDApCi0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNlbmRpZiAvKiBfTE9DS19IICovCmRpZmYgLS1naXQgYS9pbnRsL2xvZy5jIGIvaW50bC9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhYjVkMC4uMDAwMDAwMAotLS0gYS9pbnRsL2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIExvZyBmaWxlIG91dHB1dC4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBIYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibG9jay5oIgotI2VuZGlmCi0KLS8qIFByaW50IGFuIEFTQ0lJIHN0cmluZyB3aXRoIHF1b3RlcyBhbmQgZXNjYXBlIHNlcXVlbmNlcyB3aGVyZSBuZWVkZWQuICAqLwotc3RhdGljIHZvaWQKLXByaW50X2VzY2FwZWQgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3RyKQotewotICBwdXRjICgnIicsIHN0cmVhbSk7Ci0gIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQotICAgIGlmICgqc3RyID09ICdcbicpCi0gICAgICB7Ci0JZnB1dHMgKCJcXG5cIiIsIHN0cmVhbSk7Ci0JaWYgKHN0clsxXSA9PSAnXDAnKQotCSAgcmV0dXJuOwotCWZwdXRzICgiXG5cIiIsIHN0cmVhbSk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmICgqc3RyID09ICciJyB8fCAqc3RyID09ICdcXCcpCi0JICBwdXRjICgnXFwnLCBzdHJlYW0pOwotCXB1dGMgKCpzdHIsIHN0cmVhbSk7Ci0gICAgICB9Ci0gIHB1dGMgKCciJywgc3RyZWFtKTsKLX0KLQotc3RhdGljIGNoYXIgKmxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOwotc3RhdGljIEZJTEUgKmxhc3RfbG9nZmlsZSA9IE5VTEw7Ci1fX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jaykKLQotc3RhdGljIGlubGluZSB2b2lkCi1fbmxfbG9nX3VudHJhbnNsYXRlZF9sb2NrZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAotCQkJICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKLXsKLSAgRklMRSAqbG9nZmlsZTsKLQotICAvKiBDYW4gd2UgcmV1c2UgdGhlIGxhc3Qgb3BlbmVkIGxvZ2ZpbGU/ICAqLwotICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAobG9nZmlsZW5hbWUsIGxhc3RfbG9nZmlsZW5hbWUpICE9IDApCi0gICAgewotICAgICAgLyogQ2xvc2UgdGhlIGxhc3QgdXNlZCBsb2dmaWxlLiAgKi8KLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lICE9IE5VTEwpCi0JewotCSAgaWYgKGxhc3RfbG9nZmlsZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZmNsb3NlIChsYXN0X2xvZ2ZpbGUpOwotCSAgICAgIGxhc3RfbG9nZmlsZSA9IE5VTEw7Ci0JICAgIH0KLQkgIGZyZWUgKGxhc3RfbG9nZmlsZW5hbWUpOwotCSAgbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgLyogT3BlbiB0aGUgbG9nZmlsZS4gICovCi0gICAgICBsYXN0X2xvZ2ZpbGVuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKGxvZ2ZpbGVuYW1lKSArIDEpOwotICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgICBzdHJjcHkgKGxhc3RfbG9nZmlsZW5hbWUsIGxvZ2ZpbGVuYW1lKTsKLSAgICAgIGxhc3RfbG9nZmlsZSA9IGZvcGVuIChsb2dmaWxlbmFtZSwgImEiKTsKLSAgICAgIGlmIChsYXN0X2xvZ2ZpbGUgPT0gTlVMTCkKLQlyZXR1cm47Ci0gICAgfQotICBsb2dmaWxlID0gbGFzdF9sb2dmaWxlOwotCi0gIGZwcmludGYgKGxvZ2ZpbGUsICJkb21haW4gIik7Ci0gIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIGRvbWFpbm5hbWUpOwotICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZCAiKTsKLSAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQxKTsKLSAgaWYgKHBsdXJhbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dpZF9wbHVyYWwgIik7Ci0gICAgICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDIpOwotICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyWzBdIFwiXCJcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0ciBcIlwiXG4iKTsKLSAgcHV0YyAoJ1xuJywgbG9nZmlsZSk7Ci19Ci0KLS8qIEFkZCB0byB0aGUgbG9nIGZpbGUgYW4gZW50cnkgZGVub3RpbmcgYSBmYWlsZWQgdHJhbnNsYXRpb24uICAqLwotdm9pZAotX25sX2xvZ191bnRyYW5zbGF0ZWQgKGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lLCBjb25zdCBjaGFyICpkb21haW5uYW1lLAotCQkgICAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgaW50IHBsdXJhbCkKLXsKLSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7Ci0gIF9ubF9sb2dfdW50cmFuc2xhdGVkX2xvY2tlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOwotICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9uZ2V0dGV4dC5jIGIvaW50bC9uZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM1MjljLi4wMDAwMDAwCi0tLSBhL2ludGwvbmdldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIG5nZXR0ZXh0KDMpIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBfX25lZWRfTlVMTAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsb2NhbGUuaD4KLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIE5HRVRURVhUIF9fbmdldHRleHQKLSMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgTkdFVFRFWFQgbGliaW50bF9uZ2V0dGV4dAotIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWNoYXIgKgotTkdFVFRFWFQgKGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQotewotICByZXR1cm4gRENOR0VUVEVYVCAoTlVMTCwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fbmdldHRleHQsIG5nZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9vczJjb21wYXQuYyBiL2ludGwvb3MyY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDFkZTIuLjAwMDAwMDAKLS0tIGEvaW50bC9vczJjb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qIE9TLzIgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jZGVmaW5lIE9TMl9BV0FSRQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIEEgdmVyc2lvbiBvZiBnZXRlbnYoKSB0aGF0IHdvcmtzIGZyb20gRExMcyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRG9zU2NhbkVudiAoY29uc3QgdW5zaWduZWQgY2hhciAqcHN6TmFtZSwgdW5zaWduZWQgY2hhciAqKnBwc3pWYWx1ZSk7Ci0KLWNoYXIgKgotX25sX2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgdW5zaWduZWQgY2hhciAqdmFsdWU7Ci0gIGlmIChEb3NTY2FuRW52IChuYW1lLCAmdmFsdWUpKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBBIGZpeGVkIHNpemUgYnVmZmVyLiAgKi8KLWNoYXIgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWVbTUFYUEFUSExFTisxXTsKLQotY2hhciAqX25sb3MyX2xpYmRpciA9IE5VTEw7Ci1jaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gTlVMTDsKLWNoYXIgKl9ubG9zMl9sb2NhbGVkaXIgPSBOVUxMOwotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkCi1ubG9zMl9pbml0aWFsaXplICgpCi17Ci0gIGNoYXIgKnJvb3QgPSBnZXRlbnYgKCJVTklYUk9PVCIpOwotICBjaGFyICpnbnVsb2NhbGVkaXIgPSBnZXRlbnYgKCJHTlVMT0NBTEVESVIiKTsKLQotICBfbmxvczJfbGliZGlyID0gZ251bG9jYWxlZGlyOwotICBpZiAoIV9ubG9zMl9saWJkaXIpCi0gICAgewotICAgICAgaWYgKHJvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotICAgICAgICAgIF9ubG9zMl9saWJkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMSUJESVIpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyICsgc2wsIExJQkRJUiwgc3RybGVuIChMSUJESVIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xpYmRpciA9IExJQkRJUjsKLSAgICB9Ci0KLSAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IGdudWxvY2FsZWRpcjsKLSAgaWYgKCFfbmxvczJfbG9jYWxlYWxpYXNwYXRoKQotICAgIHsKLSAgICAgIGlmIChyb290KQotICAgICAgICB7Ci0gICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKLSAgICAgICAgICBfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFX0FMSUFTX1BBVEgpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoICsgc2wsIExPQ0FMRV9BTElBU19QQVRILCBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOwotICAgICAgICB9Ci0gICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotICAgIH0KLQotICBfbmxvczJfbG9jYWxlZGlyID0gZ251bG9jYWxlZGlyOwotICBpZiAoIV9ubG9zMl9sb2NhbGVkaXIpCi0gICAgewotICAgICAgaWYgKHJvb3QpCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOwotICAgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMT0NBTEVESVIpICsgMSk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyLCByb290LCBzbCk7Ci0gICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyICsgc2wsIExPQ0FMRURJUiwgc3RybGVuIChMT0NBTEVESVIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgX25sb3MyX2xvY2FsZWRpciA9IExPQ0FMRURJUjsKLSAgICB9Ci0KLSAgaWYgKHN0cmxlbiAoX25sb3MyX2xvY2FsZWRpcikgPD0gTUFYUEFUSExFTikKLSAgICBzdHJjcHkgKGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lLCBfbmxvczJfbG9jYWxlZGlyKTsKLX0KZGlmZiAtLWdpdCBhL2ludGwvb3MyY29tcGF0LmggYi9pbnRsL29zMmNvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThkNTgyLi4wMDAwMDAwCi0tLSBhL2ludGwvb3MyY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBPUy8yIGNvbXBhdGliaWxpdHkgZGVmaW5lcy4KLSAgIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBmcm9tIGNvbmZpZy5oCi0gICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBXaGVuIGluY2x1ZGVkIGZyb20gb3MyY29tcGF0Lmggd2UgbmVlZCBhbGwgdGhlIG9yaWdpbmFsIGRlZmluaXRpb25zICovCi0jaWZuZGVmIE9TMl9BV0FSRQotCi0jdW5kZWYgTElCRElSCi0jZGVmaW5lIExJQkRJUgkJCV9ubG9zMl9saWJkaXIKLWV4dGVybiBjaGFyICpfbmxvczJfbGliZGlyOwotCi0jdW5kZWYgTE9DQUxFRElSCi0jZGVmaW5lIExPQ0FMRURJUgkJX25sb3MyX2xvY2FsZWRpcgotZXh0ZXJuIGNoYXIgKl9ubG9zMl9sb2NhbGVkaXI7Ci0KLSN1bmRlZiBMT0NBTEVfQUxJQVNfUEFUSAotI2RlZmluZSBMT0NBTEVfQUxJQVNfUEFUSAlfbmxvczJfbG9jYWxlYWxpYXNwYXRoCi1leHRlcm4gY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aDsKLQotI2VuZGlmCi0KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLSNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKLSNkZWZpbmUgc3RyY2FzZWNtcCBzdHJpY21wCi0jZGVmaW5lIHN0cm5jYXNlY21wIHN0cm5pY21wCi0KLS8qIFdlIGhhdmUgb3VyIG93biBnZXRlbnYoKSB3aGljaCB3b3JrcyBldmVuIGlmIGxpYnJhcnkgaXMgY29tcGlsZWQgYXMgRExMICovCi0jZGVmaW5lIGdldGVudiBfbmxfZ2V0ZW52Ci0KLS8qIE9sZGVyIHZlcnNpb25zIG9mIGdldHRleHQgdXNlZCAtMSBhcyB0aGUgdmFsdWUgb2YgTENfTUVTU0FHRVMgKi8KLSNkZWZpbmUgTENfTUVTU0FHRVNfQ09NUEFUICgtMSkKZGlmZiAtLWdpdCBhL2ludGwvb3NkZXAuYyBiL2ludGwvb3NkZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMzVjMC4uMDAwMDAwMAotLS0gYS9pbnRsL29zZGVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBPUyBkZXBlbmRlbnQgcGFydHMgb2YgbGliaW50bC4KLSAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZiBkZWZpbmVkIF9fQ1lHV0lOX18KLSMgaW5jbHVkZSAiaW50bC1leHBvcnRzLmMiCi0jZWxpZiBkZWZpbmVkIF9fRU1YX18KLSMgaW5jbHVkZSAib3MyY29tcGF0LmMiCi0jZWxzZQotLyogQXZvaWQgQUlYIGNvbXBpbGVyIHdhcm5pbmcuICAqLwotdHlwZWRlZiBpbnQgZHVtbXk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvcGx1cmFsLWV4cC5jIGIvaW50bC9wbHVyYWwtZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWE2ODguLjAwMDAwMDAKLS0tIGEvaW50bC9wbHVyYWwtZXhwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyogRXhwcmVzc2lvbiBwYXJzaW5nIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSwgMjAwMywgMjAwNS0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLQotI2lmIChkZWZpbmVkIF9fR05VQ19fICYmICEoX19BUFBMRV9DQ19fID4gMSkgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMpIFwKLSAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKLQotLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKLSAgIGZvcm0gZGV0ZXJtaW5hdGlvbi4gIEl0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gICJuICE9IDEiLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhciA9Ci17Ci0gIC5uYXJncyA9IDAsCi0gIC5vcGVyYXRpb24gPSB2YXIsCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsb25lID0KLXsKLSAgLm5hcmdzID0gMCwKLSAgLm9wZXJhdGlvbiA9IG51bSwKLSAgLnZhbCA9Ci0gIHsKLSAgICAubnVtID0gMQotICB9Ci19Owotc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMID0KLXsKLSAgLm5hcmdzID0gMiwKLSAgLm9wZXJhdGlvbiA9IG5vdF9lcXVhbCwKLSAgLnZhbCA9Ci0gIHsKLSAgICAuYXJncyA9Ci0gICAgewotICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKLSAgICAgIFsxXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGxvbmUKLSAgICB9Ci0gIH0KLX07Ci0KLSMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKLQotI2Vsc2UKLQotLyogRm9yIGNvbXBpbGVycyB3aXRob3V0IHN1cHBvcnQgZm9yIElTTyBDIDk5IHN0cnVjdC91bmlvbiBpbml0aWFsaXplcnM6Ci0gICBJbml0aWFsaXphdGlvbiBhdCBydW4tdGltZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhcjsKLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZTsKLXN0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKLQotc3RhdGljIHZvaWQKLWluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi17Ci0gIGlmIChwbG9uZS52YWwubnVtID09IDApCi0gICAgewotICAgICAgcGx2YXIubmFyZ3MgPSAwOwotICAgICAgcGx2YXIub3BlcmF0aW9uID0gdmFyOwotCi0gICAgICBwbG9uZS5uYXJncyA9IDA7Ci0gICAgICBwbG9uZS5vcGVyYXRpb24gPSBudW07Ci0gICAgICBwbG9uZS52YWwubnVtID0gMTsKLQotICAgICAgR0VSTUFOSUNfUExVUkFMLm5hcmdzID0gMjsKLSAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7Ci0gICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMF0gPSAmcGx2YXI7Ci0gICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMV0gPSAmcGxvbmU7Ci0gICAgfQotfQotCi0jIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCi0KLSNlbmRpZgotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LAotCQkJICAgY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gKipwbHVyYWxwLAotCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKLXsKLSAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnBsdXJhbDsKLSAgICAgIGNvbnN0IGNoYXIgKm5wbHVyYWxzOwotCi0gICAgICBwbHVyYWwgPSBzdHJzdHIgKG51bGxlbnRyeSwgInBsdXJhbD0iKTsKLSAgICAgIG5wbHVyYWxzID0gc3Ryc3RyIChudWxsZW50cnksICJucGx1cmFscz0iKTsKLSAgICAgIGlmIChwbHVyYWwgPT0gTlVMTCB8fCBucGx1cmFscyA9PSBOVUxMKQotCWdvdG8gbm9fcGx1cmFsOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmVuZHA7Ci0JICB1bnNpZ25lZCBsb25nIGludCBuOwotCSAgc3RydWN0IHBhcnNlX2FyZ3MgYXJnczsKLQotCSAgLyogRmlyc3QgZ2V0IHRoZSBudW1iZXIuICAqLwotCSAgbnBsdXJhbHMgKz0gOTsKLQkgIHdoaWxlICgqbnBsdXJhbHMgIT0gJ1wwJyAmJiBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKm5wbHVyYWxzKSkKLQkgICAgKytucGx1cmFsczsKLQkgIGlmICghKCpucGx1cmFscyA+PSAnMCcgJiYgKm5wbHVyYWxzIDw9ICc5JykpCi0JICAgIGdvdG8gbm9fcGx1cmFsOwotI2lmIGRlZmluZWQgSEFWRV9TVFJUT1VMIHx8IGRlZmluZWQgX0xJQkMKLQkgIG4gPSBzdHJ0b3VsIChucGx1cmFscywgJmVuZHAsIDEwKTsKLSNlbHNlCi0JICBmb3IgKGVuZHAgPSBucGx1cmFscywgbiA9IDA7ICplbmRwID49ICcwJyAmJiAqZW5kcCA8PSAnOSc7IGVuZHArKykKLQkgICAgbiA9IG4gKiAxMCArICgqZW5kcCAtICcwJyk7Ci0jZW5kaWYKLQkgIGlmIChucGx1cmFscyA9PSBlbmRwKQotCSAgICBnb3RvIG5vX3BsdXJhbDsKLQkgICpucGx1cmFsc3AgPSBuOwotCi0JICAvKiBEdWUgdG8gdGhlIHJlc3RyaWN0aW9ucyBiaXNvbiBpbXBvc2VzIG9udG8gdGhlIGludGVyZmFjZSBvZiB0aGUKLQkgICAgIHNjYW5uZXIgZnVuY3Rpb24gd2UgaGF2ZSB0byBwdXQgdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIHJlc3VsdAotCSAgICAgcGFzc2VkIHVwIGZyb20gdGhlIHBhcnNlciBpbnRvIHRoZSBzYW1lIHN0cnVjdHVyZSB3aGljaCBhZGRyZXNzCi0JICAgICBpcyBwYXNzZWQgZG93biB0byB0aGUgcGFyc2VyLiAgKi8KLQkgIHBsdXJhbCArPSA3OwotCSAgYXJncy5jcCA9IHBsdXJhbDsKLQkgIGlmIChQTFVSQUxfUEFSU0UgKCZhcmdzKSAhPSAwKQotCSAgICBnb3RvIG5vX3BsdXJhbDsKLQkgICpwbHVyYWxwID0gYXJncy5yZXM7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEJ5IGRlZmF1bHQgd2UgYXJlIHVzaW5nIHRoZSBHZXJtYW5pYyBmb3JtOiBzaW5ndWxhciBmb3JtIG9ubHkKLSAgICAgICAgIGZvciBgb25lJywgdGhlIHBsdXJhbCBmb3JtIG90aGVyd2lzZS4gIFllcywgdGhpcyBpcyBhbHNvIHdoYXQKLSAgICAgICAgIEVuZ2xpc2ggaXMgdXNpbmcgc2luY2UgRW5nbGlzaCBpcyBhIEdlcm1hbmljIGxhbmd1YWdlLiAgKi8KLSAgICBub19wbHVyYWw6Ci0gICAgICBJTklUX0dFUk1BTklDX1BMVVJBTCAoKTsKLSAgICAgICpwbHVyYWxwID0gJkdFUk1BTklDX1BMVVJBTDsKLSAgICAgICpucGx1cmFsc3AgPSAyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2ludGwvcGx1cmFsLWV4cC5oIGIvaW50bC9wbHVyYWwtZXhwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2I4YzUuLjAwMDAwMDAKLS0tIGEvaW50bC9wbHVyYWwtZXhwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogRXhwcmVzc2lvbiBwYXJzaW5nIGFuZCBldmFsdWF0aW9uIGZvciBwbHVyYWwgZm9ybSBzZWxlY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMywgMjAwNS0yMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9QTFVSQUxfRVhQX0gKLSNkZWZpbmUgX1BMVVJBTF9FWFBfSAotCi0jaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCi0jIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgotIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi1lbnVtIGV4cHJlc3Npb25fb3BlcmF0b3IKLXsKLSAgLyogV2l0aG91dCBhcmd1bWVudHM6ICAqLwotICB2YXIsCQkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLwotICBudW0sCQkJCS8qIERlY2ltYWwgbnVtYmVyLiAgKi8KLSAgLyogVW5hcnkgb3BlcmF0b3JzOiAgKi8KLSAgbG5vdCwJCQkJLyogTG9naWNhbCBOT1QuICAqLwotICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KLSAgbXVsdCwJCQkJLyogTXVsdGlwbGljYXRpb24uICAqLwotICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLwotICBtb2R1bGUsCQkJLyogTW9kdWxvIG9wZXJhdGlvbi4gICovCi0gIHBsdXMsCQkJCS8qIEFkZGl0aW9uLiAgKi8KLSAgbWludXMsCQkJLyogU3VidHJhY3Rpb24uICAqLwotICBsZXNzX3RoYW4sCQkJLyogQ29tcGFyaXNvbi4gICovCi0gIGdyZWF0ZXJfdGhhbiwJCQkvKiBDb21wYXJpc29uLiAgKi8KLSAgbGVzc19vcl9lcXVhbCwJCS8qIENvbXBhcmlzb24uICAqLwotICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCi0gIGVxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGVxdWFsaXR5LiAgKi8KLSAgbm90X2VxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGluZXF1YWxpdHkuICAqLwotICBsYW5kLAkJCQkvKiBMb2dpY2FsIEFORC4gICovCi0gIGxvciwJCQkJLyogTG9naWNhbCBPUi4gICovCi0gIC8qIFRlcm5hcnkgb3BlcmF0b3JzOiAgKi8KLSAgcW1vcAkJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9ucyB0byBkZXRlcm1pbmUgdGhlCi0gICBwbHVyYWwgZm9ybS4gICovCi1zdHJ1Y3QgZXhwcmVzc2lvbgotewotICBpbnQgbmFyZ3M7CQkJLyogTnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gIGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcGVyYXRpb247Ci0gIHVuaW9uCi0gIHsKLSAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLwotICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLwotICB9IHZhbDsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0Ci0gICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KLXN0cnVjdCBwYXJzZV9hcmdzCi17Ci0gIGNvbnN0IGNoYXIgKmNwOwotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOwotfTsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKLSAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCi0gICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKLSAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KLSAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCi0gICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAotICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCi0gICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKLSAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCi0gICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKLSMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQotIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKLSMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCi0jZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQotIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAotIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCi0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAotIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKLSNlbHNlCi0jIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgotIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCi0jIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCi0jIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCi0gICAgIGludGVybmFsX2Z1bmN0aW9uOwotZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7Ci1leHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47Ci1leHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKLSAgICAgaW50ZXJuYWxfZnVuY3Rpb247Ci0KLSNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKSAmJiAhZGVmaW5lZCAoSU5fTElCR0xPQ0FMRSkKLWV4dGVybiB1bnNpZ25lZCBsb25nIGludCBwbHVyYWxfZXZhbCAoY29uc3Qgc3RydWN0IGV4cHJlc3Npb24gKnBleHAsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbik7Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9wbHVyYWwuYyBiL2ludGwvcGx1cmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGQ5NDcuLjAwMDAwMDAKLS0tIGEvaW50bC9wbHVyYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NjEgKzAsMCBAQAotLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuM2EuICAqLwotCi0vKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSBjcmVhdGUgYSBsYXJnZXIgd29yayB0aGF0IGNvbnRhaW5zCi0gICBwYXJ0IG9yIGFsbCBvZiB0aGUgQmlzb24gcGFyc2VyIHNrZWxldG9uIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotICAgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHNvIGxvbmcgYXMgdGhhdCB3b3JrIGlzbid0IGl0c2VsZiBhCi0gICBwYXJzZXIgZ2VuZXJhdG9yIHVzaW5nIHRoZSBza2VsZXRvbiBvciBhIG1vZGlmaWVkIHZlcnNpb24gdGhlcmVvZgotICAgYXMgYSBwYXJzZXIgc2tlbGV0b24uICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZQotICAgdGhlIHBhcnNlciBza2VsZXRvbiBpdHNlbGYsIHlvdSBtYXkgKGF0IHlvdXIgb3B0aW9uKSByZW1vdmUgdGhpcwotICAgc3BlY2lhbCBleGNlcHRpb24sIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHNrZWxldG9uIGFuZCB0aGUgcmVzdWx0aW5nCi0gICBCaXNvbiBvdXRwdXQgZmlsZXMgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSB3aXRob3V0IHRoaXMgc3BlY2lhbCBleGNlcHRpb24uCi0KLSAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW4KLSAgIHZlcnNpb24gMi4yIG9mIEJpc29uLiAgKi8KLQotLyogQyBMQUxSKDEpIHBhcnNlciBza2VsZXRvbiB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4sIGJ5Ci0gICBzaW1wbGlmeWluZyB0aGUgb3JpZ2luYWwgc28tY2FsbGVkICJzZW1hbnRpYyIgcGFyc2VyLiAgKi8KLQotLyogQWxsIHN5bWJvbHMgZGVmaW5lZCBiZWxvdyBzaG91bGQgYmVnaW4gd2l0aCB5eSBvciBZWSwgdG8gYXZvaWQKLSAgIGluZnJpbmdpbmcgb24gdXNlciBuYW1lIHNwYWNlLiAgVGhpcyBzaG91bGQgYmUgZG9uZSBldmVuIGZvciBsb2NhbAotICAgdmFyaWFibGVzLCBhcyB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZSBleHBhbmRlZCBieSB1c2VyIG1hY3Jvcy4KLSAgIFRoZXJlIGFyZSBzb21lIHVuYXZvaWRhYmxlIGV4Y2VwdGlvbnMgd2l0aGluIGluY2x1ZGUgZmlsZXMgdG8KLSAgIGRlZmluZSBuZWNlc3NhcnkgbGlicmFyeSBzeW1ib2xzOyB0aGV5IGFyZSBub3RlZCAiSU5GUklOR0VTIE9OCi0gICBVU0VSIE5BTUUgU1BBQ0UiIGJlbG93LiAgKi8KLQotLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLSNkZWZpbmUgWVlCSVNPTiAxCi0KLS8qIEJpc29uIHZlcnNpb24uICAqLwotI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuM2EiCi0KLS8qIFNrZWxldG9uIG5hbWUuICAqLwotI2RlZmluZSBZWVNLRUxFVE9OX05BTUUgInlhY2MuYyIKLQotLyogUHVyZSBwYXJzZXJzLiAgKi8KLSNkZWZpbmUgWVlQVVJFIDEKLQotLyogVXNpbmcgbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgWVlMU1BfTkVFREVEIDAKLQotLyogU3Vic3RpdHV0ZSB0aGUgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIG5hbWVzLiAgKi8KLSNkZWZpbmUgeXlwYXJzZSBfX2dldHRleHRwYXJzZQotI2RlZmluZSB5eWxleCAgIF9fZ2V0dGV4dGxleAotI2RlZmluZSB5eWVycm9yIF9fZ2V0dGV4dGVycm9yCi0jZGVmaW5lIHl5bHZhbCAgX19nZXR0ZXh0bHZhbAotI2RlZmluZSB5eWNoYXIgIF9fZ2V0dGV4dGNoYXIKLSNkZWZpbmUgeXlkZWJ1ZyBfX2dldHRleHRkZWJ1ZwotI2RlZmluZSB5eW5lcnJzIF9fZ2V0dGV4dG5lcnJzCi0KLQotLyogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB1c2VyIGRlY2xhcmF0aW9ucy4gICovCi0vKiBMaW5lIDE2NCBvZiB5YWNjLmMuICAqLwotI2xpbmUgMSAicGx1cmFsLnkiCi0KLS8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMsIDIwMDUtMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDIwMDAuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogRm9yIGJpc29uIDwgMi4wLCB0aGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNlciB1c2VzIGFsbG9jYS4gIEFJWCAzIGZvcmNlcyB1cwotICAgdG8gcHV0IHRoaXMgZGVjbGFyYXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZSBkZWNsYXJhdGlvbiBpbgotICAgYmlzb24ncyBza2VsZXRvbiBmaWxlIGNvbWVzIHRvbyBsYXRlLiAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4KLSAgIGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZSBhcmJpdHJhcnkgc3lzdGVtIGhlYWRlcnMuCi0gICBUaGlzIGNhbiBnbyBhd2F5IG9uY2UgdGhlIEFNX0lOVExfU1VCRElSIG1hY3JvIHJlcXVpcmVzIGJpc29uID49IDIuMC4gICovCi0jaWYgZGVmaW5lZCBfQUlYICYmICFkZWZpbmVkIF9fR05VQ19fCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicGx1cmFsLWV4cC5oIgotCi0vKiBUaGUgbWFpbiBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlciBpcyBjYWxsZWQgX19nZXR0ZXh0cGFyc2UsCi0gICBidXQgd2Ugd2FudCBpdCB0byBiZSBjYWxsZWQgUExVUkFMX1BBUlNFLiAgKi8KLSNpZm5kZWYgX0xJQkMKLSMgZGVmaW5lIF9fZ2V0dGV4dHBhcnNlIFBMVVJBTF9QQVJTRQotI2VuZGlmCi0KLSNkZWZpbmUgWVlMRVhfUEFSQU0JJigoc3RydWN0IHBhcnNlX2FyZ3MgKikgYXJnKS0+Y3AKLSNkZWZpbmUgWVlQQVJTRV9QQVJBTQlhcmcKLQotCi0vKiBFbmFibGluZyB0cmFjZXMuICAqLwotI2lmbmRlZiBZWURFQlVHCi0jIGRlZmluZSBZWURFQlVHIDAKLSNlbmRpZgotCi0vKiBFbmFibGluZyB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzLiAgKi8KLSNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKLSMgdW5kZWYgWVlFUlJPUl9WRVJCT1NFCi0jIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMQotI2Vsc2UKLSMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAwCi0jZW5kaWYKLQotLyogRW5hYmxpbmcgdGhlIHRva2VuIHRhYmxlLiAgKi8KLSNpZm5kZWYgWVlUT0tFTl9UQUJMRQotIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCi0jZW5kaWYKLQotCi0vKiBUb2tlbnMuICAqLwotI2lmbmRlZiBZWVRPS0VOVFlQRQotIyBkZWZpbmUgWVlUT0tFTlRZUEUKLSAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycwotICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KLSAgIGVudW0geXl0b2tlbnR5cGUgewotICAgICBFUVVPUDIgPSAyNTgsCi0gICAgIENNUE9QMiA9IDI1OSwKLSAgICAgQURET1AyID0gMjYwLAotICAgICBNVUxPUDIgPSAyNjEsCi0gICAgIE5VTUJFUiA9IDI2MgotICAgfTsKLSNlbmRpZgotLyogVG9rZW5zLiAgKi8KLSNkZWZpbmUgRVFVT1AyIDI1OAotI2RlZmluZSBDTVBPUDIgMjU5Ci0jZGVmaW5lIEFERE9QMiAyNjAKLSNkZWZpbmUgTVVMT1AyIDI2MQotI2RlZmluZSBOVU1CRVIgMjYyCi0KLQotCi0KLSNpZiAhIGRlZmluZWQgWVlTVFlQRSAmJiAhIGRlZmluZWQgWVlTVFlQRV9JU19ERUNMQVJFRAotdHlwZWRlZiB1bmlvbiBZWVNUWVBFCi17LyogTGluZSAxOTEgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDUxICJwbHVyYWwueSIKLQotICB1bnNpZ25lZCBsb25nIGludCBudW07Ci0gIGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcDsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKLX0KLS8qIExpbmUgMTkxIG9mIHlhY2MuYy4gICovCi0jbGluZSAxNzUgInBsdXJhbC5jIgotCVlZU1RZUEU7Ci0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQotIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwotIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jZW5kaWYKLQotCi0KLQotLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwotLyogTGluZSAyMjEgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDU3ICJwbHVyYWwueSIKLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKLXN0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cik7Ci0KLS8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLwotCi1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsCi0JIHN0cnVjdCBleHByZXNzaW9uICogY29uc3QgKmFyZ3MpCi17Ci0gIGludCBpOwotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3cDsKLQotICAvKiBJZiBhbnkgb2YgdGhlIGFyZ3VtZW50IGNvdWxkIG5vdCBiZSBtYWxsb2MnZWQsIGp1c3QgcmV0dXJuIE5VTEwuICAqLwotICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIGlmIChhcmdzW2ldID09IE5VTEwpCi0gICAgICBnb3RvIGZhaWw7Ci0KLSAgLyogQWxsb2NhdGUgYSBuZXcgZXhwcmVzc2lvbi4gICovCi0gIG5ld3AgPSAoc3RydWN0IGV4cHJlc3Npb24gKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7Ci0gIGlmIChuZXdwICE9IE5VTEwpCi0gICAgewotICAgICAgbmV3cC0+bmFyZ3MgPSBuYXJnczsKLSAgICAgIG5ld3AtPm9wZXJhdGlvbiA9IG9wOwotICAgICAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKLQluZXdwLT52YWwuYXJnc1tpXSA9IGFyZ3NbaV07Ci0gICAgICByZXR1cm4gbmV3cDsKLSAgICB9Ci0KLSBmYWlsOgotICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIEZSRUVfRVhQUkVTU0lPTiAoYXJnc1tpXSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8wIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3ApCi17Ci0gIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8xIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLXsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMV07Ci0KLSAgYXJnc1swXSA9IHJpZ2h0OwotICByZXR1cm4gbmV3X2V4cCAoMSwgb3AsIGFyZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgotbmV3X2V4cF8yIChlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpsZWZ0LAotCSAgIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKLXsKLSAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07Ci0KLSAgYXJnc1swXSA9IGxlZnQ7Ci0gIGFyZ3NbMV0gPSByaWdodDsKLSAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzMgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCi0JICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQotewotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKLQotICBhcmdzWzBdID0gYmV4cDsKLSAgYXJnc1sxXSA9IHRicmFuY2g7Ci0gIGFyZ3NbMl0gPSBmYnJhbmNoOwotICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOwotfQotCi0KLS8qIExpbmUgMjIxIG9mIHlhY2MuYy4gICovCi0jbGluZSAyNjUgInBsdXJhbC5jIgotCi0jaWZkZWYgc2hvcnQKLSMgdW5kZWYgc2hvcnQKLSNlbmRpZgotCi0jaWZkZWYgWVlUWVBFX1VJTlQ4Ci10eXBlZGVmIFlZVFlQRV9VSU5UOCB5eXR5cGVfdWludDg7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHl5dHlwZV91aW50ODsKLSNlbmRpZgotCi0jaWZkZWYgWVlUWVBFX0lOVDgKLXR5cGVkZWYgWVlUWVBFX0lOVDggeXl0eXBlX2ludDg7Ci0jZWxpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi10eXBlZGVmIHNpZ25lZCBjaGFyIHl5dHlwZV9pbnQ4OwotI2Vsc2UKLXR5cGVkZWYgc2hvcnQgaW50IHl5dHlwZV9pbnQ4OwotI2VuZGlmCi0KLSNpZmRlZiBZWVRZUEVfVUlOVDE2Ci10eXBlZGVmIFlZVFlQRV9VSU5UMTYgeXl0eXBlX3VpbnQxNjsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB5eXR5cGVfdWludDE2OwotI2VuZGlmCi0KLSNpZmRlZiBZWVRZUEVfSU5UMTYKLXR5cGVkZWYgWVlUWVBFX0lOVDE2IHl5dHlwZV9pbnQxNjsKLSNlbHNlCi10eXBlZGVmIHNob3J0IGludCB5eXR5cGVfaW50MTY7Ci0jZW5kaWYKLQotI2lmbmRlZiBZWVNJWkVfVAotIyBpZmRlZiBfX1NJWkVfVFlQRV9fCi0jICBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXwotIyBlbGlmIGRlZmluZWQgc2l6ZV90Ci0jICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0jIGVsaWYgISBkZWZpbmVkIFlZU0laRV9UICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90Ci0jIGVsc2UKLSMgIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKLSMgZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIFlZU0laRV9NQVhJTVVNICgoWVlTSVpFX1QpIC0xKQotCi0jaWZuZGVmIFlZXwotIyBpZiBZWUVOQUJMRV9OTFMKLSMgIGlmIEVOQUJMRV9OTFMKLSMgICBpbmNsdWRlIDxsaWJpbnRsLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICBkZWZpbmUgWVlfKG1zZ2lkKSBkZ2V0dGV4dCAoImJpc29uLXJ1bnRpbWUiLCBtc2dpZCkKLSMgIGVuZGlmCi0jIGVuZGlmCi0jIGlmbmRlZiBZWV8KLSMgIGRlZmluZSBZWV8obXNnaWQpIG1zZ2lkCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogU3VwcHJlc3MgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmdzIGJ5ICJ1c2luZyIgRS4gICovCi0jaWYgISBkZWZpbmVkIGxpbnQgfHwgZGVmaW5lZCBfX0dOVUNfXwotIyBkZWZpbmUgWVlVU0UoZSkgKCh2b2lkKSAoZSkpCi0jZWxzZQotIyBkZWZpbmUgWVlVU0UoZSkgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0vKiBJZGVudGl0eSBmdW5jdGlvbiwgdXNlZCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBjb25zdGFudCBjb25kaXRpb25zLiAgKi8KLSNpZm5kZWYgbGludAotIyBkZWZpbmUgWVlJRChuKSAobikKLSNlbHNlCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIGludAotWVlJRCAoaW50IHl5aSkKLSNlbHNlCi1zdGF0aWMgaW50Ci1ZWUlEICh5eWkpCi0gICAgaW50IHl5aTsKLSNlbmRpZgotewotICByZXR1cm4geXlpOwotfQotI2VuZGlmCi0KLSNpZiAhIGRlZmluZWQgeXlvdmVyZmxvdyB8fCBZWUVSUk9SX1ZFUkJPU0UKLQotLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLwotCi0jIGlmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQotIyAgaWYgWVlTVEFDS19VU0VfQUxMT0NBCi0jICAgaWZkZWYgX19HTlVDX18KLSMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQotIyAgIGVsaWYgZGVmaW5lZCBfX0JVSUxUSU5fVkFfQVJHX0lOQ1IKLSMgICAgaW5jbHVkZSA8YWxsb2NhLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICBlbGlmIGRlZmluZWQgX0FJWAotIyAgICBkZWZpbmUgWVlTVEFDS19BTExPQyBfX2FsbG9jYQotIyAgIGVsaWYgZGVmaW5lZCBfTVNDX1ZFUgotIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgICBlbHNlCi0jICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQotIyAgICBpZiAhIGRlZmluZWQgX0FMTE9DQV9IICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotIyAgICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICAgIGlmbmRlZiBfU1RETElCX0gKLSMgICAgICBkZWZpbmUgX1NURExJQl9IIDEKLSMgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSMgaWZkZWYgWVlTVEFDS19BTExPQwotICAgLyogUGFjaWZ5IEdDQydzIGBlbXB0eSBpZi1ib2R5JyB3YXJuaW5nLiAgKi8KLSMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlIChZWUlEICgwKSkKLSMgIGlmbmRlZiBZWVNUQUNLX0FMTE9DX01BWElNVU0KLSAgICAvKiBUaGUgT1MgbWlnaHQgZ3VhcmFudGVlIG9ubHkgb25lIGd1YXJkIHBhZ2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssCi0gICAgICAgYW5kIGEgcGFnZSBzaXplIGNhbiBiZSBhcyBzbWFsbCBhcyA0MDk2IGJ5dGVzLiAgU28gd2UgY2Fubm90IHNhZmVseQotICAgICAgIGludm9rZSBhbGxvY2EgKE4pIGlmIE4gZXhjZWVkcyA0MDk2LiAgVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBudW1iZXIKLSAgICAgICB0byBhbGxvdyBmb3IgYSBmZXcgY29tcGlsZXItYWxsb2NhdGVkIHRlbXBvcmFyeSBzdGFjayBzbG90cy4gICovCi0jICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA0MDMyIC8qIHJlYXNvbmFibGUgY2lyY2EgMjAwNiAqLwotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgWVlNQUxMT0MKLSMgIGRlZmluZSBZWVNUQUNLX0ZSRUUgWVlGUkVFCi0jICBpZm5kZWYgWVlTVEFDS19BTExPQ19NQVhJTVVNCi0jICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSBZWVNJWkVfTUFYSU1VTQotIyAgZW5kaWYKLSMgIGlmIChkZWZpbmVkIF9fY3BsdXNwbHVzICYmICEgZGVmaW5lZCBfU1RETElCX0ggXAotICAgICAgICYmICEgKChkZWZpbmVkIFlZTUFMTE9DIHx8IGRlZmluZWQgbWFsbG9jKSBcCi0JICAgICAmJiAoZGVmaW5lZCBZWUZSRUUgfHwgZGVmaW5lZCBmcmVlKSkpCi0jICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KLSMgICBpZm5kZWYgX1NURExJQl9ICi0jICAgIGRlZmluZSBfU1RETElCX0ggMQotIyAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWZuZGVmIFlZTUFMTE9DCi0jICAgZGVmaW5lIFlZTUFMTE9DIG1hbGxvYwotIyAgIGlmICEgZGVmaW5lZCBtYWxsb2MgJiYgISBkZWZpbmVkIF9TVERMSUJfSCAmJiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi12b2lkICptYWxsb2MgKFlZU0laRV9UKTsgLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWZuZGVmIFlZRlJFRQotIyAgIGRlZmluZSBZWUZSRUUgZnJlZQotIyAgIGlmICEgZGVmaW5lZCBmcmVlICYmICEgZGVmaW5lZCBfU1RETElCX0ggJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotdm9pZCBmcmVlICh2b2lkICopOyAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYgLyogISBkZWZpbmVkIHl5b3ZlcmZsb3cgfHwgWVlFUlJPUl9WRVJCT1NFICovCi0KLQotI2lmICghIGRlZmluZWQgeXlvdmVyZmxvdyBcCi0gICAgICYmICghIGRlZmluZWQgX19jcGx1c3BsdXMgXAotCSB8fCAoZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCi0KLS8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwotdW5pb24geXlhbGxvYwotewotICB5eXR5cGVfaW50MTYgeXlzczsKLSAgWVlTVFlQRSB5eXZzOwotICB9OwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLwotIyBkZWZpbmUgWVlTVEFDS19HQVBfTUFYSU1VTSAoc2l6ZW9mICh1bmlvbiB5eWFsbG9jKSAtIDEpCi0KLS8qIFRoZSBzaXplIG9mIGFuIGFycmF5IGxhcmdlIHRvIGVub3VnaCB0byBob2xkIGFsbCBzdGFja3MsIGVhY2ggd2l0aAotICAgTiBlbGVtZW50cy4gICovCi0jIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKLSAgICAgKChOKSAqIChzaXplb2YgKHl5dHlwZV9pbnQxNikgKyBzaXplb2YgKFlZU1RZUEUpKSBcCi0gICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCi0KLS8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbwotICAgbm90IG92ZXJsYXAuICAqLwotIyBpZm5kZWYgWVlDT1BZCi0jICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIDEgPCBfX0dOVUNfXwotIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KSBcCi0gICAgICBfX2J1aWx0aW5fbWVtY3B5IChUbywgRnJvbSwgKENvdW50KSAqIHNpemVvZiAoKihGcm9tKSkpCi0jICBlbHNlCi0jICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpCQlcCi0gICAgICBkbwkJCQkJXAotCXsJCQkJCVwKLQkgIFlZU0laRV9UIHl5aTsJCQkJXAotCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAotCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKLQl9CQkJCQlcCi0gICAgICB3aGlsZSAoWVlJRCAoMCkpCi0jICBlbmRpZgotIyBlbmRpZgotCi0vKiBSZWxvY2F0ZSBTVEFDSyBmcm9tIGl0cyBvbGQgbG9jYXRpb24gdG8gdGhlIG5ldyBvbmUuICBUaGUKLSAgIGxvY2FsIHZhcmlhYmxlcyBZWVNJWkUgYW5kIFlZU1RBQ0tTSVpFIGdpdmUgdGhlIG9sZCBhbmQgbmV3IG51bWJlciBvZgotICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKLSAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0Ci0gICBzdGFjay4gICovCi0jIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrKQkJCQkJXAotICAgIGRvCQkJCQkJCQkJXAotICAgICAgewkJCQkJCQkJCVwKLQlZWVNJWkVfVCB5eW5ld2J5dGVzOwkJCQkJCVwKLQlZWUNPUFkgKCZ5eXB0ci0+U3RhY2ssIFN0YWNrLCB5eXNpemUpOwkJCQlcCi0JU3RhY2sgPSAmeXlwdHItPlN0YWNrOwkJCQkJCVwKLQl5eW5ld2J5dGVzID0geXlzdGFja3NpemUgKiBzaXplb2YgKCpTdGFjaykgKyBZWVNUQUNLX0dBUF9NQVhJTVVNOyBcCi0JeXlwdHIgKz0geXluZXdieXRlcyAvIHNpemVvZiAoKnl5cHRyKTsJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB3aGlsZSAoWVlJRCAoMCkpCi0KLSNlbmRpZgotCi0vKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwotI2RlZmluZSBZWUZJTkFMICA5Ci0vKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KLSNkZWZpbmUgWVlMQVNUICAgNTQKLQotLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICAqLwotI2RlZmluZSBZWU5UT0tFTlMgIDE2Ci0vKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCi0jZGVmaW5lIFlZTk5UUyAgMwotLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAgKi8KLSNkZWZpbmUgWVlOUlVMRVMgIDEzCi0vKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAgKi8KLSNkZWZpbmUgWVlOU1RBVEVTICAyNwotCi0vKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KLSNkZWZpbmUgWVlVTkRFRlRPSyAgMgotI2RlZmluZSBZWU1BWFVUT0sgICAyNjIKLQotI2RlZmluZSBZWVRSQU5TTEFURShZWVgpCQkJCQkJXAotICAoKHVuc2lnbmVkIGludCkgKFlZWCkgPD0gWVlNQVhVVE9LID8geXl0cmFuc2xhdGVbWVlYXSA6IFlZVU5ERUZUT0spCi0KLS8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXRyYW5zbGF0ZVtdID0KLXsKLSAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDUsICAgICAyLAotICAgICAgMTQsICAgIDE1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAxMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgNiwgICAgIDcsCi0gICAgICAgOCwgICAgIDksICAgIDExCi19OwotCi0jaWYgWVlERUJVRwotLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCi0gICBZWVJIUy4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cHJoc1tdID0KLXsKLSAgICAgICAwLCAgICAgMCwgICAgIDMsICAgICA1LCAgICAxMSwgICAgMTUsICAgIDE5LCAgICAyMywgICAgMjcsICAgIDMxLAotICAgICAgMzUsICAgIDM4LCAgICA0MCwgICAgNDIKLX07Ci0KLS8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlyaHNbXSA9Ci17Ci0gICAgICAxNywgICAgIDAsICAgIC0xLCAgICAxOCwgICAgLTEsICAgIDE4LCAgICAgMywgICAgMTgsICAgIDEyLCAgICAxOCwKLSAgICAgIC0xLCAgICAxOCwgICAgIDQsICAgIDE4LCAgICAtMSwgICAgMTgsICAgICA1LCAgICAxOCwgICAgLTEsICAgIDE4LAotICAgICAgIDYsICAgIDE4LCAgICAtMSwgICAgMTgsICAgICA3LCAgICAxOCwgICAgLTEsICAgIDE4LCAgICAgOCwgICAgMTgsCi0gICAgICAtMSwgICAgMTgsICAgICA5LCAgICAxOCwgICAgLTEsICAgIDEwLCAgICAxOCwgICAgLTEsICAgIDEzLCAgICAtMSwKLSAgICAgIDExLCAgICAtMSwgICAgMTQsICAgIDE4LCAgICAxNSwgICAgLTEKLX07Ci0KLS8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXJsaW5lW10gPQotewotICAgICAgIDAsICAgMTU0LCAgIDE1NCwgICAxNjIsICAgMTY2LCAgIDE3MCwgICAxNzQsICAgMTc4LCAgIDE4MiwgICAxODYsCi0gICAgIDE5MCwgICAxOTQsICAgMTk4LCAgIDIwMwotfTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UgfHwgWVlUT0tFTl9UQUJMRQotLyogWVlUTkFNRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCi0gICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Ci17Ci0gICIkZW5kIiwgImVycm9yIiwgIiR1bmRlZmluZWQiLCAiJz8nIiwgIid8JyIsICInJiciLCAiRVFVT1AyIiwgIkNNUE9QMiIsCi0gICJBRERPUDIiLCAiTVVMT1AyIiwgIichJyIsICJOVU1CRVIiLCAiJzonIiwgIiduJyIsICInKCciLCAiJyknIiwKLSAgIiRhY2NlcHQiLCAic3RhcnQiLCAiZXhwIiwgMAotfTsKLSNlbmRpZgotCi0jIGlmZGVmIFlZUFJJTlQKLS8qIFlZVE9LTlVNW1lZTEVYLU5VTV0gLS0gSW50ZXJuYWwgdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KLSAgIHRva2VuIFlZTEVYLU5VTS4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQxNiB5eXRva251bVtdID0KLXsKLSAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgIDYzLCAgIDEyNCwgICAgMzgsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLAotICAgICAgMzMsICAgMjYyLCAgICA1OCwgICAxMTAsICAgIDQwLCAgICA0MQotfTsKLSMgZW5kaWYKLQotLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9Ci17Ci0gICAgICAgMCwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwKLSAgICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4Ci19OwotCi0vKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9Ci17Ci0gICAgICAgMCwgICAgIDIsICAgICAxLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKLSAgICAgICAyLCAgICAgMSwgICAgIDEsICAgICAzCi19OwotCi0vKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKLSAgIFNUQVRFLU5VTSB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybwotICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eWRlZmFjdFtdID0KLXsKLSAgICAgICAwLCAgICAgMCwgICAgMTIsICAgIDExLCAgICAgMCwgICAgIDAsICAgICAyLCAgICAxMCwgICAgIDAsICAgICAxLAotICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDEzLCAgICAgMCwgICAgIDQsCi0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICAwLCAgICAgMwotfTsKLQotLyogWVlERUZHT1RPW05URVJNLU5VTV0uICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5ZGVmZ290b1tdID0KLXsKLSAgICAgIC0xLCAgICAgNSwgICAgIDYKLX07Ci0KLS8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZwotICAgU1RBVEUtTlVNLiAgKi8KLSNkZWZpbmUgWVlQQUNUX05JTkYgLTEwCi1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwYWN0W10gPQotewotICAgICAgLTksICAgIC05LCAgIC0xMCwgICAtMTAsICAgIC05LCAgICAgOCwgICAgMzYsICAgLTEwLCAgICAxMywgICAtMTAsCi0gICAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LCAgICAtOSwgICAtMTAsICAgIDI2LCAgICA0MSwKLSAgICAgIDQ1LCAgICAxOCwgICAgLTIsICAgIDE0LCAgIC0xMCwgICAgLTksICAgIDM2Ci19OwotCi0vKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLwotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cGdvdG9bXSA9Ci17Ci0gICAgIC0xMCwgICAtMTAsICAgIC0xCi19OwotCi0vKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKLSAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAotICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KLSAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KLSNkZWZpbmUgWVlUQUJMRV9OSU5GIC0xCi1zdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5dGFibGVbXSA9Ci17Ci0gICAgICAgNywgICAgIDEsICAgICAyLCAgICAgOCwgICAgIDMsICAgICA0LCAgICAxNSwgICAgMTYsICAgICA5LCAgICAxOCwKLSAgICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAotICAgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTYsICAgIDI2LCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTAsCi0gICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAxMCwKLSAgICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgICAgMTYsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2Ci19OwotCi1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXljaGVja1tdID0KLXsKLSAgICAgICAxLCAgICAxMCwgICAgMTEsICAgICA0LCAgICAxMywgICAgMTQsICAgICA4LCAgICAgOSwgICAgIDAsICAgIDEwLAotICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsCi0gICAgICAgNywgICAgIDgsICAgICA5LCAgICAgOSwgICAgMjUsICAgICA3LCAgICAgOCwgICAgIDksICAgIDE1LCAgICAgMywKLSAgICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIC0xLCAgICAtMSwgICAgMTIsICAgICAzLAotICAgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCi0gICAgICAgOSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDkKLX07Ci0KLS8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCi0gICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KLXN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlzdG9zW10gPQotewotICAgICAgIDAsICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE0LCAgICAxNywgICAgMTgsICAgIDE4LCAgICAxOCwgICAgIDAsCi0gICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTUsICAgIDE4LCAgICAxOCwKLSAgICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTIsICAgIDE4Ci19OwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJKC0yKQotI2RlZmluZSBZWUVPRgkJMAotCi0jZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKLSNkZWZpbmUgWVlBQk9SVAkJZ290byB5eWFib3J0bGFiCi0jZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJvcmxhYgotCi0KLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKLSAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0KLSNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQotCi0jZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKLWRvCQkJCQkJCQlcCi0gIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCi0gICAgewkJCQkJCQkJXAotICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCi0gICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKLSAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAotICAgICAgWVlQT1BTVEFDSyAoMSk7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgewkJCQkJCQkJXAotICAgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIikpOyBcCi0gICAgICBZWUVSUk9SOwkJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotd2hpbGUgKFlZSUQgKDApKQotCi0KLSNkZWZpbmUgWVlURVJST1IJMQotI2RlZmluZSBZWUVSUkNPREUJMjU2Ci0KLQotLyogWVlMTE9DX0RFRkFVTFQgLS0gU2V0IENVUlJFTlQgdG8gc3BhbiBmcm9tIFJIU1sxXSB0byBSSFNbTl0uCi0gICBJZiBOIGlzIDAsIHRoZW4gc2V0IENVUlJFTlQgdG8gdGhlIGVtcHR5IGxvY2F0aW9uIHdoaWNoIGVuZHMKLSAgIHRoZSBwcmV2aW91cyBzeW1ib2w6IFJIU1swXSAoYWx3YXlzIGRlZmluZWQpLiAgKi8KLQotI2RlZmluZSBZWVJIU0xPQyhSaHMsIEspICgoUmhzKVtLXSkKLSNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKLSMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJXAotICAgIGRvCQkJCQkJCQkJXAotICAgICAgaWYgKFlZSUQgKE4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKLQkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKLQkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCi0JICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKLQl9CQkJCQkJCQlcCi0gICAgICBlbHNlCQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCi0JfQkJCQkJCQkJXAotICAgIHdoaWxlIChZWUlEICgwKSkKLSNlbmRpZgotCi0KLS8qIFlZX0xPQ0FUSU9OX1BSSU5UIC0tIFByaW50IHRoZSBsb2NhdGlvbiBvbiB0aGUgc3RyZWFtLgotICAgVGhpcyBtYWNybyB3YXMgbm90IG1hbmRhdGVkIG9yaWdpbmFsbHk6IGRlZmluZSBvbmx5IGlmIHdlIGtub3cKLSAgIHdlIHdvbid0IGJyZWFrIHVzZXIgY29kZTogd2hlbiB0aGVzZSBhcmUgdGhlIGxvY2F0aW9ucyB3ZSBrbm93LiAgKi8KLQotI2lmbmRlZiBZWV9MT0NBVElPTl9QUklOVAotIyBpZiBZWUxUWVBFX0lTX1RSSVZJQUwKLSMgIGRlZmluZSBZWV9MT0NBVElPTl9QUklOVChGaWxlLCBMb2MpCQkJXAotICAgICBmcHJpbnRmIChGaWxlLCAiJWQuJWQtJWQuJWQiLAkJCVwKLQkgICAgICAoTG9jKS5maXJzdF9saW5lLCAoTG9jKS5maXJzdF9jb2x1bW4sCVwKLQkgICAgICAoTG9jKS5sYXN0X2xpbmUsICAoTG9jKS5sYXN0X2NvbHVtbikKLSMgZWxzZQotIyAgZGVmaW5lIFlZX0xPQ0FUSU9OX1BSSU5UKEZpbGUsIExvYykgKCh2b2lkKSAwKQotIyBlbmRpZgotI2VuZGlmCi0KLQotLyogWVlMRVggLS0gY2FsbGluZyBgeXlsZXgnIHdpdGggdGhlIHJpZ2h0IGFyZ3VtZW50cy4gICovCi0KLSNpZmRlZiBZWUxFWF9QQVJBTQotIyBkZWZpbmUgWVlMRVggeXlsZXggKCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSMgZGVmaW5lIFlZTEVYIHl5bGV4ICgmeXlsdmFsKQotI2VuZGlmCi0KLS8qIEVuYWJsZSBkZWJ1Z2dpbmcgaWYgcmVxdWVzdGVkLiAgKi8KLSNpZiBZWURFQlVHCi0KLSMgaWZuZGVmIFlZRlBSSU5URgotIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLwotIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCi0jIGVuZGlmCi0KLSMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKLWRvIHsJCQkJCQlcCi0gIGlmICh5eWRlYnVnKQkJCQkJXAotICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCi19IHdoaWxlIChZWUlEICgwKSkKLQotIyBkZWZpbmUgWVlfU1lNQk9MX1BSSU5UKFRpdGxlLCBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pCQkJICBcCi1kbyB7CQkJCQkJCQkJICBcCi0gIGlmICh5eWRlYnVnKQkJCQkJCQkJICBcCi0gICAgewkJCQkJCQkJCSAgXAotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIlcyAiLCBUaXRsZSk7CQkJCQkgIFwKLSAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLAkJCQkJCSAgXAotCQkgIFR5cGUsIFZhbHVlKTsgXAotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJCSAgXAotICAgIH0JCQkJCQkJCQkgIFwKLX0gd2hpbGUgKFlZSUQgKDApKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypBUkdTVVNFRCovCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKLSNlbHNlCi1zdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKLSAgICBGSUxFICp5eW91dHB1dDsKLSAgICBpbnQgeXl0eXBlOwotICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLSNlbmRpZgotewotICBpZiAoIXl5dmFsdWVwKQotICAgIHJldHVybjsKLSMgaWZkZWYgWVlQUklOVAotICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQotICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOwotIyBlbHNlCi0gIFlZVVNFICh5eW91dHB1dCk7Ci0jIGVuZGlmCi0gIHN3aXRjaCAoeXl0eXBlKQotICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXN0YXRpYyB2b2lkCi15eV9zeW1ib2xfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCi0jZWxzZQotc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCi0gICAgRklMRSAqeXlvdXRwdXQ7Ci0gICAgaW50IHl5dHlwZTsKLSAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7Ci0jZW5kaWYKLXsKLSAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKLSAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAidG9rZW4gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7Ci0gIGVsc2UKLSAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAibnRlcm0gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7Ci0KLSAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCk7Ci0gIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eV9zdGFja19wcmludCAtLSBQcmludCB0aGUgc3RhdGUgc3RhY2sgZnJvbSBpdHMgQk9UVE9NIHVwIHRvIGl0cyB8Ci18IFRPUCAoaW5jbHVkZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50ICh5eXR5cGVfaW50MTYgKnl5Ym90dG9tLCB5eXR5cGVfaW50MTYgKnl5dG9wKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi15eV9zdGFja19wcmludCAoeXlib3R0b20sIHl5dG9wKQotICAgIHl5dHlwZV9pbnQxNiAqeXlib3R0b207Ci0gICAgeXl0eXBlX2ludDE2ICp5eXRvcDsKLSNlbmRpZgotewotICBZWUZQUklOVEYgKHN0ZGVyciwgIlN0YWNrIG5vdyIpOwotICBmb3IgKDsgeXlib3R0b20gPD0geXl0b3A7IHl5Ym90dG9tKyspCi0gICAgewotICAgICAgaW50IHl5Ym90ID0gKnl5Ym90dG9tOwotICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCB5eWJvdCk7Ci0gICAgfQotICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLSMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0gIGlmICh5eWRlYnVnKQkJCQkJCQlcCi0gICAgeXlfc3RhY2tfcHJpbnQgKChCb3R0b20pLCAoVG9wKSk7CQkJCVwKLX0gd2hpbGUgKFlZSUQgKDApKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCBSZXBvcnQgdGhhdCB0aGUgWVlSVUxFIGlzIGdvaW5nIHRvIGJlIHJlZHVjZWQuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKFlZU1RZUEUgKnl5dnNwLCBpbnQgeXlydWxlKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCB5eXJ1bGUpCi0gICAgWVlTVFlQRSAqeXl2c3A7Ci0gICAgaW50IHl5cnVsZTsKLSNlbmRpZgotewotICBpbnQgeXlucmhzID0geXlyMlt5eXJ1bGVdOwotICBpbnQgeXlpOwotICB1bnNpZ25lZCBsb25nIGludCB5eWxubyA9IHl5cmxpbmVbeXlydWxlXTsKLSAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyBzdGFjayBieSBydWxlICVkIChsaW5lICVsdSk6XG4iLAotCSAgICAgeXlydWxlIC0gMSwgeXlsbm8pOwotICAvKiBUaGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLiAgKi8KLSAgZm9yICh5eWkgPSAwOyB5eWkgPCB5eW5yaHM7IHl5aSsrKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOwotICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsIHl5cmhzW3l5cHJoc1t5eXJ1bGVdICsgeXlpXSwKLQkJICAgICAgICYoeXl2c3BbKHl5aSArIDEpIC0gKHl5bnJocyldKQotCQkgICAgICAgCQkgICAgICAgKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotfQotCi0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKLWRvIHsJCQkJCVwKLSAgaWYgKHl5ZGVidWcpCQkJCVwKLSAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCBSdWxlKTsgXAotfSB3aGlsZSAoWVlJRCAoMCkpCi0KLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAotICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCi1pbnQgeXlkZWJ1ZzsKLSNlbHNlIC8qICFZWURFQlVHICovCi0jIGRlZmluZSBZWURQUklOVEYoQXJncykKLSMgZGVmaW5lIFlZX1NZTUJPTF9QUklOVChUaXRsZSwgVHlwZSwgVmFsdWUsIExvY2F0aW9uKQotIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCi0jIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKLSNlbmRpZiAvKiAhWVlERUJVRyAqLwotCi0KLS8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KLSNpZm5kZWYJWVlJTklUREVQVEgKLSMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAotI2VuZGlmCi0KLS8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5Ci0gICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KLQotICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKLSAgIFlZU1RBQ0tfQUxMT0NfTUFYSU1VTSA8IFlZU1RBQ0tfQllURVMgKFlZTUFYREVQVEgpCi0gICBldmFsdWF0ZWQgd2l0aCBpbmZpbml0ZS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLiAgKi8KLQotI2lmbmRlZiBZWU1BWERFUFRICi0jIGRlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotDAotCi0jaWYgWVlFUlJPUl9WRVJCT1NFCi0KLSMgaWZuZGVmIHl5c3RybGVuCi0jICBpZiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBkZWZpbmVkIF9TVFJJTkdfSAotIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KLSMgIGVsc2UKLS8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKLSNlbHNlCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3RybGVuICh5eXN0cikKLSAgICBjb25zdCBjaGFyICp5eXN0cjsKLSNlbmRpZgotewotICBZWVNJWkVfVCB5eWxlbjsKLSAgZm9yICh5eWxlbiA9IDA7IHl5c3RyW3l5bGVuXTsgeXlsZW4rKykKLSAgICBjb250aW51ZTsKLSAgcmV0dXJuIHl5bGVuOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLQotIyBpZm5kZWYgeXlzdHBjcHkKLSMgIGlmIGRlZmluZWQgX19HTElCQ19fICYmIGRlZmluZWQgX1NUUklOR19IICYmIGRlZmluZWQgX0dOVV9TT1VSQ0UKLSMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5Ci0jICBlbHNlCi0vKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCi0gICBZWURFU1QuICAqLwotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLXN0YXRpYyBjaGFyICoKLXl5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQotI2Vsc2UKLXN0YXRpYyBjaGFyICoKLXl5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQotICAgIGNoYXIgKnl5ZGVzdDsKLSAgICBjb25zdCBjaGFyICp5eXNyYzsKLSNlbmRpZgotewotICBjaGFyICp5eWQgPSB5eWRlc3Q7Ci0gIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3JjOwotCi0gIHdoaWxlICgoKnl5ZCsrID0gKnl5cysrKSAhPSAnXDAnKQotICAgIGNvbnRpbnVlOwotCi0gIHJldHVybiB5eWQgLSAxOwotfQotIyAgZW5kaWYKLSMgZW5kaWYKLQotIyBpZm5kZWYgeXl0bmFtZXJyCi0vKiBDb3B5IHRvIFlZUkVTIHRoZSBjb250ZW50cyBvZiBZWVNUUiBhZnRlciBzdHJpcHBpbmcgYXdheSB1bm5lY2Vzc2FyeQotICAgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcywgc28gdGhhdCBpdCdzIHN1aXRhYmxlIGZvciB5eWVycm9yLiAgVGhlCi0gICBoZXVyaXN0aWMgaXMgdGhhdCBkb3VibGUtcXVvdGluZyBpcyB1bm5lY2Vzc2FyeSB1bmxlc3MgdGhlIHN0cmluZwotICAgY29udGFpbnMgYW4gYXBvc3Ryb3BoZSwgYSBjb21tYSwgb3IgYmFja3NsYXNoIChvdGhlciB0aGFuCi0gICBiYWNrc2xhc2gtYmFja3NsYXNoKS4gIFlZU1RSIGlzIHRha2VuIGZyb20geXl0bmFtZS4gIElmIFlZUkVTIGlzCi0gICBudWxsLCBkbyBub3QgY29weTsgaW5zdGVhZCwgcmV0dXJuIHRoZSBsZW5ndGggb2Ygd2hhdCB0aGUgcmVzdWx0Ci0gICB3b3VsZCBoYXZlIGJlZW4uICAqLwotc3RhdGljIFlZU0laRV9UCi15eXRuYW1lcnIgKGNoYXIgKnl5cmVzLCBjb25zdCBjaGFyICp5eXN0cikKLXsKLSAgaWYgKCp5eXN0ciA9PSAnIicpCi0gICAgewotICAgICAgWVlTSVpFX1QgeXluID0gMDsKLSAgICAgIGNoYXIgY29uc3QgKnl5cCA9IHl5c3RyOwotCi0gICAgICBmb3IgKDs7KQotCXN3aXRjaCAoKisreXlwKQotCSAgewotCSAgY2FzZSAnXCcnOgotCSAgY2FzZSAnLCc6Ci0JICAgIGdvdG8gZG9fbm90X3N0cmlwX3F1b3RlczsKLQotCSAgY2FzZSAnXFwnOgotCSAgICBpZiAoKisreXlwICE9ICdcXCcpCi0JICAgICAgZ290byBkb19ub3Rfc3RyaXBfcXVvdGVzOwotCSAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgZGVmYXVsdDoKLQkgICAgaWYgKHl5cmVzKQotCSAgICAgIHl5cmVzW3l5bl0gPSAqeXlwOwotCSAgICB5eW4rKzsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJyInOgotCSAgICBpZiAoeXlyZXMpCi0JICAgICAgeXlyZXNbeXluXSA9ICdcMCc7Ci0JICAgIHJldHVybiB5eW47Ci0JICB9Ci0gICAgZG9fbm90X3N0cmlwX3F1b3RlczogOwotICAgIH0KLQotICBpZiAoISB5eXJlcykKLSAgICByZXR1cm4geXlzdHJsZW4gKHl5c3RyKTsKLQotICByZXR1cm4geXlzdHBjcHkgKHl5cmVzLCB5eXN0cikgLSB5eXJlczsKLX0KLSMgZW5kaWYKLQotLyogQ29weSBpbnRvIFlZUkVTVUxUIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdGhlIHVuZXhwZWN0ZWQgdG9rZW4KLSAgIFlZQ0hBUiB3aGlsZSBpbiBzdGF0ZSBZWVNUQVRFLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAotICAgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuICBJZiBZWVJFU1VMVCBpcyBudWxsLCBkbyBub3QKLSAgIGNvcHkgYW55dGhpbmc7IGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZQotICAgY29waWVkLiAgQXMgYSBzcGVjaWFsIGNhc2UsIHJldHVybiAwIGlmIGFuIG9yZGluYXJ5ICJzeW50YXggZXJyb3IiCi0gICBtZXNzYWdlIHdpbGwgZG8uICBSZXR1cm4gWVlTSVpFX01BWElNVU0gaWYgb3ZlcmZsb3cgb2NjdXJzIGR1cmluZwotICAgc2l6ZSBjYWxjdWxhdGlvbi4gICovCi1zdGF0aWMgWVlTSVpFX1QKLXl5c3ludGF4X2Vycm9yIChjaGFyICp5eXJlc3VsdCwgaW50IHl5c3RhdGUsIGludCB5eWNoYXIpCi17Ci0gIGludCB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgaWYgKCEgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8PSBZWUxBU1QpKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgewotICAgICAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwotICAgICAgWVlTSVpFX1QgeXlzaXplMCA9IHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXR5cGVdKTsKLSAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c2l6ZTA7Ci0gICAgICBZWVNJWkVfVCB5eXNpemUxOwotICAgICAgaW50IHl5c2l6ZV9vdmVyZmxvdyA9IDA7Ci0gICAgICBlbnVtIHsgWVlFUlJPUl9WRVJCT1NFX0FSR1NfTUFYSU1VTSA9IDUgfTsKLSAgICAgIGNoYXIgY29uc3QgKnl5YXJnW1lZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU1dOwotICAgICAgaW50IHl5eDsKLQotIyBpZiAwCi0gICAgICAvKiBUaGlzIGlzIHNvIHhnZXR0ZXh0IHNlZXMgdGhlIHRyYW5zbGF0YWJsZSBmb3JtYXRzIHRoYXQgYXJlCi0JIGNvbnN0cnVjdGVkIG9uIHRoZSBmbHkuICAqLwotICAgICAgWVlfKCJzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMiKTsKLSAgICAgIFlZXygic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMgb3IgJXMiKTsKLSMgZW5kaWYKLSAgICAgIGNoYXIgKnl5Zm10OwotICAgICAgY2hhciBjb25zdCAqeXlmOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXl1bmV4cGVjdGVkW10gPSAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzIjsKLSAgICAgIHN0YXRpYyBjaGFyIGNvbnN0IHl5ZXhwZWN0aW5nW10gPSAiLCBleHBlY3RpbmcgJXMiOwotICAgICAgc3RhdGljIGNoYXIgY29uc3QgeXlvcltdID0gIiBvciAlcyI7Ci0gICAgICBjaGFyIHl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQKLQkJICAgICsgc2l6ZW9mIHl5ZXhwZWN0aW5nIC0gMQotCQkgICAgKyAoKFlZRVJST1JfVkVSQk9TRV9BUkdTX01BWElNVU0gLSAyKQotCQkgICAgICAgKiAoc2l6ZW9mIHl5b3IgLSAxKSldOwotICAgICAgY2hhciBjb25zdCAqeXlwcmVmaXggPSB5eWV4cGVjdGluZzsKLQotICAgICAgLyogU3RhcnQgWVlYIGF0IC1ZWU4gaWYgbmVnYXRpdmUgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbgotCSBZWUNIRUNLLiAgKi8KLSAgICAgIGludCB5eXhiZWdpbiA9IHl5biA8IDAgPyAteXluIDogMDsKLQotICAgICAgLyogU3RheSB3aXRoaW4gYm91bmRzIG9mIGJvdGggeXljaGVjayBhbmQgeXl0bmFtZS4gICovCi0gICAgICBpbnQgeXljaGVja2xpbSA9IFlZTEFTVCAtIHl5biArIDE7Ci0gICAgICBpbnQgeXl4ZW5kID0geXljaGVja2xpbSA8IFlZTlRPS0VOUyA/IHl5Y2hlY2tsaW0gOiBZWU5UT0tFTlM7Ci0gICAgICBpbnQgeXljb3VudCA9IDE7Ci0KLSAgICAgIHl5YXJnWzBdID0geXl0bmFtZVt5eXR5cGVdOwotICAgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmb3JtYXQsIHl5dW5leHBlY3RlZCk7Ci0KLSAgICAgIGZvciAoeXl4ID0geXl4YmVnaW47IHl5eCA8IHl5eGVuZDsgKyt5eXgpCi0JaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQotCSAgewotCSAgICBpZiAoeXljb3VudCA9PSBZWUVSUk9SX1ZFUkJPU0VfQVJHU19NQVhJTVVNKQotCSAgICAgIHsKLQkJeXljb3VudCA9IDE7Ci0JCXl5c2l6ZSA9IHl5c2l6ZTA7Ci0JCXl5Zm9ybWF0W3NpemVvZiB5eXVuZXhwZWN0ZWQgLSAxXSA9ICdcMCc7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgeXlhcmdbeXljb3VudCsrXSA9IHl5dG5hbWVbeXl4XTsKLQkgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5dG5hbWVyciAoMCwgeXl0bmFtZVt5eXhdKTsKLQkgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLQkgICAgeXlzaXplID0geXlzaXplMTsKLQkgICAgeXlmbXQgPSB5eXN0cGNweSAoeXlmbXQsIHl5cHJlZml4KTsKLQkgICAgeXlwcmVmaXggPSB5eW9yOwotCSAgfQotCi0gICAgICB5eWYgPSBZWV8oeXlmb3JtYXQpOwotICAgICAgeXlzaXplMSA9IHl5c2l6ZSArIHl5c3RybGVuICh5eWYpOwotICAgICAgeXlzaXplX292ZXJmbG93IHw9ICh5eXNpemUxIDwgeXlzaXplKTsKLSAgICAgIHl5c2l6ZSA9IHl5c2l6ZTE7Ci0KLSAgICAgIGlmICh5eXNpemVfb3ZlcmZsb3cpCi0JcmV0dXJuIFlZU0laRV9NQVhJTVVNOwotCi0gICAgICBpZiAoeXlyZXN1bHQpCi0JewotCSAgLyogQXZvaWQgc3ByaW50ZiwgYXMgdGhhdCBpbmZyaW5nZXMgb24gdGhlIHVzZXIncyBuYW1lIHNwYWNlLgotCSAgICAgRG9uJ3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgZXZlbiBpZiB0aGUgdHJhbnNsYXRpb24KLQkgICAgIHByb2R1Y2VkIGEgc3RyaW5nIHdpdGggdGhlIHdyb25nIG51bWJlciBvZiAiJXMicy4gICovCi0JICBjaGFyICp5eXAgPSB5eXJlc3VsdDsKLQkgIGludCB5eWkgPSAwOwotCSAgd2hpbGUgKCgqeXlwID0gKnl5ZikgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGlmICgqeXlwID09ICclJyAmJiB5eWZbMV0gPT0gJ3MnICYmIHl5aSA8IHl5Y291bnQpCi0JCXsKLQkJICB5eXAgKz0geXl0bmFtZXJyICh5eXAsIHl5YXJnW3l5aSsrXSk7Ci0JCSAgeXlmICs9IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB5eXArKzsKLQkJICB5eWYrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIHl5c2l6ZTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0MCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLypBUkdTVVNFRCovCi0jaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKLSAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQotc3RhdGljIHZvaWQKLXl5ZGVzdHJ1Y3QgKGNvbnN0IGNoYXIgKnl5bXNnLCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKLSNlbHNlCi1zdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXApCi0gICAgY29uc3QgY2hhciAqeXltc2c7Ci0gICAgaW50IHl5dHlwZTsKLSAgICBZWVNUWVBFICp5eXZhbHVlcDsKLSNlbmRpZgotewotICBZWVVTRSAoeXl2YWx1ZXApOwotCi0gIGlmICgheXltc2cpCi0gICAgeXltc2cgPSAiRGVsZXRpbmciOwotICBZWV9TWU1CT0xfUFJJTlQgKHl5bXNnLCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7Ci0KLSAgc3dpdGNoICh5eXR5cGUpCi0gICAgewotCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLX0KLQwKLQotLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZiBkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMKLWludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKTsKLSNlbHNlCi1pbnQgeXlwYXJzZSAoKTsKLSNlbmRpZgotI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jZWxzZQotaW50IHl5cGFyc2UgKCk7Ci0jZW5kaWYKLSNlbmRpZiAvKiAhIFlZUEFSU0VfUEFSQU0gKi8KLQotCi0KLQotCi0KLS8qLS0tLS0tLS0tLS4KLXwgeXlwYXJzZS4gIHwKLWAtLS0tLS0tLS0tKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAotICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCi1pbnQKLXl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pCi0jZWxzZQotaW50Ci15eXBhcnNlIChZWVBBUlNFX1BBUkFNKQotICAgIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jZW5kaWYKLSNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLwotI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCi0gICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKLWludAoteXlwYXJzZSAodm9pZCkKLSNlbHNlCi1pbnQKLXl5cGFyc2UgKCkKLQotI2VuZGlmCi0jZW5kaWYKLXsKLSAgLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwotaW50IHl5Y2hhcjsKLQotLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KLVlZU1RZUEUgeXlsdmFsOwotCi0vKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwotaW50IHl5bmVycnM7Ci0KLSAgaW50IHl5c3RhdGU7Ci0gIGludCB5eW47Ci0gIGludCB5eXJlc3VsdDsKLSAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCi0gIGludCB5eWVycnN0YXR1czsKLSAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLwotICBpbnQgeXl0b2tlbiA9IDA7Ci0jaWYgWVlFUlJPUl9WRVJCT1NFCi0gIC8qIEJ1ZmZlciBmb3IgZXJyb3IgbWVzc2FnZXMsIGFuZCBpdHMgYWxsb2NhdGVkIHNpemUuICAqLwotICBjaGFyIHl5bXNnYnVmWzEyOF07Ci0gIGNoYXIgKnl5bXNnID0geXltc2didWY7Ci0gIFlZU0laRV9UIHl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOwotI2VuZGlmCi0KLSAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKLSAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKLSAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKLSAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KLQotICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKLSAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCi0KLSAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KLSAgeXl0eXBlX2ludDE2IHl5c3NhW1lZSU5JVERFUFRIXTsKLSAgeXl0eXBlX2ludDE2ICp5eXNzID0geXlzc2E7Ci0gIHl5dHlwZV9pbnQxNiAqeXlzc3A7Ci0KLSAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KLSAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07Ci0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKLSAgWVlTVFlQRSAqeXl2c3A7Ci0KLQotCi0jZGVmaW5lIFlZUE9QU1RBQ0soTikgICAoeXl2c3AgLT0gKE4pLCB5eXNzcCAtPSAoTikpCi0KLSAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQotICAgICBhY3Rpb24gcm91dGluZXMuICAqLwotICBZWVNUWVBFIHl5dmFsOwotCi0KLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQgcnVsZS4KLSAgICAgS2VlcCB0byB6ZXJvIHdoZW4gbm8gc3ltYm9sIHNob3VsZCBiZSBwb3BwZWQuICAqLwotICBpbnQgeXlsZW4gPSAwOwotCi0gIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7Ci0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3M7Ci0gIHl5dnNwID0geXl2czsKLQotICBnb3RvIHl5c2V0c3RhdGU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSB5eW5ld3N0YXRlOgotICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcwotICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuICBTbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KLSAgeXlzc3ArKzsKLQotIHl5c2V0c3RhdGU6Ci0gICp5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCi0gICAgewotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBZWVNJWkVfVCB5eXNpemUgPSB5eXNzcCAtIHl5c3MgKyAxOwotCi0jaWZkZWYgeXlvdmVyZmxvdwotICAgICAgewotCS8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjay4gIFVzZSBjb3BpZXMgb2YKLQkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCi0JICAgbWVtb3J5LiAgKi8KLQlZWVNUWVBFICp5eXZzMSA9IHl5dnM7Ci0JeXl0eXBlX2ludDE2ICp5eXNzMSA9IHl5c3M7Ci0KLQotCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQotCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKLQkgICBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsIGJ1dCB0aGF0IG1pZ2h0Ci0JICAgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCi0JeXlvdmVyZmxvdyAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIiksCi0JCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCi0JCSAgICAmeXlzdGFja3NpemUpOwotCi0JeXlzcyA9IHl5c3MxOwotCXl5dnMgPSB5eXZzMTsKLSAgICAgIH0KLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKLSAgICAgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0jIGVsc2UKLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKFlZTUFYREVQVEggPD0geXlzdGFja3NpemUpCi0JZ290byB5eWV4aGF1c3RlZGxhYjsKLSAgICAgIHl5c3RhY2tzaXplICo9IDI7Ci0gICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQotCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKLQotICAgICAgewotCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KLQkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7Ci0JaWYgKCEgeXlwdHIpCi0JICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3MpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnMpOwotCi0jICB1bmRlZiBZWVNUQUNLX1JFTE9DQVRFCi0JaWYgKHl5c3MxICE9IHl5c3NhKQotCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7Ci0gICAgICB9Ci0jIGVuZGlmCi0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotCi0gICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOwotICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKLQotCi0gICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCi0JCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOwotCi0gICAgICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKLQlZWUFCT1JUOwotICAgIH0KLQotICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOwotCi0gIGlmICh5eXN0YXRlID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgZ290byB5eWJhY2t1cDsKLQotLyotLS0tLS0tLS0tLS4KLXwgeXliYWNrdXAuICB8Ci1gLS0tLS0tLS0tLS0qLwoteXliYWNrdXA6Ci0KLSAgLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gIFJlYWQgYQotICAgICBsb29rYWhlYWQgdG9rZW4gaWYgd2UgbmVlZCBvbmUgYW5kIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiBZWUNIQVIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0Ygb3IgYSB2YWxpZCBsb29rYWhlYWQgc3ltYm9sLiAgKi8KLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotICAgIHsKLSAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOwotICAgICAgeXljaGFyID0gWVlMRVg7Ci0gICAgfQotCi0gIGlmICh5eWNoYXIgPD0gWVlFT0YpCi0gICAgewotICAgICAgeXljaGFyID0geXl0b2tlbiA9IFlZRU9GOwotICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7Ci0gICAgICBZWV9TWU1CT0xfUFJJTlQgKCJOZXh0IHRva2VuIGlzIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBwcm9wZXIgYWN0aW9uIG9uIHNlZWluZyB0b2tlbiBZWVRPS0VOIGlzIHRvIHJlZHVjZSBvciB0bwotICAgICBkZXRlY3QgYW4gZXJyb3IsIHRha2UgdGhhdCBhY3Rpb24uICAqLwotICB5eW4gKz0geXl0b2tlbjsKLSAgaWYgKHl5biA8IDAgfHwgWVlMQVNUIDwgeXluIHx8IHl5Y2hlY2tbeXluXSAhPSB5eXRva2VuKQotICAgIGdvdG8geXlkZWZhdWx0OwotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0gIGlmICh5eW4gPD0gMCkKLSAgICB7Ci0gICAgICBpZiAoeXluID09IDAgfHwgeXluID09IFlZVEFCTEVfTklORikKLQlnb3RvIHl5ZXJybGFiOwotICAgICAgeXluID0gLXl5bjsKLSAgICAgIGdvdG8geXlyZWR1Y2U7Ci0gICAgfQotCi0gIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKLSAgICAgc3RhdHVzLiAgKi8KLSAgaWYgKHl5ZXJyc3RhdHVzKQotICAgIHl5ZXJyc3RhdHVzLS07Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0gIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7Ci0KLSAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbi4gICovCi0gIHl5Y2hhciA9IFlZRU1QVFk7Ci0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0KLSAgZ290byB5eW5ld3N0YXRlOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXl5ZGVmYXVsdDoKLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotICBnb3RvIHl5cmVkdWNlOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXl5cmVkdWNlOgotICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwotICB5eWxlbiA9IHl5cjJbeXluXTsKLQotICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKLSAgICAgYCQkID0gJDEnLgotCi0gICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gZ2FyYmFnZS4KLSAgICAgVGhpcyBiZWhhdmlvciBpcyB1bmRvY3VtZW50ZWQgYW5kIEJpc29uCi0gICAgIHVzZXJzIHNob3VsZCBub3QgcmVseSB1cG9uIGl0LiAgQXNzaWduaW5nIHRvIFlZVkFMCi0gICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQotICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLwotICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOwotCi0KLSAgWVlfUkVEVUNFX1BSSU5UICh5eW4pOwotICBzd2l0Y2ggKHl5bikKLSAgICB7Ci0gICAgICAgIGNhc2UgMjoKLS8qIExpbmUgMTI2OSBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTU1ICJwbHVyYWwueSIKLSAgICB7Ci0JICAgIGlmICgoeXl2c3BbKDEpIC0gKDEpXS5leHApID09IE5VTEwpCi0JICAgICAgWVlBQk9SVDsKLQkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSAoeXl2c3BbKDEpIC0gKDEpXS5leHApOwotCSAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgMzoKLS8qIExpbmUgMTI2OSBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTYzICJwbHVyYWwueSIKLSAgICB7Ci0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8zIChxbW9wLCAoeXl2c3BbKDEpIC0gKDUpXS5leHApLCAoeXl2c3BbKDMpIC0gKDUpXS5leHApLCAoeXl2c3BbKDUpIC0gKDUpXS5leHApKTsKLQkgIH0KLSAgICBicmVhazsKLQotICBjYXNlIDQ6Ci0vKiBMaW5lIDEyNjkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDE2NyAicGx1cmFsLnkiCi0gICAgewotCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAobG9yLCAoeXl2c3BbKDEpIC0gKDMpXS5leHApLCAoeXl2c3BbKDMpIC0gKDMpXS5leHApKTsKLQkgIH0KLSAgICBicmVhazsKLQotICBjYXNlIDU6Ci0vKiBMaW5lIDEyNjkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDE3MSAicGx1cmFsLnkiCi0gICAgewotCSAgICAoeXl2YWwuZXhwKSA9IG5ld19leHBfMiAobGFuZCwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA2OgotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxNzUgInBsdXJhbC55IgotICAgIHsKLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA3OgotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxNzkgInBsdXJhbC55IgotICAgIHsKLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA4OgotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxODMgInBsdXJhbC55IgotICAgIHsKLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSA5OgotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxODcgInBsdXJhbC55IgotICAgIHsKLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzIgKCh5eXZzcFsoMikgLSAoMyldLm9wKSwgKHl5dnNwWygxKSAtICgzKV0uZXhwKSwgKHl5dnNwWygzKSAtICgzKV0uZXhwKSk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDoKLS8qIExpbmUgMTI2OSBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTkxICJwbHVyYWwueSIKLSAgICB7Ci0JICAgICh5eXZhbC5leHApID0gbmV3X2V4cF8xIChsbm90LCAoeXl2c3BbKDIpIC0gKDIpXS5leHApKTsKLQkgIH0KLSAgICBicmVhazsKLQotICBjYXNlIDExOgotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxOTUgInBsdXJhbC55IgotICAgIHsKLQkgICAgKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzAgKHZhcik7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMjoKLS8qIExpbmUgMTI2OSBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTk5ICJwbHVyYWwueSIKLSAgICB7Ci0JICAgIGlmICgoKHl5dmFsLmV4cCkgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCi0JICAgICAgKHl5dmFsLmV4cCktPnZhbC5udW0gPSAoeXl2c3BbKDEpIC0gKDEpXS5udW0pOwotCSAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTM6Ci0vKiBMaW5lIDEyNjkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDIwNCAicGx1cmFsLnkiCi0gICAgewotCSAgICAoeXl2YWwuZXhwKSA9ICh5eXZzcFsoMikgLSAoMyldLmV4cCk7Ci0JICB9Ci0gICAgYnJlYWs7Ci0KLQotLyogTGluZSAxMjY5IG9mIHlhY2MuYy4gICovCi0jbGluZSAxNTcyICJwbHVyYWwuYyIKLSAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgIH0KLSAgWVlfU1lNQk9MX1BSSU5UICgiLT4gJCQgPSIsIHl5cjFbeXluXSwgJnl5dmFsLCAmeXlsb2MpOwotCi0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLSAgeXlsZW4gPSAwOwotICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLQotICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQotICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKLSAgICAgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UT0tFTlNdICsgKnl5c3NwOwotICBpZiAoMCA8PSB5eXN0YXRlICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOwotICBlbHNlCi0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UT0tFTlNdOwotCi0gIGdvdG8geXluZXdzdGF0ZTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLXwgeXllcnJsYWIgLS0gaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWVycmxhYjoKLSAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0gIGlmICgheXllcnJzdGF0dXMpCi0gICAgewotICAgICAgKyt5eW5lcnJzOwotI2lmICEgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eWVycm9yIChZWV8oInN5bnRheCBlcnJvciIpKTsKLSNlbHNlCi0gICAgICB7Ci0JWVlTSVpFX1QgeXlzaXplID0geXlzeW50YXhfZXJyb3IgKDAsIHl5c3RhdGUsIHl5Y2hhcik7Ci0JaWYgKHl5bXNnX2FsbG9jIDwgeXlzaXplICYmIHl5bXNnX2FsbG9jIDwgWVlTVEFDS19BTExPQ19NQVhJTVVNKQotCSAgewotCSAgICBZWVNJWkVfVCB5eWFsbG9jID0gMiAqIHl5c2l6ZTsKLQkgICAgaWYgKCEgKHl5c2l6ZSA8PSB5eWFsbG9jICYmIHl5YWxsb2MgPD0gWVlTVEFDS19BTExPQ19NQVhJTVVNKSkKLQkgICAgICB5eWFsbG9jID0gWVlTVEFDS19BTExPQ19NQVhJTVVNOwotCSAgICBpZiAoeXltc2cgIT0geXltc2didWYpCi0JICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7Ci0JICAgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlhbGxvYyk7Ci0JICAgIGlmICh5eW1zZykKLQkgICAgICB5eW1zZ19hbGxvYyA9IHl5YWxsb2M7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXl5bXNnID0geXltc2didWY7Ci0JCXl5bXNnX2FsbG9jID0gc2l6ZW9mIHl5bXNnYnVmOwotCSAgICAgIH0KLQkgIH0KLQotCWlmICgwIDwgeXlzaXplICYmIHl5c2l6ZSA8PSB5eW1zZ19hbGxvYykKLQkgIHsKLQkgICAgKHZvaWQpIHl5c3ludGF4X2Vycm9yICh5eW1zZywgeXlzdGF0ZSwgeXljaGFyKTsKLQkgICAgeXllcnJvciAoeXltc2cpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgeXllcnJvciAoWVlfKCJzeW50YXggZXJyb3IiKSk7Ci0JICAgIGlmICh5eXNpemUgIT0gMCkKLQkgICAgICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0KLQotICBpZiAoeXllcnJzdGF0dXMgPT0gMykKLSAgICB7Ci0gICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCi0JIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KLQotICAgICAgaWYgKHl5Y2hhciA8PSBZWUVPRikKLQl7Ci0JICAvKiBSZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQuICAqLwotCSAgaWYgKHl5Y2hhciA9PSBZWUVPRikKLQkgICAgWVlBQk9SVDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKLQkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCk7Ci0JICB5eWNoYXIgPSBZWUVNUFRZOwotCX0KLSAgICB9Ci0KLSAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCi0gICAgIHRva2VuLiAgKi8KLSAgZ290byB5eWVycmxhYjE7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZXJyb3JsYWIgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgWVlFUlJPUi4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXllcnJvcmxhYjoKLQotICAvKiBQYWNpZnkgY29tcGlsZXJzIGxpa2UgR0NDIHdoZW4gdGhlIHVzZXIgY29kZSBuZXZlciBpbnZva2VzCi0gICAgIFlZRVJST1IgYW5kIHRoZSBsYWJlbCB5eWVycm9ybGFiIHRoZXJlZm9yZSBuZXZlciBhcHBlYXJzIGluIHVzZXIKLSAgICAgY29kZS4gICovCi0gIGlmICgvKkNPTlNUQ09ORCovIDApCi0gICAgIGdvdG8geXllcnJvcmxhYjsKLQotICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCi0gICAgIHRoaXMgWVlFUlJPUi4gICovCi0gIFlZUE9QU1RBQ0sgKHl5bGVuKTsKLSAgeXlsZW4gPSAwOwotICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwotICB5eXN0YXRlID0gKnl5c3NwOwotICBnb3RvIHl5ZXJybGFiMTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5ZXJybGFiMSAtLSBjb21tb24gY29kZSBmb3IgYm90aCBzeW50YXggZXJyb3IgYW5kIFlZRVJST1IuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWVycmxhYjE6Ci0gIHl5ZXJyc3RhdHVzID0gMzsJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzLiAgKi8KLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgICAgIGlmICh5eW4gIT0gWVlQQUNUX05JTkYpCi0JewotCSAgeXluICs9IFlZVEVSUk9SOwotCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQotCSAgICB7Ci0JICAgICAgeXluID0geXl0YWJsZVt5eW5dOwotCSAgICAgIGlmICgwIDwgeXluKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLwotICAgICAgaWYgKHl5c3NwID09IHl5c3MpCi0JWVlBQk9SVDsKLQotCi0gICAgICB5eWRlc3RydWN0ICgiRXJyb3I6IHBvcHBpbmciLAotCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOwotICAgICAgWVlQT1BTVEFDSyAoMSk7Ci0gICAgICB5eXN0YXRlID0gKnl5c3NwOwotICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKLSAgICB9Ci0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0KLQotICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLwotICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOwotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi18IHl5YWNjZXB0bGFiIC0tIFlZQUNDRVBUIGNvbWVzIGhlcmUuICB8Ci1gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWFjY2VwdGxhYjoKLSAgeXlyZXN1bHQgPSAwOwotICBnb3RvIHl5cmV0dXJuOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWFib3J0bGFiIC0tIFlZQUJPUlQgY29tZXMgaGVyZS4gIHwKLWAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi15eWFib3J0bGFiOgotICB5eXJlc3VsdCA9IDE7Ci0gIGdvdG8geXlyZXR1cm47Ci0KLSNpZm5kZWYgeXlvdmVyZmxvdwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotfCB5eWV4aGF1c3RlZGxhYiAtLSBtZW1vcnkgZXhoYXVzdGlvbiBjb21lcyBoZXJlLiAgfAotYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoteXlleGhhdXN0ZWRsYWI6Ci0gIHl5ZXJyb3IgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpKTsKLSAgeXlyZXN1bHQgPSAyOwotICAvKiBGYWxsIHRocm91Z2guICAqLwotI2VuZGlmCi0KLXl5cmV0dXJuOgotICBpZiAoeXljaGFyICE9IFlZRU1QVFkpCi0gICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBkaXNjYXJkaW5nIGxvb2thaGVhZCIsCi0JCSB5eXRva2VuLCAmeXlsdmFsKTsKLSAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAotICAgICB0aGlzIFlZQUJPUlQgb3IgWVlBQ0NFUFQuICAqLwotICBZWVBPUFNUQUNLICh5eWxlbik7Ci0gIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7Ci0gIHdoaWxlICh5eXNzcCAhPSB5eXNzKQotICAgIHsKLSAgICAgIHl5ZGVzdHJ1Y3QgKCJDbGVhbnVwOiBwb3BwaW5nIiwKLQkJICB5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOwotICAgICAgWVlQT1BTVEFDSyAoMSk7Ci0gICAgfQotI2lmbmRlZiB5eW92ZXJmbG93Ci0gIGlmICh5eXNzICE9IHl5c3NhKQotICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7Ci0jZW5kaWYKLSNpZiBZWUVSUk9SX1ZFUkJPU0UKLSAgaWYgKHl5bXNnICE9IHl5bXNnYnVmKQotICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOwotI2VuZGlmCi0gIC8qIE1ha2Ugc3VyZSBZWUlEIGlzIHVzZWQuICAqLwotICByZXR1cm4gWVlJRCAoeXlyZXN1bHQpOwotfQotCi0KLS8qIExpbmUgMTQ4NiBvZiB5YWNjLmMuICAqLwotI2xpbmUgMjA5ICJwbHVyYWwueSIKLQotCi12b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQotewotICBpZiAoZXhwID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLwotICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCi0gICAgewotICAgIGNhc2UgMzoKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgMjoKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgMToKLSAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZnJlZSAoZXhwKTsKLX0KLQotCi1zdGF0aWMgaW50Ci15eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCi17Ci0gIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOwotICBpbnQgcmVzdWx0OwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKLQl7Ci0JICAqcGV4cCA9IGV4cDsKLQkgIHJldHVybiBZWUVPRjsKLQl9Ci0KLSAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQotCWJyZWFrOwotCi0gICAgICArK2V4cDsKLSAgICB9Ci0KLSAgcmVzdWx0ID0gKmV4cCsrOwotICBzd2l0Y2ggKHJlc3VsdCkKLSAgICB7Ci0gICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOwotCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCi0JICB7Ci0JICAgIG4gKj0gMTA7Ci0JICAgIG4gKz0gZXhwWzBdIC0gJzAnOwotCSAgICArK2V4cDsKLQkgIH0KLQlsdmFsLT5udW0gPSBuOwotCXJlc3VsdCA9IE5VTUJFUjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPSc6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gZXF1YWw7Ci0JICByZXN1bHQgPSBFUVVPUDI7Ci0JfQotICAgICAgZWxzZQotCXJlc3VsdCA9IFlZRVJSQ09ERTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnISc6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gbm90X2VxdWFsOwotCSAgcmVzdWx0ID0gRVFVT1AyOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnfCc6Ci0gICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKLQkrK2V4cDsKLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7Ci0JfQotICAgICAgZWxzZQotCWx2YWwtPm9wID0gbGVzc190aGFuOwotICAgICAgcmVzdWx0ID0gQ01QT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc+JzoKLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotCXsKLQkgICsrZXhwOwotCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOwotCX0KLSAgICAgIGVsc2UKLQlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKic6Ci0gICAgICBsdmFsLT5vcCA9IG11bHQ7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy8nOgotICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyUnOgotICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7Ci0gICAgICByZXN1bHQgPSBNVUxPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgbHZhbC0+b3AgPSBwbHVzOwotICAgICAgcmVzdWx0ID0gQURET1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICAgIGx2YWwtPm9wID0gbWludXM7Ci0gICAgICByZXN1bHQgPSBBRERPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJzonOgotICAgIGNhc2UgJygnOgotICAgIGNhc2UgJyknOgotICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzsnOgotICAgIGNhc2UgJ1xuJzoKLSAgICBjYXNlICdcMCc6Ci0gICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KLSAgICAgIC0tZXhwOwotICAgICAgcmVzdWx0ID0gWVlFT0Y7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXN1bHQgPSBZWUVSUkNPREU7Ci0jaWYgWVlERUJVRyAhPSAwCi0gICAgICAtLWV4cDsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICpwZXhwID0gZXhwOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLwotfQotCmRpZmYgLS1naXQgYS9pbnRsL3BsdXJhbC55IGIvaW50bC9wbHVyYWwueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzNmEwOS4uMDAwMDAwMAotLS0gYS9pbnRsL3BsdXJhbC55CisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLSV7Ci0vKiBFeHByZXNzaW9uIHBhcnNpbmcgZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxLCAyMDAzLCAyMDA1LTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLS8qIEZvciBiaXNvbiA8IDIuMCwgdGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMKLSAgIHRvIHB1dCB0aGlzIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4KLSAgIGJpc29uJ3Mgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+Ci0gICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLgotICAgVGhpcyBjYW4gZ28gYXdheSBvbmNlIHRoZSBBTV9JTlRMX1NVQkRJUiBtYWNybyByZXF1aXJlcyBiaXNvbiA+PSAyLjAuICAqLwotI2lmIGRlZmluZWQgX0FJWCAmJiAhZGVmaW5lZCBfX0dOVUNfXwotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKLQotLyogVGhlIG1haW4gZnVuY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSBwYXJzZXIgaXMgY2FsbGVkIF9fZ2V0dGV4dHBhcnNlLAotICAgYnV0IHdlIHdhbnQgaXQgdG8gYmUgY2FsbGVkIFBMVVJBTF9QQVJTRS4gICovCi0jaWZuZGVmIF9MSUJDCi0jIGRlZmluZSBfX2dldHRleHRwYXJzZSBQTFVSQUxfUEFSU0UKLSNlbmRpZgotCi0jZGVmaW5lIFlZTEVYX1BBUkFNCSYoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPmNwCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU0JYXJnCi0lfQotJXB1cmVfcGFyc2VyCi0lZXhwZWN0IDcKLQotJXVuaW9uIHsKLSAgdW5zaWduZWQgbG9uZyBpbnQgbnVtOwotICBlbnVtIGV4cHJlc3Npb25fb3BlcmF0b3Igb3A7Ci0gIHN0cnVjdCBleHByZXNzaW9uICpleHA7Ci19Ci0KLSV7Ci0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGludCB5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApOwotc3RhdGljIHZvaWQgeXllcnJvciAoY29uc3QgY2hhciAqc3RyKTsKLQotLyogQWxsb2NhdGlvbiBvZiBleHByZXNzaW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwIChpbnQgbmFyZ3MsIGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwKLQkgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKLXsKLSAgaW50IGk7Ci0gIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOwotCi0gIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCi0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKLSAgICAgIGdvdG8gZmFpbDsKLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KLSAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKLSAgaWYgKG5ld3AgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOwotICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7Ci0gICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQotCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKLSAgICAgIHJldHVybiBuZXdwOwotICAgIH0KLQotIGZhaWw6Ci0gIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzAgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCkKLXsKLSAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzEgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQotewotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1sxXTsKLQotICBhcmdzWzBdID0gcmlnaHQ7Ci0gIHJldHVybiBuZXdfZXhwICgxLCBvcCwgYXJncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqCi1uZXdfZXhwXzIgKGVudW0gZXhwcmVzc2lvbl9vcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsCi0JICAgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQotewotICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1syXTsKLQotICBhcmdzWzBdID0gbGVmdDsKLSAgYXJnc1sxXSA9IHJpZ2h0OwotICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKLW5ld19leHBfMyAoZW51bSBleHByZXNzaW9uX29wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqYmV4cCwKLQkgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGJyYW5jaCwgc3RydWN0IGV4cHJlc3Npb24gKmZicmFuY2gpCi17Ci0gIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwotCi0gIGFyZ3NbMF0gPSBiZXhwOwotICBhcmdzWzFdID0gdGJyYW5jaDsKLSAgYXJnc1syXSA9IGZicmFuY2g7Ci0gIHJldHVybiBuZXdfZXhwICgzLCBvcCwgYXJncyk7Ci19Ci0KLSV9Ci0KLS8qIFRoaXMgZGVjbGFyZXMgdGhhdCBhbGwgb3BlcmF0b3JzIGhhdmUgdGhlIHNhbWUgYXNzb2NpYXRpdml0eSBhbmQgdGhlCi0gICBwcmVjZWRlbmNlIG9yZGVyIGFzIGluIEMuICBTZWUgW0hhcmJpc29uLCBTdGVlbGU6IEMsIEEgUmVmZXJlbmNlIE1hbnVhbF0uCi0gICBUaGVyZSBpcyBubyB1bmFyeSBtaW51cyBhbmQgbm8gYml0d2lzZSBvcGVyYXRvcnMuCi0gICBPcGVyYXRvcnMgd2l0aCB0aGUgc2FtZSBzeW50YWN0aWMgYmVoYXZpb3VyIGhhdmUgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZQotICAgdG9rZW4sIHRvIHNhdmUgc3BhY2UgaW4gdGhlIGFycmF5IGdlbmVyYXRlZCBieSBiaXNvbi4gICovCi0lcmlnaHQgJz8nCQkvKiAgID8JCSovCi0lbGVmdCAnfCcJCS8qICAgfHwJCSovCi0lbGVmdCAnJicJCS8qICAgJiYJCSovCi0lbGVmdCBFUVVPUDIJCS8qICAgPT0gIT0JKi8KLSVsZWZ0IENNUE9QMgkJLyogICA8ID4gPD0gPj0JKi8KLSVsZWZ0IEFERE9QMgkJLyogICArIC0JKi8KLSVsZWZ0IE1VTE9QMgkJLyogICAqIC8gJQkqLwotJXJpZ2h0ICchJwkJLyogICAhCQkqLwotCi0ldG9rZW4gPG9wPiBFUVVPUDIgQ01QT1AyIEFERE9QMiBNVUxPUDIKLSV0b2tlbiA8bnVtPiBOVU1CRVIKLSV0eXBlIDxleHA+IGV4cAotCi0lJQotCi1zdGFydDoJICBleHAKLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgWVlBQk9SVDsKLQkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSAkMTsKLQkgIH0KLQk7Ci0KLWV4cDoJICBleHAgJz8nIGV4cCAnOicgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8zIChxbW9wLCAkMSwgJDMsICQ1KTsKLQkgIH0KLQl8IGV4cCAnfCcgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yIChsb3IsICQxLCAkMyk7Ci0JICB9Ci0JfCBleHAgJyYnIGV4cAotCSAgewotCSAgICAkJCA9IG5ld19leHBfMiAobGFuZCwgJDEsICQzKTsKLQkgIH0KLQl8IGV4cCBFUVVPUDIgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLQkgIH0KLQl8IGV4cCBDTVBPUDIgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLQkgIH0KLQl8IGV4cCBBRERPUDIgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLQkgIH0KLQl8IGV4cCBNVUxPUDIgZXhwCi0JICB7Ci0JICAgICQkID0gbmV3X2V4cF8yICgkMiwgJDEsICQzKTsKLQkgIH0KLQl8ICchJyBleHAKLQkgIHsKLQkgICAgJCQgPSBuZXdfZXhwXzEgKGxub3QsICQyKTsKLQkgIH0KLQl8ICduJwotCSAgewotCSAgICAkJCA9IG5ld19leHBfMCAodmFyKTsKLQkgIH0KLQl8IE5VTUJFUgotCSAgewotCSAgICBpZiAoKCQkID0gbmV3X2V4cF8wIChudW0pKSAhPSBOVUxMKQotCSAgICAgICQkLT52YWwubnVtID0gJDE7Ci0JICB9Ci0JfCAnKCcgZXhwICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotJSUKLQotdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24KLUZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKLXsKLSAgaWYgKGV4cCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBIYW5kbGUgdGhlIHJlY3Vyc2l2ZSBjYXNlLiAgKi8KLSAgc3dpdGNoIChleHAtPm5hcmdzKQotICAgIHsKLSAgICBjYXNlIDM6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMl0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIDI6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMV0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIDE6Ci0gICAgICBGUkVFX0VYUFJFU1NJT04gKGV4cC0+dmFsLmFyZ3NbMF0pOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZyZWUgKGV4cCk7Ci19Ci0KLQotc3RhdGljIGludAoteXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKQotewotICBjb25zdCBjaGFyICpleHAgPSAqcGV4cDsKLSAgaW50IHJlc3VsdDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoZXhwWzBdID09ICdcMCcpCi0JewotCSAgKnBleHAgPSBleHA7Ci0JICByZXR1cm4gWVlFT0Y7Ci0JfQotCi0gICAgICBpZiAoZXhwWzBdICE9ICcgJyAmJiBleHBbMF0gIT0gJ1x0JykKLQlicmVhazsKLQotICAgICAgKytleHA7Ci0gICAgfQotCi0gIHJlc3VsdCA9ICpleHArKzsKLSAgc3dpdGNoIChyZXN1bHQpCi0gICAgewotICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBpbnQgbiA9IHJlc3VsdCAtICcwJzsKLQl3aGlsZSAoZXhwWzBdID49ICcwJyAmJiBleHBbMF0gPD0gJzknKQotCSAgewotCSAgICBuICo9IDEwOwotCSAgICBuICs9IGV4cFswXSAtICcwJzsKLQkgICAgKytleHA7Ci0JICB9Ci0JbHZhbC0+bnVtID0gbjsKLQlyZXN1bHQgPSBOVU1CRVI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJz0nOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IGVxdWFsOwotCSAgcmVzdWx0ID0gRVFVT1AyOwotCX0KLSAgICAgIGVsc2UKLQlyZXN1bHQgPSBZWUVSUkNPREU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyEnOgotICAgICAgaWYgKGV4cFswXSA9PSAnPScpCi0JewotCSAgKytleHA7Ci0JICBsdmFsLT5vcCA9IG5vdF9lcXVhbDsKLQkgIHJlc3VsdCA9IEVRVU9QMjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ3wnOgotICAgICAgaWYgKGV4cFswXSA9PSByZXN1bHQpCi0JKytleHA7Ci0gICAgICBlbHNlCi0JcmVzdWx0ID0gWVlFUlJDT0RFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc8JzoKLSAgICAgIGlmIChleHBbMF0gPT0gJz0nKQotCXsKLQkgICsrZXhwOwotCSAgbHZhbC0+b3AgPSBsZXNzX29yX2VxdWFsOwotCX0KLSAgICAgIGVsc2UKLQlsdmFsLT5vcCA9IGxlc3NfdGhhbjsKLSAgICAgIHJlc3VsdCA9IENNUE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPic6Ci0gICAgICBpZiAoZXhwWzBdID09ICc9JykKLQl7Ci0JICArK2V4cDsKLQkgIGx2YWwtPm9wID0gZ3JlYXRlcl9vcl9lcXVhbDsKLQl9Ci0gICAgICBlbHNlCi0JbHZhbC0+b3AgPSBncmVhdGVyX3RoYW47Ci0gICAgICByZXN1bHQgPSBDTVBPUDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyonOgotICAgICAgbHZhbC0+b3AgPSBtdWx0OwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcvJzoKLSAgICAgIGx2YWwtPm9wID0gZGl2aWRlOwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICclJzoKLSAgICAgIGx2YWwtPm9wID0gbW9kdWxlOwotICAgICAgcmVzdWx0ID0gTVVMT1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcrJzoKLSAgICAgIGx2YWwtPm9wID0gcGx1czsKLSAgICAgIHJlc3VsdCA9IEFERE9QMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBsdmFsLT5vcCA9IG1pbnVzOwotICAgICAgcmVzdWx0ID0gQURET1AyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICc6JzoKLSAgICBjYXNlICcoJzoKLSAgICBjYXNlICcpJzoKLSAgICAgIC8qIE5vdGhpbmcsIGp1c3QgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc7JzoKLSAgICBjYXNlICdcbic6Ci0gICAgY2FzZSAnXDAnOgotICAgICAgLyogQmUgc2FmZSBhbmQgbGV0IHRoZSB1c2VyIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2Fpbi4gICovCi0gICAgICAtLWV4cDsKLSAgICAgIHJlc3VsdCA9IFlZRU9GOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmVzdWx0ID0gWVlFUlJDT0RFOwotI2lmIFlZREVCVUcgIT0gMAotICAgICAgLS1leHA7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAqcGV4cCA9IGV4cDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyB2b2lkCi15eWVycm9yIChjb25zdCBjaGFyICpzdHIpCi17Ci0gIC8qIERvIG5vdGhpbmcuICBXZSBkb24ndCBwcmludCBlcnJvciBtZXNzYWdlcyBoZXJlLiAgKi8KLX0KZGlmZiAtLWdpdCBhL2ludGwvcHJpbnRmLWFyZ3MuYyBiL2ludGwvcHJpbnRmLWFyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNDM3ZC4uMDAwMDAwMAotLS0gYS9pbnRsL3ByaW50Zi1hcmdzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogRGVjb21wb3NlZCBwcmludGYgYXJndW1lbnQgbGlzdC4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzLCAyMDA1LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvczoKLSAgICAgRU5BQkxFX1VOSVNURElPICAgIFNldCB0byAxIHRvIGVuYWJsZSB0aGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4KLSAgICAgUFJJTlRGX0ZFVENIQVJHUyAgIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmluZWQuCi0gICAgIFNUQVRJQyAgICAgICAgICAgICBTZXQgdG8gJ3N0YXRpYycgdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24gc3RhdGljLiAgKi8KLQotI2lmbmRlZiBQUklOVEZfRkVUQ0hBUkdTCi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2lmbmRlZiBQUklOVEZfRkVUQ0hBUkdTCi0jIGluY2x1ZGUgInByaW50Zi1hcmdzLmgiCi0jZW5kaWYKLQotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZW5kaWYKLWludAotUFJJTlRGX0ZFVENIQVJHUyAodmFfbGlzdCBhcmdzLCBhcmd1bWVudHMgKmEpCi17Ci0gIHNpemVfdCBpOwotICBhcmd1bWVudCAqYXA7Ci0KLSAgZm9yIChpID0gMCwgYXAgPSAmYS0+YXJnWzBdOyBpIDwgYS0+Y291bnQ7IGkrKywgYXArKykKLSAgICBzd2l0Y2ggKGFwLT50eXBlKQotICAgICAgewotICAgICAgY2FzZSBUWVBFX1NDSEFSOgotCWFwLT5hLmFfc2NoYXIgPSB2YV9hcmcgKGFyZ3MsIC8qc2lnbmVkIGNoYXIqLyBpbnQpOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX1VDSEFSOgotCWFwLT5hLmFfdWNoYXIgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgY2hhciovIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfU0hPUlQ6Ci0JYXAtPmEuYV9zaG9ydCA9IHZhX2FyZyAoYXJncywgLypzaG9ydCovIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfVVNIT1JUOgotCWFwLT5hLmFfdXNob3J0ID0gdmFfYXJnIChhcmdzLCAvKnVuc2lnbmVkIHNob3J0Ki8gaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JTlQ6Ci0JYXAtPmEuYV9pbnQgPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfVUlOVDoKLQlhcC0+YS5hX3VpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKLQlhcC0+YS5hX2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgaW50KTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKLQlhcC0+YS5hX3Vsb25naW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGludCk7Ci0JYnJlYWs7Ci0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0gICAgICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6Ci0JYXAtPmEuYV9sb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBsb25nIGludCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgotCWFwLT5hLmFfdWxvbmdsb25naW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGxvbmcgaW50KTsKLQlicmVhazsKLSNlbmRpZgotICAgICAgY2FzZSBUWVBFX0RPVUJMRToKLQlhcC0+YS5hX2RvdWJsZSA9IHZhX2FyZyAoYXJncywgZG91YmxlKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotCWFwLT5hLmFfbG9uZ2RvdWJsZSA9IHZhX2FyZyAoYXJncywgbG9uZyBkb3VibGUpOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX0NIQVI6Ci0JYXAtPmEuYV9jaGFyID0gdmFfYXJnIChhcmdzLCBpbnQpOwotCWJyZWFrOwotI2lmIEhBVkVfV0lOVF9UCi0gICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgotCS8qIEFsdGhvdWdoIElTTyBDIDk5IDcuMjQuMS4oMikgc2F5cyB0aGF0IHdpbnRfdCBpcyAidW5jaGFuZ2VkIGJ5Ci0JICAgZGVmYXVsdCBhcmd1bWVudCBwcm9tb3Rpb25zIiwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gbWluZ3czMiwKLQkgICB3aGVyZSB3aW50X3QgaXMgJ3Vuc2lnbmVkIHNob3J0Jy4gICovCi0JYXAtPmEuYV93aWRlX2NoYXIgPQotCSAgKHNpemVvZiAod2ludF90KSA8IHNpemVvZiAoaW50KQotCSAgID8gdmFfYXJnIChhcmdzLCBpbnQpCi0JICAgOiB2YV9hcmcgKGFyZ3MsIHdpbnRfdCkpOwotCWJyZWFrOwotI2VuZGlmCi0gICAgICBjYXNlIFRZUEVfU1RSSU5HOgotCWFwLT5hLmFfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlcyIsIGJ1dCBpbiBwcmFjdGljZQotCSAgIGl0IG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgcHJvZHVjZQotCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0JaWYgKGFwLT5hLmFfc3RyaW5nID09IE5VTEwpCi0JICBhcC0+YS5hX3N0cmluZyA9ICIoTlVMTCkiOwotCWJyZWFrOwotI2lmIEhBVkVfV0NIQVJfVAotICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgotCWFwLT5hLmFfd2lkZV9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHdjaGFyX3QgKik7Ci0JLyogQSBudWxsIHBvaW50ZXIgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgIiVscyIsIGJ1dCBpbiBwcmFjdGljZQotCSAgIGl0IG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgcHJvZHVjZQotCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0JaWYgKGFwLT5hLmFfd2lkZV9zdHJpbmcgPT0gTlVMTCkKLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgd2lkZV9udWxsX3N0cmluZ1tdID0KLQkgICAgICB7Ci0JCSh3Y2hhcl90KScoJywKLQkJKHdjaGFyX3QpJ04nLCAod2NoYXJfdCknVScsICh3Y2hhcl90KSdMJywgKHdjaGFyX3QpJ0wnLAotCQkod2NoYXJfdCknKScsCi0JCSh3Y2hhcl90KTAKLQkgICAgICB9OwotCSAgICBhcC0+YS5hX3dpZGVfc3RyaW5nID0gd2lkZV9udWxsX3N0cmluZzsKLQkgIH0KLQlicmVhazsKLSNlbmRpZgotICAgICAgY2FzZSBUWVBFX1BPSU5URVI6Ci0JYXAtPmEuYV9wb2ludGVyID0gdmFfYXJnIChhcmdzLCB2b2lkICopOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI6Ci0JYXAtPmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaWduZWQgY2hhciAqKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSOgotCWFwLT5hLmFfY291bnRfc2hvcnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgc2hvcnQgKik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6Ci0JYXAtPmEuYV9jb3VudF9pbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgaW50ICopOwotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKLQlhcC0+YS5hX2NvdW50X2xvbmdpbnRfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQgKik7Ci0JYnJlYWs7Ci0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0gICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjoKLQlhcC0+YS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQgKik7Ci0JYnJlYWs7Ci0jZW5kaWYKLSNpZiBFTkFCTEVfVU5JU1RESU8KLSAgICAgIC8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLSAgICAgIGNhc2UgVFlQRV9VOF9TVFJJTkc6Ci0JYXAtPmEuYV91OF9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHVpbnQ4X3QgKik7Ci0JLyogQSBudWxsIHBvaW50ZXIgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgIiVVIiwgYnV0IGluIHByYWN0aWNlCi0JICAgaXQgb2NjdXJzIHF1aXRlIGZyZXF1ZW50bHkgaW4gcHJpbnRmIHN0YXRlbWVudHMgdGhhdCBwcm9kdWNlCi0JICAgZGVidWcgb3V0cHV0LiAgVXNlIGEgZmFsbGJhY2sgaW4gdGhpcyBjYXNlLiAgKi8KLQlpZiAoYXAtPmEuYV91OF9zdHJpbmcgPT0gTlVMTCkKLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdThfbnVsbF9zdHJpbmdbXSA9Ci0JICAgICAgeyAnKCcsICdOJywgJ1UnLCAnTCcsICdMJywgJyknLCAwIH07Ci0JICAgIGFwLT5hLmFfdThfc3RyaW5nID0gdThfbnVsbF9zdHJpbmc7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfVTE2X1NUUklORzoKLQlhcC0+YS5hX3UxNl9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHVpbnQxNl90ICopOwotCS8qIEEgbnVsbCBwb2ludGVyIGlzIGFuIGludmFsaWQgYXJndW1lbnQgZm9yICIlbFUiLCBidXQgaW4gcHJhY3RpY2UKLQkgICBpdCBvY2N1cnMgcXVpdGUgZnJlcXVlbnRseSBpbiBwcmludGYgc3RhdGVtZW50cyB0aGF0IHByb2R1Y2UKLQkgICBkZWJ1ZyBvdXRwdXQuICBVc2UgYSBmYWxsYmFjayBpbiB0aGlzIGNhc2UuICAqLwotCWlmIChhcC0+YS5hX3UxNl9zdHJpbmcgPT0gTlVMTCkKLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHUxNl9udWxsX3N0cmluZ1tdID0KLQkgICAgICB7ICcoJywgJ04nLCAnVScsICdMJywgJ0wnLCAnKScsIDAgfTsKLQkgICAgYXAtPmEuYV91MTZfc3RyaW5nID0gdTE2X251bGxfc3RyaW5nOwotCSAgfQotCWJyZWFrOwotICAgICAgY2FzZSBUWVBFX1UzMl9TVFJJTkc6Ci0JYXAtPmEuYV91MzJfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB1aW50MzJfdCAqKTsKLQkvKiBBIG51bGwgcG9pbnRlciBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGZvciAiJWxsVSIsIGJ1dCBpbiBwcmFjdGljZQotCSAgIGl0IG9jY3VycyBxdWl0ZSBmcmVxdWVudGx5IGluIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgcHJvZHVjZQotCSAgIGRlYnVnIG91dHB1dC4gIFVzZSBhIGZhbGxiYWNrIGluIHRoaXMgY2FzZS4gICovCi0JaWYgKGFwLT5hLmFfdTMyX3N0cmluZyA9PSBOVUxMKQotCSAgewotCSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgdTMyX251bGxfc3RyaW5nW10gPQotCSAgICAgIHsgJygnLCAnTicsICdVJywgJ0wnLCAnTCcsICcpJywgMCB9OwotCSAgICBhcC0+YS5hX3UzMl9zdHJpbmcgPSB1MzJfbnVsbF9zdHJpbmc7Ci0JICB9Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGRlZmF1bHQ6Ci0JLyogVW5rbm93biB0eXBlLiAgKi8KLQlyZXR1cm4gLTE7Ci0gICAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9wcmludGYtYXJncy5oIGIvaW50bC9wcmludGYtYXJncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg5YzNlLi4wMDAwMDAwCi0tLSBhL2ludGwvcHJpbnRmLWFyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMsIDIwMDYtMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9QUklOVEZfQVJHU19ICi0jZGVmaW5lIF9QUklOVEZfQVJHU19ICi0KLS8qIFRoaXMgZmlsZSBjYW4gYmUgcGFyYW1ldHJpemVkIHdpdGggdGhlIGZvbGxvd2luZyBtYWNyb3M6Ci0gICAgIEVOQUJMRV9VTklTVERJTyAgICBTZXQgdG8gMSB0byBlbmFibGUgdGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuCi0gICAgIFBSSU5URl9GRVRDSEFSR1MgICBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBkZWNsYXJlZC4KLSAgICAgU1RBVElDICAgICAgICAgICAgIFNldCB0byAnc3RhdGljJyB0byBkZWNsYXJlIHRoZSBmdW5jdGlvbiBzdGF0aWMuICAqLwotCi0vKiBEZWZhdWx0IHBhcmFtZXRlcnMuICAqLwotI2lmbmRlZiBQUklOVEZfRkVUQ0hBUkdTCi0jIGRlZmluZSBQUklOVEZfRkVUQ0hBUkdTIHByaW50Zl9mZXRjaGFyZ3MKLSNlbmRpZgotCi0vKiBHZXQgc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotLyogR2V0IHdjaGFyX3QuICAqLwotI2lmIEhBVkVfV0NIQVJfVAotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0vKiBHZXQgd2ludF90LiAgKi8KLSNpZiBIQVZFX1dJTlRfVAotIyBpbmNsdWRlIDx3Y2hhci5oPgotI2VuZGlmCi0KLS8qIEdldCB2YV9saXN0LiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotCi0vKiBBcmd1bWVudCB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRZUEVfTk9ORSwKLSAgVFlQRV9TQ0hBUiwKLSAgVFlQRV9VQ0hBUiwKLSAgVFlQRV9TSE9SVCwKLSAgVFlQRV9VU0hPUlQsCi0gIFRZUEVfSU5ULAotICBUWVBFX1VJTlQsCi0gIFRZUEVfTE9OR0lOVCwKLSAgVFlQRV9VTE9OR0lOVCwKLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLSAgVFlQRV9MT05HTE9OR0lOVCwKLSAgVFlQRV9VTE9OR0xPTkdJTlQsCi0jZW5kaWYKLSAgVFlQRV9ET1VCTEUsCi0gIFRZUEVfTE9OR0RPVUJMRSwKLSAgVFlQRV9DSEFSLAotI2lmIEhBVkVfV0lOVF9UCi0gIFRZUEVfV0lERV9DSEFSLAotI2VuZGlmCi0gIFRZUEVfU1RSSU5HLAotI2lmIEhBVkVfV0NIQVJfVAotICBUWVBFX1dJREVfU1RSSU5HLAotI2VuZGlmCi0gIFRZUEVfUE9JTlRFUiwKLSAgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSLAotICBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVIsCi0gIFRZUEVfQ09VTlRfSU5UX1BPSU5URVIsCi0gIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSCi0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0sIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUgotI2VuZGlmCi0jaWYgRU5BQkxFX1VOSVNURElPCi0gIC8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLSwgVFlQRV9VOF9TVFJJTkcKLSwgVFlQRV9VMTZfU1RSSU5HCi0sIFRZUEVfVTMyX1NUUklORwotI2VuZGlmCi19IGFyZ190eXBlOwotCi0vKiBQb2x5bW9ycGhpYyBhcmd1bWVudCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYXJnX3R5cGUgdHlwZTsKLSAgdW5pb24KLSAgewotICAgIHNpZ25lZCBjaGFyCQkJYV9zY2hhcjsKLSAgICB1bnNpZ25lZCBjaGFyCQlhX3VjaGFyOwotICAgIHNob3J0CQkJYV9zaG9ydDsKLSAgICB1bnNpZ25lZCBzaG9ydAkJYV91c2hvcnQ7Ci0gICAgaW50CQkJCWFfaW50OwotICAgIHVuc2lnbmVkIGludAkJYV91aW50OwotICAgIGxvbmcgaW50CQkJYV9sb25naW50OwotICAgIHVuc2lnbmVkIGxvbmcgaW50CQlhX3Vsb25naW50OwotI2lmIEhBVkVfTE9OR19MT05HX0lOVAotICAgIGxvbmcgbG9uZyBpbnQJCWFfbG9uZ2xvbmdpbnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIGludAlhX3Vsb25nbG9uZ2ludDsKLSNlbmRpZgotICAgIGZsb2F0CQkJYV9mbG9hdDsKLSAgICBkb3VibGUJCQlhX2RvdWJsZTsKLSAgICBsb25nIGRvdWJsZQkJCWFfbG9uZ2RvdWJsZTsKLSAgICBpbnQJCQkJYV9jaGFyOwotI2lmIEhBVkVfV0lOVF9UCi0gICAgd2ludF90CQkJYV93aWRlX2NoYXI7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyKgkJCWFfc3RyaW5nOwotI2lmIEhBVkVfV0NIQVJfVAotICAgIGNvbnN0IHdjaGFyX3QqCQlhX3dpZGVfc3RyaW5nOwotI2VuZGlmCi0gICAgdm9pZCoJCQlhX3BvaW50ZXI7Ci0gICAgc2lnbmVkIGNoYXIgKgkJYV9jb3VudF9zY2hhcl9wb2ludGVyOwotICAgIHNob3J0ICoJCQlhX2NvdW50X3Nob3J0X3BvaW50ZXI7Ci0gICAgaW50ICoJCQlhX2NvdW50X2ludF9wb2ludGVyOwotICAgIGxvbmcgaW50ICoJCQlhX2NvdW50X2xvbmdpbnRfcG9pbnRlcjsKLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLSAgICBsb25nIGxvbmcgaW50ICoJCWFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlcjsKLSNlbmRpZgotI2lmIEVOQUJMRV9VTklTVERJTwotICAgIC8qIFRoZSB1bmlzdGRpbyBleHRlbnNpb25zLiAgKi8KLSAgICBjb25zdCB1aW50OF90ICoJCWFfdThfc3RyaW5nOwotICAgIGNvbnN0IHVpbnQxNl90ICoJCWFfdTE2X3N0cmluZzsKLSAgICBjb25zdCB1aW50MzJfdCAqCQlhX3UzMl9zdHJpbmc7Ci0jZW5kaWYKLSAgfQotICBhOwotfQotYXJndW1lbnQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHNpemVfdCBjb3VudDsKLSAgYXJndW1lbnQgKmFyZzsKLX0KLWFyZ3VtZW50czsKLQotCi0vKiBGZXRjaCB0aGUgYXJndW1lbnRzLCBwdXR0aW5nIHRoZW0gaW50byBhLiAqLwotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZWxzZQotZXh0ZXJuCi0jZW5kaWYKLWludCBQUklOVEZfRkVUQ0hBUkdTICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSk7Ci0KLSNlbmRpZiAvKiBfUFJJTlRGX0FSR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9wcmludGYtcGFyc2UuYyBiL2ludGwvcHJpbnRmLXBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDFjYzMuLjAwMDAwMDAKLS0tIGEvaW50bC9wcmludGYtcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0cmluZ3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCwgMjAwMi0yMDAzLCAyMDA2LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1hY3JvczoKLSAgICAgQ0hBUl9UICAgICAgICAgICAgIFRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGZvcm1hdCBzdHJpbmcuCi0gICAgIENIQVJfVF9PTkxZX0FTQ0lJICBTZXQgdG8gMSB0byBlbmFibGUgdmVyaWZpY2F0aW9uIHRoYXQgYWxsIGNoYXJhY3RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb3JtYXQgc3RyaW5nIGFyZSBBU0NJSS4KLSAgICAgRElSRUNUSVZFICAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyBhIGZvcm1hdCBkaXJlY3RpdmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRzIG9uIENIQVJfVC4KLSAgICAgRElSRUNUSVZFUyAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyB0aGUgc2V0IG9mIGZvcm1hdCBkaXJlY3RpdmVzIG9mIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzdHJpbmcuICBEZXBlbmRzIG9uIENIQVJfVC4KLSAgICAgUFJJTlRGX1BBUlNFICAgICAgIEZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgZm9ybWF0IHN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZHMgb24gQ0hBUl9ULgotICAgICBTVEFUSUMgICAgICAgICAgICAgU2V0IHRvICdzdGF0aWMnIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHN0YXRpYy4KLSAgICAgRU5BQkxFX1VOSVNURElPICAgIFNldCB0byAxIHRvIGVuYWJsZSB0aGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0KLSNpZm5kZWYgUFJJTlRGX1BBUlNFCi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2lmbmRlZiBQUklOVEZfUEFSU0UKLSMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCi0jZW5kaWYKLQotLyogRGVmYXVsdCBwYXJhbWV0ZXJzLiAgKi8KLSNpZm5kZWYgUFJJTlRGX1BBUlNFCi0jIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCi0jIGRlZmluZSBDSEFSX1QgY2hhcgotIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCi0jIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcwotI2VuZGlmCi0KLS8qIEdldCBzaXplX3QsIE5VTEwuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBHZXQgaW50bWF4X3QuICAqLwotI2lmIGRlZmluZWQgSU5fTElCSU5UTCB8fCBkZWZpbmVkIElOX0xJQkFTUFJJTlRGCi0jIGlmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCi0jICBpbmNsdWRlIDxzdGRpbnQuaD4KLSMgZW5kaWYKLSMgaWYgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWAotIyAgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSMgZW5kaWYKLSNlbHNlCi0jIGluY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKS4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qIGVycm5vLiAgKi8KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0vKiBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuICAqLwotI2luY2x1ZGUgInhzaXplLmgiCi0KLSNpZiBDSEFSX1RfT05MWV9BU0NJSQotLyogY19pc2FzY2lpKCkuICAqLwotIyBpbmNsdWRlICJjLWN0eXBlLmgiCi0jZW5kaWYKLQotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZW5kaWYKLWludAotUFJJTlRGX1BBUlNFIChjb25zdCBDSEFSX1QgKmZvcm1hdCwgRElSRUNUSVZFUyAqZCwgYXJndW1lbnRzICphKQotewotICBjb25zdCBDSEFSX1QgKmNwID0gZm9ybWF0OwkJLyogcG9pbnRlciBpbnRvIGZvcm1hdCAqLwotICBzaXplX3QgYXJnX3Bvc24gPSAwOwkJLyogbnVtYmVyIG9mIHJlZ3VsYXIgYXJndW1lbnRzIGNvbnN1bWVkICovCi0gIHNpemVfdCBkX2FsbG9jYXRlZDsJCQkvKiBhbGxvY2F0ZWQgZWxlbWVudHMgb2YgZC0+ZGlyICovCi0gIHNpemVfdCBhX2FsbG9jYXRlZDsJCQkvKiBhbGxvY2F0ZWQgZWxlbWVudHMgb2YgYS0+YXJnICovCi0gIHNpemVfdCBtYXhfd2lkdGhfbGVuZ3RoID0gMDsKLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMDsKLQotICBkLT5jb3VudCA9IDA7Ci0gIGRfYWxsb2NhdGVkID0gMTsKLSAgZC0+ZGlyID0gKERJUkVDVElWRSAqKSBtYWxsb2MgKGRfYWxsb2NhdGVkICogc2l6ZW9mIChESVJFQ1RJVkUpKTsKLSAgaWYgKGQtPmRpciA9PSBOVUxMKQotICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotICAgIGdvdG8gb3V0X29mX21lbW9yeV8xOwotCi0gIGEtPmNvdW50ID0gMDsKLSAgYV9hbGxvY2F0ZWQgPSAwOwotICBhLT5hcmcgPSBOVUxMOwotCi0jZGVmaW5lIFJFR0lTVEVSX0FSRyhfaW5kZXhfLF90eXBlXykgXAotICB7CQkJCQkJCQkJXAotICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKLSAgICBpZiAobiA+PSBhX2FsbG9jYXRlZCkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCi0JYXJndW1lbnQgKm1lbW9yeTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAotCWlmIChhX2FsbG9jYXRlZCA8PSBuKQkJCQkJCVwKLQkgIGFfYWxsb2NhdGVkID0geHN1bSAobiwgMSk7CQkJCQlcCi0JbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCi0JaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQlcCi0JICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8JCQlcCi0JICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJXAotCW1lbW9yeSA9IChhcmd1bWVudCAqKSAoYS0+YXJnCQkJCQlcCi0JCQkgICAgICAgPyByZWFsbG9jIChhLT5hcmcsIG1lbW9yeV9zaXplKQkJXAotCQkJICAgICAgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCVwKLQlpZiAobWVtb3J5ID09IE5VTEwpCQkJCQkJXAotCSAgLyogT3V0IG9mIG1lbW9yeS4gICovCQkJCQkJXAotCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCVwKLQlhLT5hcmcgPSBtZW1vcnk7CQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCi0gICAgICBhLT5hcmdbYS0+Y291bnQrK10udHlwZSA9IFRZUEVfTk9ORTsJCQkJXAotICAgIGlmIChhLT5hcmdbbl0udHlwZSA9PSBUWVBFX05PTkUpCQkJCQlcCi0gICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAotICAgIGVsc2UgaWYgKGEtPmFyZ1tuXS50eXBlICE9IChfdHlwZV8pKQkJCQlcCi0gICAgICAvKiBBbWJpZ3VvdXMgdHlwZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCQkJXAotICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAotICB9Ci0KLSAgd2hpbGUgKCpjcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIENIQVJfVCBjID0gKmNwKys7Ci0gICAgICBpZiAoYyA9PSAnJScpCi0JewotCSAgc2l6ZV90IGFyZ19pbmRleCA9IEFSR19OT05FOwotCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOyAvKiBwb2ludGVyIHRvIG5leHQgZGlyZWN0aXZlICovCi0KLQkgIC8qIEluaXRpYWxpemUgdGhlIG5leHQgZGlyZWN0aXZlLiAgKi8KLQkgIGRwLT5kaXJfc3RhcnQgPSBjcCAtIDE7Ci0JICBkcC0+ZmxhZ3MgPSAwOwotCSAgZHAtPndpZHRoX3N0YXJ0ID0gTlVMTDsKLQkgIGRwLT53aWR0aF9lbmQgPSBOVUxMOwotCSAgZHAtPndpZHRoX2FyZ19pbmRleCA9IEFSR19OT05FOwotCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IE5VTEw7Ci0JICBkcC0+cHJlY2lzaW9uX2VuZCA9IE5VTEw7Ci0JICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IEFSR19OT05FOwotCSAgZHAtPmFyZ19pbmRleCA9IEFSR19OT05FOwotCi0JICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KLQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCi0JICAgIHsKLQkgICAgICBjb25zdCBDSEFSX1QgKm5wOwotCi0JICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCi0JCTsKLQkgICAgICBpZiAoKm5wID09ICckJykKLQkJewotCQkgIHNpemVfdCBuID0gMDsKLQotCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOwotCQkgIGlmIChuID09IDApCi0JCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLwotCQkgICAgZ290byBlcnJvcjsKLQkJICBpZiAoc2l6ZV9vdmVyZmxvd19wIChuKSkKLQkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkgbGF0ZXIuICAqLwotCQkgICAgZ290byBlcnJvcjsKLQkJICBhcmdfaW5kZXggPSBuIC0gMTsKLQkJICBjcCA9IG5wICsgMTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhlIGZsYWdzLiAgKi8KLQkgIGZvciAoOzspCi0JICAgIHsKLQkgICAgICBpZiAoKmNwID09ICdcJycpCi0JCXsKLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19HUk9VUDsKLQkJICBjcCsrOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKmNwID09ICctJykKLQkJewotCQkgIGRwLT5mbGFncyB8PSBGTEFHX0xFRlQ7Ci0JCSAgY3ArKzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnKycpCi0JCXsKLQkJICBkcC0+ZmxhZ3MgfD0gRkxBR19TSE9XU0lHTjsKLQkJICBjcCsrOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKmNwID09ICcgJykKLQkJewotCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NQQUNFOwotCQkgIGNwKys7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJyMnKQotCQl7Ci0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfQUxUOwotCQkgIGNwKys7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqY3AgPT0gJzAnKQotCQl7Ci0JCSAgZHAtPmZsYWdzIHw9IEZMQUdfWkVSTzsKLQkJICBjcCsrOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgfQotCi0JICAvKiBQYXJzZSB0aGUgZmllbGQgd2lkdGguICAqLwotCSAgaWYgKCpjcCA9PSAnKicpCi0JICAgIHsKLQkgICAgICBkcC0+d2lkdGhfc3RhcnQgPSBjcDsKLQkgICAgICBjcCsrOwotCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKLQkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IDEpCi0JCW1heF93aWR0aF9sZW5ndGggPSAxOwotCi0JICAgICAgLyogVGVzdCBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCi0JICAgICAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLQkJewotCQkgIGNvbnN0IENIQVJfVCAqbnA7Ci0KLQkJICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKLQkJICAgIDsKLQkJICBpZiAoKm5wID09ICckJykKLQkJICAgIHsKLQkJICAgICAgc2l6ZV90IG4gPSAwOwotCi0JCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotCQkJbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOwotCQkgICAgICBpZiAobiA9PSAwKQotCQkJLyogUG9zaXRpb25hbCBhcmd1bWVudCAwLiAgKi8KLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotCQkJLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCi0JCQlnb3RvIGVycm9yOwotCQkgICAgICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gbiAtIDE7Ci0JCSAgICAgIGNwID0gbnAgKyAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0JCXsKLQkJICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKLQkJICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKLQkJICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLQkJICAgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICBSRUdJU1RFUl9BUkcgKGRwLT53aWR0aF9hcmdfaW5kZXgsIFRZUEVfSU5UKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IHdpZHRoX2xlbmd0aDsKLQotCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOwotCSAgICAgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCi0JCTsKLQkgICAgICBkcC0+d2lkdGhfZW5kID0gY3A7Ci0JICAgICAgd2lkdGhfbGVuZ3RoID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKLQkgICAgICBpZiAobWF4X3dpZHRoX2xlbmd0aCA8IHdpZHRoX2xlbmd0aCkKLQkJbWF4X3dpZHRoX2xlbmd0aCA9IHdpZHRoX2xlbmd0aDsKLQkgICAgfQotCi0JICAvKiBQYXJzZSB0aGUgcHJlY2lzaW9uLiAgKi8KLQkgIGlmICgqY3AgPT0gJy4nKQotCSAgICB7Ci0JICAgICAgY3ArKzsKLQkgICAgICBpZiAoKmNwID09ICcqJykKLQkJewotCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7Ci0JCSAgY3ArKzsKLQkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOwotCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IDIpCi0JCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDI7Ci0KLQkJICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KLQkJICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQotCQkgICAgewotCQkgICAgICBjb25zdCBDSEFSX1QgKm5wOwotCi0JCSAgICAgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotCQkJOwotCQkgICAgICBpZiAoKm5wID09ICckJykKLQkJCXsKLQkJCSAgc2l6ZV90IG4gPSAwOwotCi0JCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQotCQkJICAgIG4gPSB4c3VtICh4dGltZXMgKG4sIDEwKSwgKm5wIC0gJzAnKTsKLQkJCSAgaWYgKG4gPT0gMCkKLQkJCSAgICAvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLwotCQkJICAgIGdvdG8gZXJyb3I7Ci0JCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQotCQkJICAgIC8qIG4gdG9vIGxhcmdlLCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkKLQkJCSAgICAgICBsYXRlci4gICovCi0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPSBuIC0gMTsKLQkJCSAgY3AgPSBucCArIDE7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQotCQkgICAgewotCQkgICAgICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IGFyZ19wb3NuKys7Ci0JCSAgICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKLQkJCS8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgUkVHSVNURVJfQVJHIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCwgVFlQRV9JTlQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2l6ZV90IHByZWNpc2lvbl9sZW5ndGg7Ci0KLQkJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gY3AgLSAxOwotCQkgIGZvciAoOyAqY3AgPj0gJzAnICYmICpjcCA8PSAnOSc7IGNwKyspCi0JCSAgICA7Ci0JCSAgZHAtPnByZWNpc2lvbl9lbmQgPSBjcDsKLQkJICBwcmVjaXNpb25fbGVuZ3RoID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OwotCQkgIGlmIChtYXhfcHJlY2lzaW9uX2xlbmd0aCA8IHByZWNpc2lvbl9sZW5ndGgpCi0JCSAgICBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IHByZWNpc2lvbl9sZW5ndGg7Ci0JCX0KLQkgICAgfQotCi0JICB7Ci0JICAgIGFyZ190eXBlIHR5cGU7Ci0KLQkgICAgLyogUGFyc2UgYXJndW1lbnQgdHlwZS9zaXplIHNwZWNpZmllcnMuICAqLwotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gMDsKLQotCSAgICAgIGZvciAoOzspCi0JCXsKLQkJICBpZiAoKmNwID09ICdoJykKLQkJICAgIHsKLQkJICAgICAgZmxhZ3MgfD0gKDEgPDwgKGZsYWdzICYgMSkpOwotCQkgICAgICBjcCsrOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCpjcCA9PSAnTCcpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWdzIHw9IDQ7Ci0JCSAgICAgIGNwKys7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmNwID09ICdsJykKLQkJICAgIHsKLQkJICAgICAgZmxhZ3MgKz0gODsKLQkJICAgICAgY3ArKzsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgqY3AgPT0gJ2onKQotCQkgICAgewotCQkgICAgICBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGxvbmcpKQotCQkJewotCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLwotCQkJICBmbGFncyArPSAxNjsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCi0JCQl7Ci0JCQkgIC8qIGludG1heF90ID0gbG9uZyAqLwotCQkJICBmbGFncyArPSA4OwotCQkJfQotCQkgICAgICBjcCsrOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCpjcCA9PSAneicgfHwgKmNwID09ICdaJykKLQkJICAgIHsKLQkJICAgICAgLyogJ3onIGlzIHN0YW5kYXJkaXplZCBpbiBJU08gQyA5OSwgYnV0IGdsaWJjIHVzZXMgJ1onCi0JCQkgYmVjYXVzZSB0aGUgd2FybmluZyBmYWNpbGl0eSBpbiBnY2MtMi45NS4yIHVuZGVyc3RhbmRzCi0JCQkgb25seSAnWicgKHNlZSBnY2MtMi45NS4yL2djYy9jLWNvbW1vbi5jOjE3ODQpLiAgKi8KLQkJICAgICAgaWYgKHNpemVvZiAoc2l6ZV90KSA+IHNpemVvZiAobG9uZykpCi0JCQl7Ci0JCQkgIC8qIHNpemVfdCA9IGxvbmcgbG9uZyAqLwotCQkJICBmbGFncyArPSAxNjsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChpbnQpKQotCQkJewotCQkJICAvKiBzaXplX3QgPSBsb25nICovCi0JCQkgIGZsYWdzICs9IDg7Ci0JCQl9Ci0JCSAgICAgIGNwKys7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmNwID09ICd0JykKLQkJICAgIHsKLQkJICAgICAgaWYgKHNpemVvZiAocHRyZGlmZl90KSA+IHNpemVvZiAobG9uZykpCi0JCQl7Ci0JCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgbG9uZyAqLwotCQkJICBmbGFncyArPSAxNjsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChpbnQpKQotCQkJewotCQkJICAvKiBwdHJkaWZmX3QgPSBsb25nICovCi0JCQkgIGZsYWdzICs9IDg7Ci0JCQl9Ci0JCSAgICAgIGNwKys7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFJlYWQgdGhlIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KLQkgICAgICBjID0gKmNwKys7Ci0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ2QnOiBjYXNlICdpJzoKLSNpZiBIQVZFX0xPTkdfTE9OR19JTlQKLQkJICAvKiBJZiAnbG9uZyBsb25nJyBleGlzdHMgYW5kIGlzIGxhcmdlciB0aGFuICdsb25nJzogICovCi0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotCQkgICAgdHlwZSA9IFRZUEVfTE9OR0xPTkdJTlQ7Ci0JCSAgZWxzZQotI2VuZGlmCi0JCSAgLyogSWYgJ2xvbmcgbG9uZycgZXhpc3RzIGFuZCBpcyB0aGUgc2FtZSBhcyAnbG9uZycsIHdlIHBhcnNlCi0JCSAgICAgImxsZCIgaW50byBUWVBFX0xPTkdJTlQuICAqLwotCQkgIGlmIChmbGFncyA+PSA4KQotCQkgICAgdHlwZSA9IFRZUEVfTE9OR0lOVDsKLQkJICBlbHNlIGlmIChmbGFncyAmIDIpCi0JCSAgICB0eXBlID0gVFlQRV9TQ0hBUjsKLQkJICBlbHNlIGlmIChmbGFncyAmIDEpCi0JCSAgICB0eXBlID0gVFlQRV9TSE9SVDsKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9JTlQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ28nOiBjYXNlICd1JzogY2FzZSAneCc6IGNhc2UgJ1gnOgotI2lmIEhBVkVfTE9OR19MT05HX0lOVAotCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gJ2xvbmcnOiAgKi8KLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0JCSAgICB0eXBlID0gVFlQRV9VTE9OR0xPTkdJTlQ7Ci0JCSAgZWxzZQotI2VuZGlmCi0JCSAgLyogSWYgJ3Vuc2lnbmVkIGxvbmcgbG9uZycgZXhpc3RzIGFuZCBpcyB0aGUgc2FtZSBhcwotCQkgICAgICd1bnNpZ25lZCBsb25nJywgd2UgcGFyc2UgImxsdSIgaW50byBUWVBFX1VMT05HSU5ULiAgKi8KLQkJICBpZiAoZmxhZ3MgPj0gOCkKLQkJICAgIHR5cGUgPSBUWVBFX1VMT05HSU5UOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLQkJICAgIHR5cGUgPSBUWVBFX1VDSEFSOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKLQkJICAgIHR5cGUgPSBUWVBFX1VTSE9SVDsKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9VSU5UOwotCQkgIGJyZWFrOwotCQljYXNlICdmJzogY2FzZSAnRic6IGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgotCQljYXNlICdhJzogY2FzZSAnQSc6Ci0JCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQotCQkgICAgdHlwZSA9IFRZUEVfTE9OR0RPVUJMRTsKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9ET1VCTEU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2MnOgotCQkgIGlmIChmbGFncyA+PSA4KQotI2lmIEhBVkVfV0lOVF9UCi0JCSAgICB0eXBlID0gVFlQRV9XSURFX0NIQVI7Ci0jZWxzZQotCQkgICAgZ290byBlcnJvcjsKLSNlbmRpZgotCQkgIGVsc2UKLQkJICAgIHR5cGUgPSBUWVBFX0NIQVI7Ci0JCSAgYnJlYWs7Ci0jaWYgSEFWRV9XSU5UX1QKLQkJY2FzZSAnQyc6Ci0JCSAgdHlwZSA9IFRZUEVfV0lERV9DSEFSOwotCQkgIGMgPSAnYyc7Ci0JCSAgYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSAncyc6Ci0JCSAgaWYgKGZsYWdzID49IDgpCi0jaWYgSEFWRV9XQ0hBUl9UCi0JCSAgICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKLSNlbHNlCi0JCSAgICBnb3RvIGVycm9yOwotI2VuZGlmCi0JCSAgZWxzZQotCQkgICAgdHlwZSA9IFRZUEVfU1RSSU5HOwotCQkgIGJyZWFrOwotI2lmIEhBVkVfV0NIQVJfVAotCQljYXNlICdTJzoKLQkJICB0eXBlID0gVFlQRV9XSURFX1NUUklORzsKLQkJICBjID0gJ3MnOwotCQkgIGJyZWFrOwotI2VuZGlmCi0JCWNhc2UgJ3AnOgotCQkgIHR5cGUgPSBUWVBFX1BPSU5URVI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ24nOgotI2lmIEhBVkVfTE9OR19MT05HX0lOVAotCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgbGFyZ2VyIHRoYW4gJ2xvbmcnOiAgKi8KLQkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCi0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOwotCQkgIGVsc2UKLSNlbmRpZgotCQkgIC8qIElmICdsb25nIGxvbmcnIGV4aXN0cyBhbmQgaXMgdGhlIHNhbWUgYXMgJ2xvbmcnLCB3ZSBwYXJzZQotCQkgICAgICJsbG4iIGludG8gVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVIuICAqLwotCQkgIGlmIChmbGFncyA+PSA4KQotCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOwotCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKLQkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI7Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQotCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKLQkJICBlbHNlCi0JCSAgICB0eXBlID0gVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjsKLQkJICBicmVhazsKLSNpZiBFTkFCTEVfVU5JU1RESU8KLQkJLyogVGhlIHVuaXN0ZGlvIGV4dGVuc2lvbnMuICAqLwotCQljYXNlICdVJzoKLQkJICBpZiAoZmxhZ3MgPj0gMTYpCi0JCSAgICB0eXBlID0gVFlQRV9VMzJfU1RSSU5HOwotCQkgIGVsc2UgaWYgKGZsYWdzID49IDgpCi0JCSAgICB0eXBlID0gVFlQRV9VMTZfU1RSSU5HOwotCQkgIGVsc2UKLQkJICAgIHR5cGUgPSBUWVBFX1U4X1NUUklORzsKLQkJICBicmVhazsKLSNlbmRpZgotCQljYXNlICclJzoKLQkJICB0eXBlID0gVFlQRV9OT05FOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIFVua25vd24gY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgfQotCi0JICAgIGlmICh0eXBlICE9IFRZUEVfTk9ORSkKLQkgICAgICB7Ci0JCWRwLT5hcmdfaW5kZXggPSBhcmdfaW5kZXg7Ci0JCWlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQotCQkgIHsKLQkJICAgIGRwLT5hcmdfaW5kZXggPSBhcmdfcG9zbisrOwotCQkgICAgaWYgKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpCi0JCSAgICAgIC8qIGFyZ19wb3NuIHdyYXBwZWQgYXJvdW5kLiAgKi8KLQkJICAgICAgZ290byBlcnJvcjsKLQkJICB9Ci0JCVJFR0lTVEVSX0FSRyAoZHAtPmFyZ19pbmRleCwgdHlwZSk7Ci0JICAgICAgfQotCSAgICBkcC0+Y29udmVyc2lvbiA9IGM7Ci0JICAgIGRwLT5kaXJfZW5kID0gY3A7Ci0JICB9Ci0KLQkgIGQtPmNvdW50Kys7Ci0JICBpZiAoZC0+Y291bnQgPj0gZF9hbGxvY2F0ZWQpCi0JICAgIHsKLQkgICAgICBzaXplX3QgbWVtb3J5X3NpemU7Ci0JICAgICAgRElSRUNUSVZFICptZW1vcnk7Ci0KLQkgICAgICBkX2FsbG9jYXRlZCA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIDIpOwotCSAgICAgIG1lbW9yeV9zaXplID0geHRpbWVzIChkX2FsbG9jYXRlZCwgc2l6ZW9mIChESVJFQ1RJVkUpKTsKLQkgICAgICBpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCi0JCS8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLwotCQlnb3RvIG91dF9vZl9tZW1vcnk7Ci0JICAgICAgbWVtb3J5ID0gKERJUkVDVElWRSAqKSByZWFsbG9jIChkLT5kaXIsIG1lbW9yeV9zaXplKTsKLQkgICAgICBpZiAobWVtb3J5ID09IE5VTEwpCi0JCS8qIE91dCBvZiBtZW1vcnkuICAqLwotCQlnb3RvIG91dF9vZl9tZW1vcnk7Ci0JICAgICAgZC0+ZGlyID0gbWVtb3J5OwotCSAgICB9Ci0JfQotI2lmIENIQVJfVF9PTkxZX0FTQ0lJCi0gICAgICBlbHNlIGlmICghY19pc2FzY2lpIChjKSkKLQl7Ci0JICAvKiBOb24tQVNDSUkgY2hhcmFjdGVyLiAgTm90IHN1cHBvcnRlZC4gICovCi0JICBnb3RvIGVycm9yOwotCX0KLSNlbmRpZgotICAgIH0KLSAgZC0+ZGlyW2QtPmNvdW50XS5kaXJfc3RhcnQgPSBjcDsKLQotICBkLT5tYXhfd2lkdGhfbGVuZ3RoID0gbWF4X3dpZHRoX2xlbmd0aDsKLSAgZC0+bWF4X3ByZWNpc2lvbl9sZW5ndGggPSBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKLSAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICBpZiAoYS0+YXJnKQotICAgIGZyZWUgKGEtPmFyZyk7Ci0gIGlmIChkLT5kaXIpCi0gICAgZnJlZSAoZC0+ZGlyKTsKLSAgZXJybm8gPSBFSU5WQUw7Ci0gIHJldHVybiAtMTsKLQotb3V0X29mX21lbW9yeToKLSAgaWYgKGEtPmFyZykKLSAgICBmcmVlIChhLT5hcmcpOwotICBpZiAoZC0+ZGlyKQotICAgIGZyZWUgKGQtPmRpcik7Ci1vdXRfb2ZfbWVtb3J5XzE6Ci0gIGVycm5vID0gRU5PTUVNOwotICByZXR1cm4gLTE7Ci19Ci0KLSN1bmRlZiBQUklOVEZfUEFSU0UKLSN1bmRlZiBESVJFQ1RJVkVTCi0jdW5kZWYgRElSRUNUSVZFCi0jdW5kZWYgQ0hBUl9UX09OTFlfQVNDSUkKLSN1bmRlZiBDSEFSX1QKZGlmZiAtLWdpdCBhL2ludGwvcHJpbnRmLXBhcnNlLmggYi9pbnRsL3ByaW50Zi1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg1MzM4Li4wMDAwMDAwCi0tLSBhL2ludGwvcHJpbnRmLXBhcnNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KLSAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX1BSSU5URl9QQVJTRV9ICi0jZGVmaW5lIF9QUklOVEZfUEFSU0VfSAotCi0jaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKLQotCi0vKiBGbGFncyAqLwotI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLwotI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCi0jZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCi0jZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLwotI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KLSNkZWZpbmUgRkxBR19aRVJPCTMyCi0KLS8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLwotI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKLQotLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIqIGRpcl9zdGFydDsKLSAgY29uc3QgY2hhciogZGlyX2VuZDsKLSAgaW50IGZsYWdzOwotICBjb25zdCBjaGFyKiB3aWR0aF9zdGFydDsKLSAgY29uc3QgY2hhciogd2lkdGhfZW5kOwotICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OwotICBjb25zdCBjaGFyKiBwcmVjaXNpb25fc3RhcnQ7Ci0gIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9lbmQ7Ci0gIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OwotICBjaGFyIGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLwotICBzaXplX3QgYXJnX2luZGV4OwotfQotY2hhcl9kaXJlY3RpdmU7Ci0KLS8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc2l6ZV90IGNvdW50OwotICBjaGFyX2RpcmVjdGl2ZSAqZGlyOwotICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOwotfQotY2hhcl9kaXJlY3RpdmVzOwotCi0KLS8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKLSAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAotICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKLSAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLwotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZWxzZQotZXh0ZXJuCi0jZW5kaWYKLWludCBwcmludGZfcGFyc2UgKGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhcl9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOwotCi0jZW5kaWYgLyogX1BSSU5URl9QQVJTRV9IICovCmRpZmYgLS1naXQgYS9pbnRsL3ByaW50Zi5jIGIvaW50bC9wcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4OGU1MS4uMDAwMDAwMAotLS0gYS9pbnRsL3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncywgdXNpbmcgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA2LTIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmICFIQVZFX1BPU0lYX1BSSU5URgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogU29tZSBzeXN0ZW1zLCBsaWtlIE9TRi8xIDQuMCBhbmQgV29lMzIsIGRvbid0IGhhdmUgRU9WRVJGTE9XLiAgKi8KLSNpZm5kZWYgRU9WRVJGTE9XCi0jIGRlZmluZSBFT1ZFUkZMT1cgRTJCSUcKLSNlbmRpZgotCi0vKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCi0gICB0aGUgZnVuY3Rpb25zIGFyZSBvbmx5IGRlZmluZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3ZQotICAgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGluIGFueSBjYXNlLiAgKi8KLSNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAotIyBkZWZpbmUgRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotI2Vsc2UKLSMgZGVmaW5lIERMTF9FWFBPUlRFRAotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVElDIHN0YXRpYwotCi0vKiBUaGlzIG5lZWRzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBsaWJnbnVpbnRsLmguaW4uICAqLwotI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9fQkVPU19fIHx8IGRlZmluZWQgX19DWUdXSU5fXyB8fCBkZWZpbmVkIF9fTUlOR1czMl9fCi0vKiBEb24ndCBicmVhayBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLE0sTikpKS4KLSAgIFRoaXMgcmVkZWZpbml0aW9uIGlzIG9ubHkgcG9zc2libGUgYmVjYXVzZSB0aGUgbGliYyBpbiBOZXRCU0QsIEN5Z3dpbiwKLSAgIG1pbmd3IGRvZXMgbm90IGhhdmUgYSBmdW5jdGlvbiBfX3ByaW50Zl9fLiAgKi8KLSMgZGVmaW5lIGxpYmludGxfcHJpbnRmIF9fcHJpbnRmX18KLSNlbmRpZgotCi0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLWFyZ3MuaCIuICAqLwotI2luY2x1ZGUgInByaW50Zi1hcmdzLmMiCi0KLS8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtcGFyc2UuaCIuICAqLwotI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgotCi0vKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KLSNkZWZpbmUgdmFzbnByaW50ZiBsaWJpbnRsX3Zhc25wcmludGYKLSNpbmNsdWRlICJ2YXNucHJpbnRmLmMiCi0jaWYgMCAvKiBub3QgbmVlZGVkICovCi0jZGVmaW5lIGFzbnByaW50ZiBsaWJpbnRsX2FzbnByaW50ZgotI2luY2x1ZGUgImFzbnByaW50Zi5jIgotI2VuZGlmCi0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3ZmcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKLSAgICByZXR1cm4gdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBsZW5ndGg7Ci0gICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0gICAgICBpbnQgcmV0dmFsID0gLTE7Ci0gICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IHdyaXR0ZW4gPSBmd3JpdGUgKHJlc3VsdCwgMSwgbGVuZ3RoLCBzdHJlYW0pOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIGlmICh3cml0dGVuID09IGxlbmd0aCkKLQkgICAgewotCSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotCQllcnJubyA9IEVPVkVSRkxPVzsKLQkgICAgICBlbHNlCi0JCXJldHZhbCA9IGxlbmd0aDsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF9mcHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXR2YWw7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHJldHZhbCA9IGxpYmludGxfdmZwcmludGYgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfdnByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIHJldHVybiBsaWJpbnRsX3ZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldHZhbDsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmV0dmFsID0gbGliaW50bF92cHJpbnRmIChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF92c3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIHZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuZ3RoID0gKHNpemVfdCkgfjAgLyAoNCAqIHNpemVvZiAoY2hhcikpOwotICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0gICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKLQl7Ci0JICBmcmVlIChyZXN1bHQpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotCXsKLQkgIGVycm5vID0gRU9WRVJGTE9XOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfc3ByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgcmV0dmFsOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXR2YWwgPSBsaWJpbnRsX3ZzcHJpbnRmIChyZXN1bHRidWYsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLSNpZiBIQVZFX1NOUFJJTlRGCi0KLSMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgotICAgLyogV2luZG93cy4gICovCi0jICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiBfdnNucHJpbnRmCi0jIGVsc2UKLSAgIC8qIFVuaXguICAqLwotIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgdnNucHJpbnRmCi0jIGVuZGlmCi0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3ZzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIHN5c3RlbV92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKLSAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCi0JewotCSAgaWYgKG1heGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBzaXplX3QgcHJ1bmVkX2xlbmd0aCA9Ci0JCShsZW5ndGggPCBtYXhsZW5ndGggPyBsZW5ndGggOiBtYXhsZW5ndGggLSAxKTsKLQkgICAgICBtZW1jcHkgKHJlc3VsdGJ1ZiwgcmVzdWx0LCBwcnVuZWRfbGVuZ3RoKTsKLQkgICAgICByZXN1bHRidWZbcHJ1bmVkX2xlbmd0aF0gPSAnXDAnOwotCSAgICB9Ci0JICBmcmVlIChyZXN1bHQpOwotCX0KLSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotCXsKLQkgIGVycm5vID0gRU9WRVJGTE9XOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldHZhbDsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmV0dmFsID0gbGliaW50bF92c25wcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi0jZW5kaWYKLQotI2lmIEhBVkVfQVNQUklOVEYKLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGxlbmd0aCA+IElOVF9NQVgpCi0gICAgewotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICAgIGVycm5vID0gRU9WRVJGTE9XOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgKnJlc3VsdHAgPSByZXN1bHQ7Ci0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX2FzcHJpbnRmIChjaGFyICoqcmVzdWx0cCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldHZhbDsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmV0dmFsID0gbGliaW50bF92YXNwcmludGYgKHJlc3VsdHAsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLSNlbmRpZgotCi0jaWYgSEFWRV9GV1BSSU5URgotCi0jaW5jbHVkZSA8d2NoYXIuaD4KLQotI2RlZmluZSBXSURFX0NIQVJfVkVSU0lPTiAxCi0KLSNpbmNsdWRlICJ3cHJpbnRmLXBhcnNlLmgiCi0vKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAid3ByaW50Zi1wYXJzZS5oIi4gICovCi0jZGVmaW5lIENIQVJfVCB3Y2hhcl90Ci0jZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQotI2RlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcwotI2RlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgotCi0vKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KLSNkZWZpbmUgdmFzbndwcmludGYgbGliaW50bF92YXNud3ByaW50ZgotI2luY2x1ZGUgInZhc25wcmludGYuYyIKLSNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KLSNkZWZpbmUgYXNud3ByaW50ZiBsaWJpbnRsX2FzbndwcmludGYKLSNpbmNsdWRlICJhc25wcmludGYuYyIKLSNlbmRpZgotCi0jIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCi0gICAvKiBXaW5kb3dzLiAgKi8KLSMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIF92c253cHJpbnRmCi0jIGVsc2UKLSAgIC8qIFVuaXguICAqLwotIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgdnN3cHJpbnRmCi0jIGVuZGlmCi0KLURMTF9FWFBPUlRFRAotaW50Ci1saWJpbnRsX3Zmd3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCi0gICAgcmV0dXJuIHZmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGxlbmd0aDsKLSAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0gICAgICBpbnQgcmV0dmFsID0gLTE7Ci0gICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0JICAgIGlmIChmcHV0d2MgKHJlc3VsdFtpXSwgc3RyZWFtKSA9PSBXRU9GKQotCSAgICAgIGJyZWFrOwotCSAgZnJlZSAocmVzdWx0KTsKLQkgIGlmIChpID09IGxlbmd0aCkKLQkgICAgewotCSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotCQllcnJubyA9IEVPVkVSRkxPVzsKLQkgICAgICBlbHNlCi0JCXJldHZhbCA9IGxlbmd0aDsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF9md3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgcmV0dmFsOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXR2YWwgPSBsaWJpbnRsX3Zmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF92d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIHJldHVybiBsaWJpbnRsX3Zmd3ByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF93cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgcmV0dmFsOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICByZXR2YWwgPSBsaWJpbnRsX3Z3cHJpbnRmIChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1ETExfRVhQT1JURUQKLWludAotbGliaW50bF92c3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi17Ci0gIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQotICAgIHJldHVybiBzeXN0ZW1fdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7Ci0gICAgICB3Y2hhcl90ICpyZXN1bHQgPSBsaWJpbnRsX3Zhc253cHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7Ci0gICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKLQl7Ci0JICBpZiAobWF4bGVuZ3RoID4gMCkKLQkgICAgewotCSAgICAgIHNpemVfdCBwcnVuZWRfbGVuZ3RoID0KLQkJKGxlbmd0aCA8IG1heGxlbmd0aCA/IGxlbmd0aCA6IG1heGxlbmd0aCAtIDEpOwotCSAgICAgIG1lbWNweSAocmVzdWx0YnVmLCByZXN1bHQsIHBydW5lZF9sZW5ndGggKiBzaXplb2YgKHdjaGFyX3QpKTsKLQkgICAgICByZXN1bHRidWZbcHJ1bmVkX2xlbmd0aF0gPSAwOwotCSAgICB9Ci0JICBmcmVlIChyZXN1bHQpOwotCSAgLyogVW5saWtlIHZzbnByaW50Ziwgd2hpY2ggaGFzIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciB0aGF0Ci0JICAgICB3b3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgaWYgdGhlIHJlc3VsdGJ1ZiBoYWQgYmVlbiBzdWZmaWNpZW50bHkKLQkgICAgIGxhcmdlLCB0aGUgdnN3cHJpbnRmIGZ1bmN0aW9uIGhhcyB0byByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZgotCSAgICAgdGhlIHJlc3VsdGJ1ZiB3YXMgbm90IHN1ZmZpY2llbnRseSBsYXJnZS4gICovCi0JICBpZiAobGVuZ3RoID49IG1heGxlbmd0aCkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChsZW5ndGggPiBJTlRfTUFYKQotCXsKLQkgIGVycm5vID0gRU9WRVJGTE9XOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGVsc2UKLQlyZXR1cm4gbGVuZ3RoOwotICAgIH0KLX0KLQotRExMX0VYUE9SVEVECi1pbnQKLWxpYmludGxfc3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldHZhbDsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmV0dmFsID0gbGliaW50bF92c3dwcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3JlZi1hZGQuc2luIGIvaW50bC9yZWYtYWRkLnNpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3OGMyOC4uMDAwMDAwMAotLS0gYS9pbnRsL3JlZi1hZGQuc2luCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBBZGQgdGhpcyBwYWNrYWdlIHRvIGEgbGlzdCBvZiByZWZlcmVuY2VzIHN0b3JlZCBpbiBhIHRleHQgZmlsZS4KLSMKLSMgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0jICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyAgIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotIyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0jICAgVVNBLgotIwotIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KLSMKLS9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8gewotICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCi0gIHRhCi0gIDphCi0gIHMvIEBQQUNLQUdFQCAvIEBQQUNLQUdFQCAvCi0gIHRiCi0gIHMvICQvIEBQQUNLQUdFQCAvCi0gIDpiCi0gIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCi19CmRpZmYgLS1naXQgYS9pbnRsL3JlZi1kZWwuc2luIGIvaW50bC9yZWYtZGVsLnNpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxMmQ4ZS4uMDAwMDAwMAotLS0gYS9pbnRsL3JlZi1kZWwuc2luCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBSZW1vdmUgdGhpcyBwYWNrYWdlIGZyb20gYSBsaXN0IG9mIHJlZmVyZW5jZXMgc3RvcmVkIGluIGEgdGV4dCBmaWxlLgotIwotIyAgIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jICAgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSMgICBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LgotIwotL14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogLyB7Ci0gIHMvIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6Ly8KLSAgcy8gQFBBQ0tBR0VAIC8gLwotICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LwotfQpkaWZmIC0tZ2l0IGEvaW50bC9yZWxvY2F0YWJsZS5jIGIvaW50bC9yZWxvY2F0YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFkZGU2Li4wMDAwMDAwCi0tLSBhL2ludGwvcmVsb2NhdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKiBQcm92aWRlIHJlbG9jYXRhYmxlIHBhY2thZ2VzLgotICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RkaW8uaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgZ2V0bGluZSgpLgotICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCi0gICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jZW5kaWYKLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLSNpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgotCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgTk9fWE1BTExPQwotIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKLSNlbHNlCi0jIGluY2x1ZGUgInhhbGxvYy5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLSMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLSNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKLSMgaW5jbHVkZSA8bGliY2hhcnNldC5oPgotI2VuZGlmCi0jaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WCi0jIGluY2x1ZGUgPGljb252Lmg+Ci0jZW5kaWYKLSNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZW5kaWYKLQotLyogRmFrZWQgY2hlYXAgJ2Jvb2wnLiAgKi8KLSN1bmRlZiBib29sCi0jdW5kZWYgZmFsc2UKLSN1bmRlZiB0cnVlCi0jZGVmaW5lIGJvb2wgaW50Ci0jZGVmaW5lIGZhbHNlIDAKLSNkZWZpbmUgdHJ1ZSAxCi0KLS8qIFBhdGhuYW1lIHN1cHBvcnQuCi0gICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSAgIElTX1BBVEhfV0lUSF9ESVIoUCkgIHRlc3RzIHdoZXRoZXIgUCBjb250YWlucyBhIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgotICovCi0jaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXwotICAvKiBXaW4zMiwgQ3lnd2luLCBPUy8yLCBET1MgKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCi0jIGRlZmluZSBIQVNfREVWSUNFKFApIFwKLSAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCi0gICAgICYmIChQKVsxXSA9PSAnOicpCi0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKLSAgICAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwgfHwgc3RyY2hyIChQLCAnXFwnKSAhPSBOVUxMIHx8IEhBU19ERVZJQ0UgKFApKQotIyBkZWZpbmUgRklMRV9TWVNURU1fUFJFRklYX0xFTihQKSAoSEFTX0RFVklDRSAoUCkgPyAyIDogMCkKLSNlbHNlCi0gIC8qIFVuaXggKi8KLSMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycpCi0jIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKLSMgZGVmaW5lIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4oUCkgMAotI2VuZGlmCi0KLS8qIE9yaWdpbmFsIGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotc3RhdGljIGNoYXIgKm9yaWdfcHJlZml4Owotc3RhdGljIHNpemVfdCBvcmlnX3ByZWZpeF9sZW47Ci0vKiBDdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXguICAqLwotc3RhdGljIGNoYXIgKmN1cnJfcHJlZml4Owotc3RhdGljIHNpemVfdCBjdXJyX3ByZWZpeF9sZW47Ci0vKiBUaGVzZSBwcmVmaXhlcyBkbyBub3QgZW5kIGluIGEgc2xhc2guICBBbnl0aGluZyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkCi0gICB0byB0aGVtIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoLiAgKi8KLQotLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhpcyBtb2R1bGUuCi0gICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAotICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLSAgIGluc3RlYWQgb2YgIi8iKS4gICovCi1zdGF0aWMgdm9pZAotc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywKLQkJCSAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9hcmcpCi17Ci0gIGlmIChvcmlnX3ByZWZpeF9hcmcgIT0gTlVMTCAmJiBjdXJyX3ByZWZpeF9hcmcgIT0gTlVMTAotICAgICAgLyogT3B0aW1pemF0aW9uOiBpZiBvcmlnX3ByZWZpeCBhbmQgY3Vycl9wcmVmaXggYXJlIGVxdWFsLCB0aGUKLQkgcmVsb2NhdGlvbiBpcyBhIG5vcC4gICovCi0gICAgICAmJiBzdHJjbXAgKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIER1cGxpY2F0ZSB0aGUgYXJndW1lbnQgc3RyaW5ncy4gICovCi0gICAgICBjaGFyICptZW1vcnk7Ci0KLSAgICAgIG9yaWdfcHJlZml4X2xlbiA9IHN0cmxlbiAob3JpZ19wcmVmaXhfYXJnKTsKLSAgICAgIGN1cnJfcHJlZml4X2xlbiA9IHN0cmxlbiAoY3Vycl9wcmVmaXhfYXJnKTsKLSAgICAgIG1lbW9yeSA9IChjaGFyICopIHhtYWxsb2MgKG9yaWdfcHJlZml4X2xlbiArIDEgKyBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLSNpZmRlZiBOT19YTUFMTE9DCi0gICAgICBpZiAobWVtb3J5ICE9IE5VTEwpCi0jZW5kaWYKLQl7Ci0JICBtZW1jcHkgKG1lbW9yeSwgb3JpZ19wcmVmaXhfYXJnLCBvcmlnX3ByZWZpeF9sZW4gKyAxKTsKLQkgIG9yaWdfcHJlZml4ID0gbWVtb3J5OwotCSAgbWVtb3J5ICs9IG9yaWdfcHJlZml4X2xlbiArIDE7Ci0JICBtZW1jcHkgKG1lbW9yeSwgY3Vycl9wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKLQkgIGN1cnJfcHJlZml4ID0gbWVtb3J5OwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIG9yaWdfcHJlZml4ID0gTlVMTDsKLSAgY3Vycl9wcmVmaXggPSBOVUxMOwotICAvKiBEb24ndCB3b3JyeSBhYm91dCB3YXN0ZWQgbWVtb3J5IGhlcmUgLSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgb25seQotICAgICBjYWxsZWQgb25jZS4gICovCi19Ci0KLS8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgotICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKLSAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCi0gICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCi0gICBpbnN0ZWFkIG9mICIvIikuICAqLwotdm9pZAotc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKLXsKLSAgc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLQotICAvKiBOb3cgbm90aWZ5IGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzLiAgKi8KLSNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKLSAgbGliY2hhcnNldF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKLSNlbmRpZgotI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OViAmJiBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDkKLSAgbGliaWNvbnZfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0jZW5kaWYKLSNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUyAmJiBkZWZpbmVkIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4Ci0gIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7Ci0jZW5kaWYKLX0KLQotI2lmICFkZWZpbmVkIElOX0xJQlJBUlkgfHwgKGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUikKLQotLyogQ29udmVuaWVuY2UgZnVuY3Rpb246Ci0gICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKLSAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgotICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLwotI2lmZGVmIElOX0xJQlJBUlkKLSNkZWZpbmUgY29tcHV0ZV9jdXJyX3ByZWZpeCBsb2NhbF9jb21wdXRlX2N1cnJfcHJlZml4Ci1zdGF0aWMKLSNlbmRpZgotY29uc3QgY2hhciAqCi1jb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCi0JCSAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAotCQkgICAgIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpCi17Ci0gIGNvbnN0IGNoYXIgKmN1cnJfaW5zdGFsbGRpcjsKLSAgY29uc3QgY2hhciAqcmVsX2luc3RhbGxkaXI7Ci0KLSAgaWYgKGN1cnJfcGF0aG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBEZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSBwcmVmaXguCi0gICAgIFRoaXMgaXMgc2ltcGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZ19pbnN0YWxscHJlZml4IGFuZAotICAgICBvcmlnX2luc3RhbGxkaXIuICAqLwotICBpZiAoc3RybmNtcCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KSkKLSAgICAgICE9IDApCi0gICAgLyogU2hvdWxkbid0IGhhcHBlbiAtIG5vdGhpbmcgc2hvdWxkIGJlIGluc3RhbGxlZCBvdXRzaWRlICQocHJlZml4KS4gICovCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJlbF9pbnN0YWxsZGlyID0gb3JpZ19pbnN0YWxsZGlyICsgc3RybGVuIChvcmlnX2luc3RhbGxwcmVmaXgpOwotCi0gIC8qIERldGVybWluZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgKi8KLSAgewotICAgIGNvbnN0IGNoYXIgKnBfYmFzZSA9IGN1cnJfcGF0aG5hbWUgKyBGSUxFX1NZU1RFTV9QUkVGSVhfTEVOIChjdXJyX3BhdGhuYW1lKTsKLSAgICBjb25zdCBjaGFyICpwID0gY3Vycl9wYXRobmFtZSArIHN0cmxlbiAoY3Vycl9wYXRobmFtZSk7Ci0gICAgY2hhciAqcTsKLQotICAgIHdoaWxlIChwID4gcF9iYXNlKQotICAgICAgewotCXAtLTsKLQlpZiAoSVNTTEFTSCAoKnApKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBxID0gKGNoYXIgKikgeG1hbGxvYyAocCAtIGN1cnJfcGF0aG5hbWUgKyAxKTsKLSNpZmRlZiBOT19YTUFMTE9DCi0gICAgaWYgKHEgPT0gTlVMTCkKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICAgbWVtY3B5IChxLCBjdXJyX3BhdGhuYW1lLCBwIC0gY3Vycl9wYXRobmFtZSk7Ci0gICAgcVtwIC0gY3Vycl9wYXRobmFtZV0gPSAnXDAnOwotICAgIGN1cnJfaW5zdGFsbGRpciA9IHE7Ci0gIH0KLQotICAvKiBDb21wdXRlIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggYnkgcmVtb3ZpbmcgdGhlIHRyYWlsaW5nCi0gICAgIHJlbF9pbnN0YWxsZGlyIGZyb20gaXQuICAqLwotICB7Ci0gICAgY29uc3QgY2hhciAqcnAgPSByZWxfaW5zdGFsbGRpciArIHN0cmxlbiAocmVsX2luc3RhbGxkaXIpOwotICAgIGNvbnN0IGNoYXIgKmNwID0gY3Vycl9pbnN0YWxsZGlyICsgc3RybGVuIChjdXJyX2luc3RhbGxkaXIpOwotICAgIGNvbnN0IGNoYXIgKmNwX2Jhc2UgPQotICAgICAgY3Vycl9pbnN0YWxsZGlyICsgRklMRV9TWVNURU1fUFJFRklYX0xFTiAoY3Vycl9pbnN0YWxsZGlyKTsKLQotICAgIHdoaWxlIChycCA+IHJlbF9pbnN0YWxsZGlyICYmIGNwID4gY3BfYmFzZSkKLSAgICAgIHsKLQlib29sIHNhbWUgPSBmYWxzZTsKLQljb25zdCBjaGFyICpycGkgPSBycDsKLQljb25zdCBjaGFyICpjcGkgPSBjcDsKLQotCXdoaWxlIChycGkgPiByZWxfaW5zdGFsbGRpciAmJiBjcGkgPiBjcF9iYXNlKQotCSAgewotCSAgICBycGktLTsKLQkgICAgY3BpLS07Ci0JICAgIGlmIChJU1NMQVNIICgqcnBpKSB8fCBJU1NMQVNIICgqY3BpKSkKLQkgICAgICB7Ci0JCWlmIChJU1NMQVNIICgqcnBpKSAmJiBJU1NMQVNIICgqY3BpKSkKLQkJICBzYW1lID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICAvKiBEbyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gaWYgdGhlIGZpbGVzeXN0ZW0gaXMgYWx3YXlzIG9yCi0JICAgICAgIG9mdGVuIGNhc2UtaW5zZW5zaXRpdmUuICBJdCdzIGJldHRlciB0byBhY2NlcHQgdGhlIGNvbXBhcmlzb24KLQkgICAgICAgaWYgdGhlIGRpZmZlcmVuY2UgaXMgb25seSBpbiBjYXNlLCByYXRoZXIgdGhhbiB0byBmYWlsLiAgKi8KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCi0JICAgIC8qIFdpbjMyLCBDeWd3aW4sIE9TLzIsIERPUyAtIGNhc2UgaW5zaWduaWZpY2FudCBmaWxlc3lzdGVtICovCi0JICAgIGlmICgoKnJwaSA+PSAnYScgJiYgKnJwaSA8PSAneicgPyAqcnBpIC0gJ2EnICsgJ0EnIDogKnJwaSkKLQkJIT0gKCpjcGkgPj0gJ2EnICYmICpjcGkgPD0gJ3onID8gKmNwaSAtICdhJyArICdBJyA6ICpjcGkpKQotCSAgICAgIGJyZWFrOwotI2Vsc2UKLQkgICAgaWYgKCpycGkgIT0gKmNwaSkKLQkgICAgICBicmVhazsKLSNlbmRpZgotCSAgfQotCWlmICghc2FtZSkKLQkgIGJyZWFrOwotCS8qIFRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCB3YXMgdGhlIHNhbWUuICBvcGkgYW5kIGNwaSBub3cgcG9pbnQKLQkgICB0byB0aGUgc2xhc2ggYmVmb3JlIGl0LiAgKi8KLQlycCA9IHJwaTsKLQljcCA9IGNwaTsKLSAgICAgIH0KLQotICAgIGlmIChycCA+IHJlbF9pbnN0YWxsZGlyKQotICAgICAgLyogVW5leHBlY3RlZDogVGhlIGN1cnJfaW5zdGFsbGRpciBkb2VzIG5vdCBlbmQgd2l0aCByZWxfaW5zdGFsbGRpci4gICovCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHsKLSAgICAgIHNpemVfdCBjdXJyX3ByZWZpeF9sZW4gPSBjcCAtIGN1cnJfaW5zdGFsbGRpcjsKLSAgICAgIGNoYXIgKmN1cnJfcHJlZml4OwotCi0gICAgICBjdXJyX3ByZWZpeCA9IChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIDEpOwotI2lmZGVmIE5PX1hNQUxMT0MKLSAgICAgIGlmIChjdXJyX3ByZWZpeCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2VuZGlmCi0gICAgICBtZW1jcHkgKGN1cnJfcHJlZml4LCBjdXJyX2luc3RhbGxkaXIsIGN1cnJfcHJlZml4X2xlbik7Ci0gICAgICBjdXJyX3ByZWZpeFtjdXJyX3ByZWZpeF9sZW5dID0gJ1wwJzsKLQotICAgICAgcmV0dXJuIGN1cnJfcHJlZml4OwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogIUlOX0xJQlJBUlkgfHwgUElDICovCi0KLSNpZiBkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIKLQotLyogRnVsbCBwYXRobmFtZSBvZiBzaGFyZWQgbGlicmFyeSwgb3IgTlVMTC4gICovCi1zdGF0aWMgY2hhciAqc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci0KLSNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fQ1lHV0lOX18KLQotLyogRGV0ZXJtaW5lIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB3aGVuIGl0IGlzIGxvYWRlZC4gICovCi0KLUJPT0wgV0lOQVBJCi1EbGxNYWluIChISU5TVEFOQ0UgbW9kdWxlX2hhbmRsZSwgRFdPUkQgZXZlbnQsIExQVk9JRCByZXNlcnZlZCkKLXsKLSAgKHZvaWQpIHJlc2VydmVkOwotCi0gIGlmIChldmVudCA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCi0gICAgewotICAgICAgLyogVGhlIERMTCBpcyBiZWluZyBsb2FkZWQgaW50byBhbiBhcHBsaWNhdGlvbidzIGFkZHJlc3MgcmFuZ2UuICAqLwotICAgICAgc3RhdGljIGNoYXIgbG9jYXRpb25bTUFYX1BBVEhdOwotCi0gICAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lIChtb2R1bGVfaGFuZGxlLCBsb2NhdGlvbiwgc2l6ZW9mIChsb2NhdGlvbikpKQotCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLwotCXJldHVybiBGQUxTRTsKLQotICAgICAgaWYgKCFJU19QQVRIX1dJVEhfRElSIChsb2NhdGlvbikpCi0JLyogU2hvdWxkbid0IGhhcHBlbi4gICovCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgICB7Ci0jaWYgZGVmaW5lZCBfX0NZR1dJTl9fCi0JLyogT24gQ3lnd2luLCB3ZSBuZWVkIHRvIGNvbnZlcnQgcGF0aHMgY29taW5nIGZyb20gV2luMzIgc3lzdGVtIGNhbGxzCi0JICAgdG8gdGhlIFVuaXgtbGlrZSBzbGFzaGlmaWVkIG5vdGF0aW9uLiAgKi8KLQlzdGF0aWMgY2hhciBsb2NhdGlvbl9hc19wb3NpeF9wYXRoWzIgKiBNQVhfUEFUSF07Ci0JLyogVGhlcmUncyBubyBlcnJvciByZXR1cm4gZGVmaW5lZCBmb3IgY3lnd2luX2NvbnZfdG9fcG9zaXhfcGF0aC4KLQkgICBTZWUgY3lnd2luLWFwaS9mdW5jLWN5Z3dpbi1jb252LXRvLXBvc2l4LXBhdGguaHRtbC4KLQkgICBEb2VzIGl0IG92ZXJmbG93IHRoZSBidWZmZXIgb2YgZXhwZWN0ZWQgc2l6ZSBNQVhfUEFUSCBvciBkb2VzIGl0Ci0JICAgdHJ1bmNhdGUgdGhlIHBhdGg/ICBJIGRvbid0IGtub3cuICBMZXQncyBjYXRjaCBib3RoLiAgKi8KLQljeWd3aW5fY29udl90b19wb3NpeF9wYXRoIChsb2NhdGlvbiwgbG9jYXRpb25fYXNfcG9zaXhfcGF0aCk7Ci0JbG9jYXRpb25fYXNfcG9zaXhfcGF0aFtNQVhfUEFUSCAtIDFdID0gJ1wwJzsKLQlpZiAoc3RybGVuIChsb2NhdGlvbl9hc19wb3NpeF9wYXRoKSA+PSBNQVhfUEFUSCAtIDEpCi0JICAvKiBBIHNpZ24gb2YgYnVmZmVyIG92ZXJmbG93IG9yIHBhdGggdHJ1bmNhdGlvbi4gICovCi0JICByZXR1cm4gRkFMU0U7Ci0Jc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSBzdHJkdXAgKGxvY2F0aW9uX2FzX3Bvc2l4X3BhdGgpOwotI2Vsc2UKLQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHN0cmR1cCAobG9jYXRpb24pOwotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0jZWxzZSAvKiBVbml4IGV4Y2VwdCBDeWd3aW4gKi8KLQotc3RhdGljIHZvaWQKLWZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKLXsKLSNpZiBkZWZpbmVkIF9fbGludXhfXyAmJiBfX0dMSUJDX18gPj0gMgotICAvKiBMaW51eCBoYXMgL3Byb2Mvc2VsZi9tYXBzLiBnbGliYyAyIGhhcyB0aGUgZ2V0bGluZSgpIGZ1bmN0aW9uLiAgKi8KLSAgRklMRSAqZnA7Ci0KLSAgLyogT3BlbiB0aGUgY3VycmVudCBwcm9jZXNzJyBtYXBzIGZpbGUuICBJdCBkZXNjcmliZXMgb25lIFZNQSBwZXIgbGluZS4gICovCi0gIGZwID0gZm9wZW4gKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOwotICBpZiAoZnApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpICZmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOwotICAgICAgZm9yICg7OykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0JICBpbnQgYzsKLQotCSAgaWYgKGZzY2FuZiAoZnAsICIlbHgtJWx4IiwgJnN0YXJ0LCAmZW5kKSAhPSAyKQotCSAgICBicmVhazsKLQkgIGlmIChhZGRyZXNzID49IHN0YXJ0ICYmIGFkZHJlc3MgPD0gZW5kIC0gMSkKLQkgICAgewotCSAgICAgIC8qIEZvdW5kIGl0LiAgTm93IHNlZSBpZiB0aGlzIGxpbmUgY29udGFpbnMgYSBmaWxlbmFtZS4gICovCi0JICAgICAgd2hpbGUgKGMgPSBnZXRjIChmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJiBjICE9ICcvJykKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGMgPT0gJy8nKQotCQl7Ci0JCSAgc2l6ZV90IHNpemU7Ci0JCSAgaW50IGxlbjsKLQotCQkgIHVuZ2V0YyAoYywgZnApOwotCQkgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gTlVMTDsgc2l6ZSA9IDA7Ci0JCSAgbGVuID0gZ2V0bGluZSAoJnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLCAmc2l6ZSwgZnApOwotCQkgIGlmIChsZW4gPj0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogU3VjY2VzczogZmlsbGVkIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lLiAgKi8KLQkJICAgICAgaWYgKGxlbiA+IDAgJiYgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPT0gJ1xuJykKLQkJCXNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID0gJ1wwJzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBmY2xvc2UgKGZwKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIChXSU4zMiBvciBDeWd3aW4pIC8gKFVuaXggZXhjZXB0IEN5Z3dpbikgKi8KLQotLyogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNoYXJlZCBsaWJyYXJ5LgotICAgUmV0dXJuIE5VTEwgaWYgdW5rbm93bi4KLSAgIEd1YXJhbnRlZWQgdG8gd29yayBvbmx5IG9uIExpbnV4LCBDeWd3aW4gYW5kIFdvZTMyLiAgKi8KLXN0YXRpYyBjaGFyICoKLWdldF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQotewotI2lmICEoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fKQotICBzdGF0aWMgYm9vbCB0cmllZF9maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOwotICBpZiAoIXRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUpCi0gICAgewotICAgICAgZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKTsKLSAgICAgIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSB0cnVlOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Ci19Ci0KLSNlbmRpZiAvKiBQSUMgKi8KLQotLyogUmV0dXJucyB0aGUgcGF0aG5hbWUsIHJlbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uCi0gICBkaXJlY3RvcnkuICAqLwotY29uc3QgY2hhciAqCi1yZWxvY2F0ZSAoY29uc3QgY2hhciAqcGF0aG5hbWUpCi17Ci0jaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCi0gIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7Ci0KLSAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGxpa2VseSBoYXZlIGFscmVhZHkgYmVlbgotCSBzZXQgdGhyb3VnaCB0aGUgbWFpbiBwcm9ncmFtJ3Mgc2V0X3Byb2dyYW1fbmFtZV9hbmRfaW5zdGFsbGRpcgotCSBmdW5jdGlvbi4gIFRoaXMgaXMgc3VmZmljaWVudCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBsaWJyYXJ5IGhhcwotCSBpbml0aWFsbHkgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgb3JpZ19wcmVmaXguICBCdXQgd2UgY2FuIGRvCi0JIGJldHRlciwgdG8gYWxzbyBjb3ZlciB0aGUgY2FzZXMgdGhhdCAxLiBpdCBoYXMgYmVlbiBpbnN0YWxsZWQKLQkgaW4gYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBiZWluZyBtb3ZlZCB0byBvcmlnX3ByZWZpeCBhbmQgKGxhdGVyKQotCSB0byBjdXJyX3ByZWZpeCwgMi4gdW5saWtlIHRoZSBwcm9ncmFtLCBpdCBoYXMgbm90IG1vdmVkIGF3YXkgZnJvbQotCSBvcmlnX3ByZWZpeC4gICovCi0gICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXggPSBJTlNUQUxMUFJFRklYOwotICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyID0gSU5TVEFMTERJUjsKLSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2JldHRlcjsKLQotICAgICAgY3Vycl9wcmVmaXhfYmV0dGVyID0KLQljb21wdXRlX2N1cnJfcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIG9yaWdfaW5zdGFsbGRpciwKLQkJCSAgICAgZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpKTsKLSAgICAgIGlmIChjdXJyX3ByZWZpeF9iZXR0ZXIgPT0gTlVMTCkKLQljdXJyX3ByZWZpeF9iZXR0ZXIgPSBjdXJyX3ByZWZpeDsKLQotICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIGN1cnJfcHJlZml4X2JldHRlcik7Ci0KLSAgICAgIGluaXRpYWxpemVkID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBOb3RlOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGhlcmUsCi0gICAgIGV2ZW4gZm9yIERPUy1saWtlIGZpbGVzeXN0ZW1zLCBiZWNhdXNlIHRoZSBwYXRobmFtZSBhcmd1bWVudCB3YXMKLSAgICAgdHlwaWNhbGx5IGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBNYWtlZmlsZSB2YXJpYWJsZSBhcyBvcmlnX3ByZWZpeCBjYW1lCi0gICAgIGZyb20uICAqLwotICBpZiAob3JpZ19wcmVmaXggIT0gTlVMTCAmJiBjdXJyX3ByZWZpeCAhPSBOVUxMCi0gICAgICAmJiBzdHJuY21wIChwYXRobmFtZSwgb3JpZ19wcmVmaXgsIG9yaWdfcHJlZml4X2xlbikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSA9PSAnXDAnKQotCS8qIHBhdGhuYW1lIGVxdWFscyBvcmlnX3ByZWZpeC4gICovCi0JcmV0dXJuIGN1cnJfcHJlZml4OwotICAgICAgaWYgKElTU0xBU0ggKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0pKQotCXsKLQkgIC8qIHBhdGhuYW1lIHN0YXJ0cyB3aXRoIG9yaWdfcHJlZml4LiAgKi8KLQkgIGNvbnN0IGNoYXIgKnBhdGhuYW1lX3RhaWwgPSAmcGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXTsKLQkgIGNoYXIgKnJlc3VsdCA9Ci0JICAgIChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIHN0cmxlbiAocGF0aG5hbWVfdGFpbCkgKyAxKTsKLQotI2lmZGVmIE5PX1hNQUxMT0MKLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLSNlbmRpZgotCSAgICB7Ci0JICAgICAgbWVtY3B5IChyZXN1bHQsIGN1cnJfcHJlZml4LCBjdXJyX3ByZWZpeF9sZW4pOwotCSAgICAgIHN0cmNweSAocmVzdWx0ICsgY3Vycl9wcmVmaXhfbGVuLCBwYXRobmFtZV90YWlsKTsKLQkgICAgICByZXR1cm4gcmVzdWx0OwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogTm90aGluZyB0byByZWxvY2F0ZS4gICovCi0gIHJldHVybiBwYXRobmFtZTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3JlbG9jYXRhYmxlLmggYi9pbnRsL3JlbG9jYXRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDM4MzIuLjAwMDAwMDAKLS0tIGEvaW50bC9yZWxvY2F0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KLSAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX1JFTE9DQVRBQkxFX0gKLSNkZWZpbmUgX1JFTE9DQVRBQkxFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIFRoaXMgY2FuIGJlIGVuYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZW5hYmxlLXJlbG9jYXRhYmxlIG9wdGlvbi4gICovCi0jaWYgRU5BQkxFX1JFTE9DQVRBQkxFCi0KLS8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKLSAgIHRoaXMgaXMgYSBwcml2YXRlIC5oIGZpbGUsIHdlIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotICAgaW4gYW55IGNhc2UuICAqLwotI2lmIEhBVkVfVklTSUJJTElUWSAmJiBCVUlMRElOR19ETEwKLSMgZGVmaW5lIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCBfX2F0dHJpYnV0ZV9fKChfX3Zpc2liaWxpdHlfXygiZGVmYXVsdCIpKSkKLSNlbGlmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCi0jIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jZWxzZQotIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVECi0jZW5kaWYKLQotLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhlIHBhY2thZ2UuCi0gICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAotICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKLSAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKLSAgIGluc3RlYWQgb2YgIi8iKS4gICovCi1leHRlcm4gUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIHZvaWQKLSAgICAgICBzZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAotCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOwotCi0vKiBSZXR1cm5zIHRoZSBwYXRobmFtZSwgcmVsb2NhdGVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24KLSAgIGRpcmVjdG9yeS4gICovCi1leHRlcm4gY29uc3QgY2hhciAqIHJlbG9jYXRlIChjb25zdCBjaGFyICpwYXRobmFtZSk7Ci0KLS8qIE1lbW9yeSBtYW5hZ2VtZW50OiByZWxvY2F0ZSgpIGxlYWtzIG1lbW9yeSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RydWN0Ci0gICBhIGZyZXNoIHBhdGhuYW1lLiAgSWYgdGhpcyBpcyBhIHByb2JsZW0gYmVjYXVzZSB5b3VyIHByb2dyYW0gY2FsbHMKLSAgIHJlbG9jYXRlKCkgZnJlcXVlbnRseSwgdGhpbmsgYWJvdXQgY2FjaGluZyB0aGUgcmVzdWx0LiAgKi8KLQotLyogQ29udmVuaWVuY2UgZnVuY3Rpb246Ci0gICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKLSAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgotICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCi0JCQkJCSBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxkaXIsCi0JCQkJCSBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKTsKLQotI2Vsc2UKLQotLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSBoYXJkd2lyZWQgcGF0aG5hbWVzLiAgKi8KLSNkZWZpbmUgcmVsb2NhdGUocGF0aG5hbWUpIChwYXRobmFtZSkKLQotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9SRUxPQ0FUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbnRsL3RleHRkb21haW4uYyBiL2ludGwvdGV4dGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDEzMWJjLi4wMDAwMDAwCi0tLSBhL2ludGwvdGV4dGRvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMywgMjAwNS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ251aW50bC5oIgotI2VuZGlmCi0KLS8qIEhhbmRsZSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLwotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+Ci0jIGRlZmluZSBnbF9yd2xvY2tfZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lCi0jIGRlZmluZSBnbF9yd2xvY2tfd3Jsb2NrIF9fbGliY19yd2xvY2tfd3Jsb2NrCi0jIGRlZmluZSBnbF9yd2xvY2tfdW5sb2NrIF9fbGliY19yd2xvY2tfdW5sb2NrCi0jZWxzZQotIyBpbmNsdWRlICJsb2NrLmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgVEVYVERPTUFJTiBfX3RleHRkb21haW4KLSMgaWZuZGVmIHN0cmR1cAotIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jIGVuZGlmCi0jZWxzZQotIyBkZWZpbmUgVEVYVERPTUFJTiBsaWJpbnRsX3RleHRkb21haW4KLSNlbmRpZgotCi0vKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KLWdsX3J3bG9ja19kZWZpbmUgKGV4dGVybiwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1jaGFyICoKLVRFWFRET01BSU4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCi17Ci0gIGNoYXIgKm5ld19kb21haW47Ci0gIGNoYXIgKm9sZF9kb21haW47Ci0KLSAgLyogQSBOVUxMIHBvaW50ZXIgcmVxdWVzdHMgdGhlIGN1cnJlbnQgc2V0dGluZy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0gIGdsX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKLQotICBvbGRfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJwotICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKLSAgICB7Ci0gICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChkb21haW5uYW1lLCBvbGRfZG9tYWluKSA9PSAwKQotICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBhbmQgcGVvcGxlIHdpbGwgdXNlIGl0IHRvIHNpZ25hbCB0aGF0IHNvbWUKLSAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBjaGFuZ2VkLiAgKi8KLSAgICBuZXdfZG9tYWluID0gb2xkX2RvbWFpbjsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKLQkgd2lsbCBiZSBOVUxMLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFuZCBzbyBzaWduYWxzIHdlCi0JIGFyZSBvdXQgb2YgY29yZS4gICovCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBuZXdfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSNlbHNlCi0gICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7Ci0gICAgICBuZXdfZG9tYWluID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKLQltZW1jcHkgKG5ld19kb21haW4sIGRvbWFpbm5hbWUsIGxlbik7Ci0jZW5kaWYKLQotICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKLQlfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IG5ld19kb21haW47Ci0gICAgfQotCi0gIC8qIFdlIHVzZSB0aGlzIHBvc3NpYmlsaXR5IHRvIHNpZ25hbCBhIGNoYW5nZSBvZiB0aGUgbG9hZGVkIGNhdGFsb2dzCi0gICAgIHNpbmNlIHRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGNhc2UgYW5kIHRoZXJlIGlzIG5vIG90aGVyIGVhc3kgd2UKLSAgICAgdG8gZG8gaXQuICBEbyBpdCBvbmx5IHdoZW4gdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQotICAgIHsKLSAgICAgICsrX25sX21zZ19jYXRfY250cjsKLQotICAgICAgaWYgKG9sZF9kb21haW4gIT0gbmV3X2RvbWFpbiAmJiBvbGRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQotCWZyZWUgKG9sZF9kb21haW4pOwotICAgIH0KLQotICBnbF9yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Ci0KLSAgcmV0dXJuIG5ld19kb21haW47Ci19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX3RleHRkb21haW4sIHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL3RzZWFyY2guYyBiL2ludGwvdHNlYXJjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQ5ZGQ0Li4wMDAwMDAwCi0tLSBhL2ludGwvdHNlYXJjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEJlcm5kIFNjaG1pZHQgPGNydXhAUG9vbC5JbmZvcm1hdGlrLlJXVEgtQWFjaGVuLkRFPiwgMTk5Ny4KLQotICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMKLSAgIExpYnJhcnkuICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBUcmVlIHNlYXJjaCBmb3IgcmVkL2JsYWNrIHRyZWVzLgotICAgVGhlIGFsZ29yaXRobSBmb3IgYWRkaW5nIG5vZGVzIGlzIHRha2VuIGZyb20gb25lIG9mIHRoZSBtYW55ICJBbGdvcml0aG1zIgotICAgYm9va3MgYnkgUm9iZXJ0IFNlZGdld2ljaywgYWx0aG91Z2ggdGhlIGltcGxlbWVudGF0aW9uIGRpZmZlcnMuCi0gICBUaGUgYWxnb3JpdGhtIGZvciBkZWxldGluZyBub2RlcyBjYW4gcHJvYmFibHkgYmUgZm91bmQgaW4gYSBib29rIG5hbWVkCi0gICAiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMiIGJ5IENvcm1lbi9MZWlzZXJzb24vUml2ZXN0LiAgQXQgbGVhc3QgdGhhdCdzCi0gICB0aGUgYm9vayB0aGF0IG15IHByb2Zlc3NvciB0b29rIG1vc3QgYWxnb3JpdGhtcyBmcm9tIGR1cmluZyB0aGUgIkRhdGEKLSAgIFN0cnVjdHVyZXMiIGNvdXJzZS4uLgotCi0gICBUb3RhbGx5IHB1YmxpYyBkb21haW4uICAqLwotCi0vKiBSZWQvYmxhY2sgdHJlZXMgYXJlIGJpbmFyeSB0cmVlcyBpbiB3aGljaCB0aGUgZWRnZXMgYXJlIGNvbG9yZWQgZWl0aGVyIHJlZAotICAgb3IgYmxhY2suICBUaGV5IGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotICAgMS4gVGhlIG51bWJlciBvZiBibGFjayBlZGdlcyBvbiBldmVyeSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gYSBsZWFmIGlzCi0gICAgICBjb25zdGFudC4KLSAgIDIuIE5vIHR3byByZWQgZWRnZXMgYXJlIGFkamFjZW50LgotICAgVGhlcmVmb3JlIHRoZXJlIGlzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBsZW5ndGggb2YgZXZlcnkgcGF0aCwgaXQncwotICAgTyhsb2cgbikgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSB0cmVlLiAgTm8gcGF0aCBjYW4gYmUgbG9uZ2VyCi0gICB0aGFuIDErMipQIHdoZXJlIFAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlc3QgcGF0aCBpbiB0aGUgdHJlZS4KLSAgIFVzZWZ1bCBmb3IgdGhlIGltcGxlbWVudGF0aW9uOgotICAgMy4gSWYgb25lIG9mIHRoZSBjaGlsZHJlbiBvZiBhIG5vZGUgaXMgTlVMTCwgdGhlbiB0aGUgb3RoZXIgb25lIGlzIHJlZAotICAgICAgKGlmIGl0IGV4aXN0cykuCi0KLSAgIEluIHRoZSBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBlZGdlcyBhcmUgY29sb3JlZCwgYnV0IHRoZSBub2Rlcy4gIFRoZSBjb2xvcgotICAgaW50ZXJwcmV0ZWQgYXMgdGhlIGNvbG9yIG9mIHRoZSBlZGdlIGxlYWRpbmcgdG8gdGhpcyBub2RlLiAgVGhlIGNvbG9yIGlzCi0gICBtZWFuaW5nbGVzcyBmb3IgdGhlIHJvb3Qgbm9kZSwgYnV0IHdlIGNvbG9yIHRoZSByb290IG5vZGUgYmxhY2sgZm9yCi0gICBjb252ZW5pZW5jZS4gIEFsbCBhZGRlZCBub2RlcyBhcmUgcmVkIGluaXRpYWxseS4KLQotICAgQWRkaW5nIHRvIGEgcmVkL2JsYWNrIHRyZWUgaXMgcmF0aGVyIGVhc3kuICBUaGUgcmlnaHQgcGxhY2UgaXMgc2VhcmNoZWQKLSAgIHdpdGggYSB1c3VhbCBiaW5hcnkgdHJlZSBzZWFyY2guICBBZGRpdGlvbmFsbHksIHdoZW5ldmVyIGEgbm9kZSBOIGlzCi0gICByZWFjaGVkIHRoYXQgaGFzIHR3byByZWQgc3VjY2Vzc29ycywgdGhlIHN1Y2Nlc3NvcnMgYXJlIGNvbG9yZWQgYmxhY2sgYW5kCi0gICB0aGUgbm9kZSBpdHNlbGYgY29sb3JlZCByZWQuICBUaGlzIG1vdmVzIHJlZCBlZGdlcyB1cCB0aGUgdHJlZSB3aGVyZSB0aGV5Ci0gICBwb3NlIGxlc3Mgb2YgYSBwcm9ibGVtIG9uY2Ugd2UgZ2V0IHRvIHJlYWxseSBpbnNlcnQgdGhlIG5ldyBub2RlLiAgQ2hhbmdpbmcKLSAgIE4ncyBjb2xvciB0byByZWQgbWF5IHZpb2xhdGUgcnVsZSAyLCBob3dldmVyLCBzbyByb3RhdGlvbnMgbWF5IGJlY29tZQotICAgbmVjZXNzYXJ5IHRvIHJlc3RvcmUgdGhlIGludmFyaWFudHMuICBBZGRpbmcgYSBuZXcgcmVkIGxlYWYgbWF5IHZpb2xhdGUKLSAgIHRoZSBzYW1lIHJ1bGUsIHNvIGFmdGVyd2FyZHMgYW4gYWRkaXRpb25hbCBjaGVjayBpcyBydW4gYW5kIHRoZSB0cmVlCi0gICBwb3NzaWJseSByb3RhdGVkLgotCi0gICBEZWxldGluZyBpcyBoYWlyeS4gIFRoZXJlIGFyZSBtYWlubHkgdHdvIG5vZGVzIGludm9sdmVkOiB0aGUgbm9kZSB0byBiZQotICAgZGVsZXRlZCAobjEpLCBhbmQgYW5vdGhlciBub2RlIHRoYXQgaXMgdG8gYmUgdW5jaGFpbmVkIGZyb20gdGhlIHRyZWUgKG4yKS4KLSAgIElmIG4xIGhhcyBhIHN1Y2Nlc3NvciAodGhlIG5vZGUgd2l0aCBhIHNtYWxsZXN0IGtleSB0aGF0IGlzIGxhcmdlciB0aGFuCi0gICBuMSksIHRoZW4gdGhlIHN1Y2Nlc3NvciBiZWNvbWVzIG4yIGFuZCBpdHMgY29udGVudHMgYXJlIGNvcGllZCBpbnRvIG4xLAotICAgb3RoZXJ3aXNlIG4xIGJlY29tZXMgbjIuCi0gICBVbmNoYWluaW5nIGEgbm9kZSBtYXkgdmlvbGF0ZSBydWxlIDE6IGlmIG4yIGlzIGJsYWNrLCBvbmUgc3VidHJlZSBpcwotICAgbWlzc2luZyBvbmUgYmxhY2sgZWRnZSBhZnRlcndhcmRzLiAgVGhlIGFsZ29yaXRobSBtdXN0IHRyeSB0byBtb3ZlIHRoaXMKLSAgIGVycm9yIHVwd2FyZHMgdG93YXJkcyB0aGUgcm9vdCwgc28gdGhhdCB0aGUgc3VidHJlZSB0aGF0IGRvZXMgbm90IGhhdmUKLSAgIGVub3VnaCBibGFjayBlZGdlcyBiZWNvbWVzIHRoZSB3aG9sZSB0cmVlLiAgT25jZSB0aGF0IGhhcHBlbnMsIHRoZSBlcnJvcgotICAgaGFzIGRpc2FwcGVhcmVkLiAgSXQgbWF5IG5vdCBiZSBuZWNlc3NhcnkgdG8gZ28gYWxsIHRoZSB3YXkgdXAsIHNpbmNlIGl0Ci0gICBpcyBwb3NzaWJsZSB0aGF0IHJvdGF0aW9ucyBhbmQgcmVjb2xvcmluZyBjYW4gZml4IHRoZSBlcnJvciBiZWZvcmUgdGhhdC4KLQotICAgQWx0aG91Z2ggdGhlIGRlbGV0aW9uIGFsZ29yaXRobSBtdXN0IHdhbGsgdXB3YXJkcyB0aHJvdWdoIHRoZSB0cmVlLCB3ZQotICAgZG8gbm90IHN0b3JlIHBhcmVudCBwb2ludGVycyBpbiB0aGUgbm9kZXMuICBJbnN0ZWFkLCBkZWxldGUgYWxsb2NhdGVzIGEKLSAgIHNtYWxsIGFycmF5IG9mIHBhcmVudCBwb2ludGVycyBhbmQgZmlsbHMgaXQgd2hpbGUgZGVzY2VuZGluZyB0aGUgdHJlZS4KLSAgIFNpbmNlIHdlIGtub3cgdGhhdCB0aGUgbGVuZ3RoIG9mIGEgcGF0aCBpcyBPKGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyCi0gICBvZiBub2RlcywgdGhpcyBpcyBsaWtlbHkgdG8gdXNlIGxlc3MgbWVtb3J5LiAgKi8KLQotLyogVHJlZSByb3RhdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0gICAgICBBICAgICAgICAgICAgICAgIEMKLSAgICAgLyBcICAgICAgICAgICAgICAvIFwKLSAgICBCICAgQyAgICAgICAgICAgIEEgICBHCi0gICAvIFwgLyBcICAtLT4gICAgIC8gXAotICAgRCBFIEYgRyAgICAgICAgIEIgICBGCi0gICAgICAgICAgICAgICAgICAvIFwKLSAgICAgICAgICAgICAgICAgRCAgIEUKLQotICAgSW4gdGhpcyBjYXNlLCBBIGhhcyBiZWVuIHJvdGF0ZWQgbGVmdC4gIFRoaXMgcHJlc2VydmVzIHRoZSBvcmRlcmluZyBvZiB0aGUKLSAgIGJpbmFyeSB0cmVlLiAgKi8KLQotI2luY2x1ZGUgPGNvbmZpZy5oPgotCi0vKiBTcGVjaWZpY2F0aW9uLiAgKi8KLSNpZmRlZiBJTl9MSUJJTlRMCi0jIGluY2x1ZGUgInRzZWFyY2guaCIKLSNlbHNlCi0jIGluY2x1ZGUgPHNlYXJjaC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotdHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOwotdHlwZWRlZiB2b2lkICgqX19hY3Rpb25fZm5fdCkgKGNvbnN0IHZvaWQgKiwgVklTSVQsIGludCk7Ci0KLSNpZm5kZWYgd2Vha19hbGlhcwotIyBkZWZpbmUgX190c2VhcmNoIHRzZWFyY2gKLSMgZGVmaW5lIF9fdGZpbmQgdGZpbmQKLSMgZGVmaW5lIF9fdGRlbGV0ZSB0ZGVsZXRlCi0jIGRlZmluZSBfX3R3YWxrIHR3YWxrCi0jZW5kaWYKLQotI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgotLyogSW5zaWRlIEdOVSBsaWJjIHdlIG1hcmsgc29tZSBmdW5jdGlvbiBpbiBhIHNwZWNpYWwgd2F5LiAgSW4gb3RoZXIKLSAgIGVudmlyb25tZW50cyBzaW1wbHkgaWdub3JlIHRoZSBtYXJraW5nLiAgKi8KLSMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3Qgbm9kZV90Ci17Ci0gIC8qIENhbGxlcnMgZXhwZWN0IHRoaXMgdG8gYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHN0cnVjdHVyZSAtIGRvIG5vdAotICAgICBtb3ZlISAgKi8KLSAgY29uc3Qgdm9pZCAqa2V5OwotICBzdHJ1Y3Qgbm9kZV90ICpsZWZ0OwotICBzdHJ1Y3Qgbm9kZV90ICpyaWdodDsKLSAgdW5zaWduZWQgaW50IHJlZDoxOwotfSAqbm9kZTsKLXR5cGVkZWYgY29uc3Qgc3RydWN0IG5vZGVfdCAqY29uc3Rfbm9kZTsKLQotI3VuZGVmIERFQlVHR0lORwotCi0jaWZkZWYgREVCVUdHSU5HCi0KLS8qIFJvdXRpbmVzIHRvIGNoZWNrIHRyZWUgaW52YXJpYW50cy4gICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZSBDSEVDS19UUkVFKGEpIGNoZWNrX3RyZWUoYSkKLQotc3RhdGljIHZvaWQKLWNoZWNrX3RyZWVfcmVjdXJzZSAobm9kZSBwLCBpbnQgZF9zb2ZhciwgaW50IGRfdG90YWwpCi17Ci0gIGlmIChwID09IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChkX3NvZmFyID09IGRfdG90YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjaGVja190cmVlX3JlY3Vyc2UgKHAtPmxlZnQsIGRfc29mYXIgKyAocC0+bGVmdCAmJiAhcC0+bGVmdC0+cmVkKSwgZF90b3RhbCk7Ci0gIGNoZWNrX3RyZWVfcmVjdXJzZSAocC0+cmlnaHQsIGRfc29mYXIgKyAocC0+cmlnaHQgJiYgIXAtPnJpZ2h0LT5yZWQpLCBkX3RvdGFsKTsKLSAgaWYgKHAtPmxlZnQpCi0gICAgYXNzZXJ0ICghKHAtPmxlZnQtPnJlZCAmJiBwLT5yZWQpKTsKLSAgaWYgKHAtPnJpZ2h0KQotICAgIGFzc2VydCAoIShwLT5yaWdodC0+cmVkICYmIHAtPnJlZCkpOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfdHJlZSAobm9kZSByb290KQotewotICBpbnQgY250ID0gMDsKLSAgbm9kZSBwOwotICBpZiAocm9vdCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgcm9vdC0+cmVkID0gMDsKLSAgZm9yKHAgPSByb290LT5sZWZ0OyBwOyBwID0gcC0+bGVmdCkKLSAgICBjbnQgKz0gIXAtPnJlZDsKLSAgY2hlY2tfdHJlZV9yZWN1cnNlIChyb290LCAwLCBjbnQpOwotfQotCi0KLSNlbHNlCi0KLSNkZWZpbmUgQ0hFQ0tfVFJFRShhKQotCi0jZW5kaWYKLQotLyogUG9zc2libHkgInNwbGl0IiBhIG5vZGUgd2l0aCB0d28gcmVkIHN1Y2Nlc3NvcnMsIGFuZC9vciBmaXggdXAgdHdvIHJlZAotICAgZWRnZXMgaW4gYSByb3cuICBST09UUCBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvd2VzdCBub2RlIHdlIHZpc2l0ZWQsIFBBUkVOVFAKLSAgIGFuZCBHUEFSRU5UUCBwb2ludGVycyB0byBpdHMgcGFyZW50L2dyYW5kcGFyZW50LiAgUF9SIGFuZCBHUF9SIGNvbnRhaW4gdGhlCi0gICBjb21wYXJpc29uIHZhbHVlcyB0aGF0IGRldGVybWluZWQgd2hpY2ggd2F5IHdhcyB0YWtlbiBpbiB0aGUgdHJlZSB0byByZWFjaAotICAgUk9PVFAuICBNT0RFIGlzIDEgaWYgd2UgbmVlZCBub3QgZG8gdGhlIHNwbGl0LCBidXQgbXVzdCBjaGVjayBmb3IgdHdvIHJlZAotICAgZWRnZXMgYmV0d2VlbiBHUEFSRU5UUCBhbmQgUk9PVFAuICAqLwotc3RhdGljIHZvaWQKLW1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgKG5vZGUgKnJvb3RwLCBub2RlICpwYXJlbnRwLCBub2RlICpncGFyZW50cCwKLQkJCWludCBwX3IsIGludCBncF9yLCBpbnQgbW9kZSkKLXsKLSAgbm9kZSByb290ID0gKnJvb3RwOwotICBub2RlICpycCwgKmxwOwotICBycCA9ICYoKnJvb3RwKS0+cmlnaHQ7Ci0gIGxwID0gJigqcm9vdHApLT5sZWZ0OwotCi0gIC8qIFNlZSBpZiB3ZSBoYXZlIHRvIHNwbGl0IHRoaXMgbm9kZSAoYm90aCBzdWNjZXNzb3JzIHJlZCkuICAqLwotICBpZiAobW9kZSA9PSAxCi0gICAgICB8fCAoKCpycCkgIT0gTlVMTCAmJiAoKmxwKSAhPSBOVUxMICYmICgqcnApLT5yZWQgJiYgKCpscCktPnJlZCkpCi0gICAgewotICAgICAgLyogVGhpcyBub2RlIGJlY29tZXMgcmVkLCBpdHMgc3VjY2Vzc29ycyBibGFjay4gICovCi0gICAgICByb290LT5yZWQgPSAxOwotICAgICAgaWYgKCpycCkKLQkoKnJwKS0+cmVkID0gMDsKLSAgICAgIGlmICgqbHApCi0JKCpscCktPnJlZCA9IDA7Ci0KLSAgICAgIC8qIElmIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGlzIGFsc28gcmVkLCB3ZSBoYXZlIHRvIGRvCi0JIHJvdGF0aW9ucy4gICovCi0gICAgICBpZiAocGFyZW50cCAhPSBOVUxMICYmICgqcGFyZW50cCktPnJlZCkKLQl7Ci0JICBub2RlIGdwID0gKmdwYXJlbnRwOwotCSAgbm9kZSBwID0gKnBhcmVudHA7Ci0JICAvKiBUaGVyZSBhcmUgdHdvIG1haW4gY2FzZXM6Ci0JICAgICAxLiBUaGUgZWRnZSB0eXBlcyAobGVmdCBvciByaWdodCkgb2YgdGhlIHR3byByZWQgZWRnZXMgZGlmZmVyLgotCSAgICAgMi4gQm90aCByZWQgZWRnZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCi0JICAgICBUaGVyZSBleGlzdCB0d28gc3ltbWV0cmllcyBvZiBlYWNoIGNhc2UsIHNvIHRoZXJlIGlzIGEgdG90YWwgb2YKLQkgICAgIDQgY2FzZXMuICAqLwotCSAgaWYgKChwX3IgPiAwKSAhPSAoZ3BfciA+IDApKQotCSAgICB7Ci0JICAgICAgLyogUHV0IHRoZSBjaGlsZCBhdCB0aGUgdG9wIG9mIHRoZSB0cmVlLCB3aXRoIGl0cyBwYXJlbnQKLQkJIGFuZCBncmFuZHBhcmVudCBhcyBzdWNjZXNzb3JzLiAgKi8KLQkgICAgICBwLT5yZWQgPSAxOwotCSAgICAgIGdwLT5yZWQgPSAxOwotCSAgICAgIHJvb3QtPnJlZCA9IDA7Ci0JICAgICAgaWYgKHBfciA8IDApCi0JCXsKLQkJICAvKiBDaGlsZCBpcyBsZWZ0IG9mIHBhcmVudC4gICovCi0JCSAgcC0+bGVmdCA9ICpycDsKLQkJICAqcnAgPSBwOwotCQkgIGdwLT5yaWdodCA9ICpscDsKLQkJICAqbHAgPSBncDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENoaWxkIGlzIHJpZ2h0IG9mIHBhcmVudC4gICovCi0JCSAgcC0+cmlnaHQgPSAqbHA7Ci0JCSAgKmxwID0gcDsKLQkJICBncC0+bGVmdCA9ICpycDsKLQkJICAqcnAgPSBncDsKLQkJfQotCSAgICAgICpncGFyZW50cCA9IHJvb3Q7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpncGFyZW50cCA9ICpwYXJlbnRwOwotCSAgICAgIC8qIFBhcmVudCBiZWNvbWVzIHRoZSB0b3Agb2YgdGhlIHRyZWUsIGdyYW5kcGFyZW50IGFuZAotCQkgY2hpbGQgYXJlIGl0cyBzdWNjZXNzb3JzLiAgKi8KLQkgICAgICBwLT5yZWQgPSAwOwotCSAgICAgIGdwLT5yZWQgPSAxOwotCSAgICAgIGlmIChwX3IgPCAwKQotCQl7Ci0JCSAgLyogTGVmdCBlZGdlcy4gICovCi0JCSAgZ3AtPmxlZnQgPSBwLT5yaWdodDsKLQkJICBwLT5yaWdodCA9IGdwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogUmlnaHQgZWRnZXMuICAqLwotCQkgIGdwLT5yaWdodCA9IHAtPmxlZnQ7Ci0JCSAgcC0+bGVmdCA9IGdwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBGaW5kIG9yIGluc2VydCBkYXR1bSBpbnRvIHNlYXJjaCB0cmVlLgotICAgS0VZIGlzIHRoZSBrZXkgdG8gYmUgbG9jYXRlZCwgUk9PVFAgaXMgdGhlIGFkZHJlc3Mgb2YgdHJlZSByb290LAotICAgQ09NUEFSIHRoZSBvcmRlcmluZyBmdW5jdGlvbi4gICovCi12b2lkICoKLV9fdHNlYXJjaCAoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICoqdnJvb3RwLCBfX2NvbXBhcl9mbl90IGNvbXBhcikKLXsKLSAgbm9kZSBxOwotICBub2RlICpwYXJlbnRwID0gTlVMTCwgKmdwYXJlbnRwID0gTlVMTDsKLSAgbm9kZSAqcm9vdHAgPSAobm9kZSAqKSB2cm9vdHA7Ci0gIG5vZGUgKm5leHRwOwotICBpbnQgciA9IDAsIHBfciA9IDAsIGdwX3IgPSAwOyAvKiBObyB0aGV5IG1pZ2h0IG5vdCwgTXIgQ29tcGlsZXIuICAqLwotCi0gIGlmIChyb290cCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFRoaXMgc2F2ZXMgc29tZSBhZGRpdGlvbmFsIHRlc3RzIGJlbG93LiAgKi8KLSAgaWYgKCpyb290cCAhPSBOVUxMKQotICAgICgqcm9vdHApLT5yZWQgPSAwOwotCi0gIENIRUNLX1RSRUUgKCpyb290cCk7Ci0KLSAgbmV4dHAgPSByb290cDsKLSAgd2hpbGUgKCpuZXh0cCAhPSBOVUxMKQotICAgIHsKLSAgICAgIG5vZGUgcm9vdCA9ICpyb290cDsKLSAgICAgIHIgPSAoKmNvbXBhcikgKGtleSwgcm9vdC0+a2V5KTsKLSAgICAgIGlmIChyID09IDApCi0JcmV0dXJuIHJvb3Q7Ci0KLSAgICAgIG1heWJlX3NwbGl0X2Zvcl9pbnNlcnQgKHJvb3RwLCBwYXJlbnRwLCBncGFyZW50cCwgcF9yLCBncF9yLCAwKTsKLSAgICAgIC8qIElmIHRoYXQgZGlkIGFueSByb3RhdGlvbnMsIHBhcmVudHAgYW5kIGdwYXJlbnRwIGFyZSBub3cgZ2FyYmFnZS4KLQkgVGhhdCBkb2Vzbid0IG1hdHRlciwgYmVjYXVzZSB0aGUgdmFsdWVzIHRoZXkgY29udGFpbiBhcmUgbmV2ZXIKLQkgdXNlZCBhZ2FpbiBpbiB0aGF0IGNhc2UuICAqLwotCi0gICAgICBuZXh0cCA9IHIgPCAwID8gJnJvb3QtPmxlZnQgOiAmcm9vdC0+cmlnaHQ7Ci0gICAgICBpZiAoKm5leHRwID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIGdwYXJlbnRwID0gcGFyZW50cDsKLSAgICAgIHBhcmVudHAgPSByb290cDsKLSAgICAgIHJvb3RwID0gbmV4dHA7Ci0KLSAgICAgIGdwX3IgPSBwX3I7Ci0gICAgICBwX3IgPSByOwotICAgIH0KLQotICBxID0gKHN0cnVjdCBub2RlX3QgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBub2RlX3QpKTsKLSAgaWYgKHEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqbmV4dHAgPSBxOwkJCS8qIGxpbmsgbmV3IG5vZGUgdG8gb2xkICovCi0gICAgICBxLT5rZXkgPSBrZXk7CQkJLyogaW5pdGlhbGl6ZSBuZXcgbm9kZSAqLwotICAgICAgcS0+cmVkID0gMTsKLSAgICAgIHEtPmxlZnQgPSBxLT5yaWdodCA9IE5VTEw7Ci0KLSAgICAgIGlmIChuZXh0cCAhPSByb290cCkKLQkvKiBUaGVyZSBtYXkgYmUgdHdvIHJlZCBlZGdlcyBpbiBhIHJvdyBub3csIHdoaWNoIHdlIG11c3QgYXZvaWQgYnkKLQkgICByb3RhdGluZyB0aGUgdHJlZS4gICovCi0JbWF5YmVfc3BsaXRfZm9yX2luc2VydCAobmV4dHAsIHJvb3RwLCBwYXJlbnRwLCByLCBwX3IsIDEpOwotICAgIH0KLQotICByZXR1cm4gcTsKLX0KLSNpZmRlZiB3ZWFrX2FsaWFzCi13ZWFrX2FsaWFzIChfX3RzZWFyY2gsIHRzZWFyY2gpCi0jZW5kaWYKLQotCi0vKiBGaW5kIGRhdHVtIGluIHNlYXJjaCB0cmVlLgotICAgS0VZIGlzIHRoZSBrZXkgdG8gYmUgbG9jYXRlZCwgUk9PVFAgaXMgdGhlIGFkZHJlc3Mgb2YgdHJlZSByb290LAotICAgQ09NUEFSIHRoZSBvcmRlcmluZyBmdW5jdGlvbi4gICovCi12b2lkICoKLV9fdGZpbmQgKGtleSwgdnJvb3RwLCBjb21wYXIpCi0gICAgIGNvbnN0IHZvaWQgKmtleTsKLSAgICAgdm9pZCAqY29uc3QgKnZyb290cDsKLSAgICAgX19jb21wYXJfZm5fdCBjb21wYXI7Ci17Ci0gIG5vZGUgKnJvb3RwID0gKG5vZGUgKikgdnJvb3RwOwotCi0gIGlmIChyb290cCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIENIRUNLX1RSRUUgKCpyb290cCk7Ci0KLSAgd2hpbGUgKCpyb290cCAhPSBOVUxMKQotICAgIHsKLSAgICAgIG5vZGUgcm9vdCA9ICpyb290cDsKLSAgICAgIGludCByOwotCi0gICAgICByID0gKCpjb21wYXIpIChrZXksIHJvb3QtPmtleSk7Ci0gICAgICBpZiAociA9PSAwKQotCXJldHVybiByb290OwotCi0gICAgICByb290cCA9IHIgPCAwID8gJnJvb3QtPmxlZnQgOiAmcm9vdC0+cmlnaHQ7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLSNpZmRlZiB3ZWFrX2FsaWFzCi13ZWFrX2FsaWFzIChfX3RmaW5kLCB0ZmluZCkKLSNlbmRpZgotCi0KLS8qIERlbGV0ZSBub2RlIHdpdGggZ2l2ZW4ga2V5LgotICAgS0VZIGlzIHRoZSBrZXkgdG8gYmUgZGVsZXRlZCwgUk9PVFAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJvb3Qgb2YgdHJlZSwKLSAgIENPTVBBUiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi4gICovCi12b2lkICoKLV9fdGRlbGV0ZSAoY29uc3Qgdm9pZCAqa2V5LCB2b2lkICoqdnJvb3RwLCBfX2NvbXBhcl9mbl90IGNvbXBhcikKLXsKLSAgbm9kZSBwLCBxLCByLCByZXR2YWw7Ci0gIGludCBjbXA7Ci0gIG5vZGUgKnJvb3RwID0gKG5vZGUgKikgdnJvb3RwOwotICBub2RlIHJvb3QsIHVuY2hhaW5lZDsKLSAgLyogU3RhY2sgb2Ygbm9kZXMgc28gd2UgcmVtZW1iZXIgdGhlIHBhcmVudHMgd2l0aG91dCByZWN1cnNpb24uICBJdCdzCi0gICAgIF92ZXJ5XyB1bmxpa2VseSB0aGF0IHRoZXJlIGFyZSBwYXRocyBsb25nZXIgdGhhbiA0MCBub2Rlcy4gIFRoZSB0cmVlCi0gICAgIHdvdWxkIG5lZWQgdG8gaGF2ZSBhcm91bmQgMjUwLjAwMCBub2Rlcy4gICovCi0gIGludCBzdGFja3NpemUgPSAxMDA7Ci0gIGludCBzcCA9IDA7Ci0gIG5vZGUgKm5vZGVzdGFja1sxMDBdOwotCi0gIGlmIChyb290cCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBwID0gKnJvb3RwOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIENIRUNLX1RSRUUgKHApOwotCi0gIHdoaWxlICgoY21wID0gKCpjb21wYXIpIChrZXksICgqcm9vdHApLT5rZXkpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzcCA9PSBzdGFja3NpemUpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIG5vZGVzdGFja1tzcCsrXSA9IHJvb3RwOwotICAgICAgcCA9ICpyb290cDsKLSAgICAgIHJvb3RwID0gKChjbXAgPCAwKQotCSAgICAgICA/ICYoKnJvb3RwKS0+bGVmdAotCSAgICAgICA6ICYoKnJvb3RwKS0+cmlnaHQpOwotICAgICAgaWYgKCpyb290cCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvZ3VzIGlmIHRoZSBub2RlIHRvIGJlIGRlbGV0ZWQgaXMgdGhlIHJvb3QuLi4gdGhpcyByb3V0aW5lCi0gICAgIHJlYWxseSBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIgd2l0aCAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZQotICAgICBhbmQgZXJybm8gPSBFU1JDSCBvciBzb21ldGhpbmcuICAqLwotICByZXR2YWwgPSBwOwotCi0gIC8qIFdlIGRvbid0IHVuY2hhaW4gdGhlIG5vZGUgd2Ugd2FudCB0byBkZWxldGUuIEluc3RlYWQsIHdlIG92ZXJ3cml0ZQotICAgICBpdCB3aXRoIGl0cyBzdWNjZXNzb3IgYW5kIHVuY2hhaW4gdGhlIHN1Y2Nlc3Nvci4gIElmIHRoZXJlIGlzIG5vCi0gICAgIHN1Y2Nlc3Nvciwgd2UgcmVhbGx5IHVuY2hhaW4gdGhlIG5vZGUgdG8gYmUgZGVsZXRlZC4gICovCi0KLSAgcm9vdCA9ICpyb290cDsKLQotICByID0gcm9vdC0+cmlnaHQ7Ci0gIHEgPSByb290LT5sZWZ0OwotCi0gIGlmIChxID09IE5VTEwgfHwgciA9PSBOVUxMKQotICAgIHVuY2hhaW5lZCA9IHJvb3Q7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBub2RlICpwYXJlbnQgPSByb290cCwgKnVwID0gJnJvb3QtPnJpZ2h0OwotICAgICAgZm9yICg7OykKLQl7Ci0JICBpZiAoc3AgPT0gc3RhY2tzaXplKQotCSAgICBhYm9ydCAoKTsKLQkgIG5vZGVzdGFja1tzcCsrXSA9IHBhcmVudDsKLQkgIHBhcmVudCA9IHVwOwotCSAgaWYgKCgqdXApLT5sZWZ0ID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgdXAgPSAmKCp1cCktPmxlZnQ7Ci0JfQotICAgICAgdW5jaGFpbmVkID0gKnVwOwotICAgIH0KLQotICAvKiBXZSBrbm93IHRoYXQgZWl0aGVyIHRoZSBsZWZ0IG9yIHJpZ2h0IHN1Y2Nlc3NvciBvZiBVTkNIQUlORUQgaXMgTlVMTC4KLSAgICAgUiBiZWNvbWVzIHRoZSBvdGhlciBvbmUsIGl0IGlzIGNoYWluZWQgaW50byB0aGUgcGFyZW50IG9mIFVOQ0hBSU5FRC4gICovCi0gIHIgPSB1bmNoYWluZWQtPmxlZnQ7Ci0gIGlmIChyID09IE5VTEwpCi0gICAgciA9IHVuY2hhaW5lZC0+cmlnaHQ7Ci0gIGlmIChzcCA9PSAwKQotICAgICpyb290cCA9IHI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxID0gKm5vZGVzdGFja1tzcC0xXTsKLSAgICAgIGlmICh1bmNoYWluZWQgPT0gcS0+cmlnaHQpCi0JcS0+cmlnaHQgPSByOwotICAgICAgZWxzZQotCXEtPmxlZnQgPSByOwotICAgIH0KLQotICBpZiAodW5jaGFpbmVkICE9IHJvb3QpCi0gICAgcm9vdC0+a2V5ID0gdW5jaGFpbmVkLT5rZXk7Ci0gIGlmICghdW5jaGFpbmVkLT5yZWQpCi0gICAgewotICAgICAgLyogTm93IHdlIGxvc3QgYSBibGFjayBlZGdlLCB3aGljaCBtZWFucyB0aGF0IHRoZSBudW1iZXIgb2YgYmxhY2sKLQkgZWRnZXMgb24gZXZlcnkgcGF0aCBpcyBubyBsb25nZXIgY29uc3RhbnQuICBXZSBtdXN0IGJhbGFuY2UgdGhlCi0JIHRyZWUuICAqLwotICAgICAgLyogTk9ERVNUQUNLIG5vdyBjb250YWlucyBhbGwgcGFyZW50cyBvZiBSLiAgUiBpcyBsaWtlbHkgdG8gYmUgTlVMTAotCSBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uLiAgKi8KLSAgICAgIC8qIE5VTEwgbm9kZXMgYXJlIGNvbnNpZGVyZWQgYmxhY2sgdGhyb3VnaG91dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvcgotCSBjb3JyZWN0bmVzcy4gICovCi0gICAgICB3aGlsZSAoc3AgPiAwICYmIChyID09IE5VTEwgfHwgIXItPnJlZCkpCi0JewotCSAgbm9kZSAqcHAgPSBub2Rlc3RhY2tbc3AgLSAxXTsKLQkgIHAgPSAqcHA7Ci0JICAvKiBUd28gc3ltbWV0cmljIGNhc2VzLiAgKi8KLQkgIGlmIChyID09IHAtPmxlZnQpCi0JICAgIHsKLQkgICAgICAvKiBRIGlzIFIncyBicm90aGVyLCBQIGlzIFIncyBwYXJlbnQuICBUaGUgc3VidHJlZSB3aXRoIHJvb3QKLQkJIFIgaGFzIG9uZSBibGFjayBlZGdlIGxlc3MgdGhhbiB0aGUgc3VidHJlZSB3aXRoIHJvb3QgUS4gICovCi0JICAgICAgcSA9IHAtPnJpZ2h0OwotCSAgICAgIGlmIChxLT5yZWQpCi0JCXsKLQkJICAvKiBJZiBRIGlzIHJlZCwgd2Uga25vdyB0aGF0IFAgaXMgYmxhY2suIFdlIHJvdGF0ZSBQIGxlZnQKLQkJICAgICBzbyB0aGF0IFEgYmVjb21lcyB0aGUgdG9wIG5vZGUgaW4gdGhlIHRyZWUsIHdpdGggUCBiZWxvdwotCQkgICAgIGl0LiAgUCBpcyBjb2xvcmVkIHJlZCwgUSBpcyBjb2xvcmVkIGJsYWNrLgotCQkgICAgIFRoaXMgYWN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgYmxhY2sgZWRnZSBjb3VudCBmb3IgYW55Ci0JCSAgICAgbGVhZiBpbiB0aGUgdHJlZSwgYnV0IHdlIHdpbGwgYmUgYWJsZSB0byByZWNvZ25pemUgb25lCi0JCSAgICAgb2YgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zLCB3aGljaCBhbGwgcmVxdWlyZSB0aGF0IFEKLQkJICAgICBpcyBibGFjay4gICovCi0JCSAgcS0+cmVkID0gMDsKLQkJICBwLT5yZWQgPSAxOwotCQkgIC8qIExlZnQgcm90YXRlIHAuICAqLwotCQkgIHAtPnJpZ2h0ID0gcS0+bGVmdDsKLQkJICBxLT5sZWZ0ID0gcDsKLQkJICAqcHAgPSBxOwotCQkgIC8qIE1ha2Ugc3VyZSBwcCBpcyByaWdodCBpZiB0aGUgY2FzZSBiZWxvdyB0cmllcyB0byB1c2UKLQkJICAgICBpdC4gICovCi0JCSAgbm9kZXN0YWNrW3NwKytdID0gcHAgPSAmcS0+bGVmdDsKLQkJICBxID0gcC0+cmlnaHQ7Ci0JCX0KLQkgICAgICAvKiBXZSBrbm93IHRoYXQgUSBjYW4ndCBiZSBOVUxMIGhlcmUuICBXZSBhbHNvIGtub3cgdGhhdCBRIGlzCi0JCSBibGFjay4gICovCi0JICAgICAgaWYgKChxLT5sZWZ0ID09IE5VTEwgfHwgIXEtPmxlZnQtPnJlZCkKLQkJICAmJiAocS0+cmlnaHQgPT0gTlVMTCB8fCAhcS0+cmlnaHQtPnJlZCkpCi0JCXsKLQkJICAvKiBRIGhhcyB0d28gYmxhY2sgc3VjY2Vzc29ycy4gIFdlIGNhbiBzaW1wbHkgY29sb3IgUSByZWQuCi0JCSAgICAgVGhlIHdob2xlIHN1YnRyZWUgd2l0aCByb290IFAgaXMgbm93IG1pc3Npbmcgb25lIGJsYWNrCi0JCSAgICAgZWRnZS4gIE5vdGUgdGhhdCB0aGlzIGFjdGlvbiBjYW4gdGVtcG9yYXJpbHkgbWFrZSB0aGUKLQkJICAgICB0cmVlIGludmFsaWQgKGlmIFAgaXMgcmVkKS4gIEJ1dCB3ZSB3aWxsIGV4aXQgdGhlIGxvb3AKLQkJICAgICBpbiB0aGF0IGNhc2UgYW5kIHNldCBQIGJsYWNrLCB3aGljaCBib3RoIG1ha2VzIHRoZSB0cmVlCi0JCSAgICAgdmFsaWQgYW5kIGFsc28gbWFrZXMgdGhlIGJsYWNrIGVkZ2UgY291bnQgY29tZSBvdXQKLQkJICAgICByaWdodC4gIElmIFAgaXMgYmxhY2ssIHdlIGFyZSBhdCBsZWFzdCBvbmUgc3RlcCBjbG9zZXIKLQkJICAgICB0byB0aGUgcm9vdCBhbmQgd2UnbGwgdHJ5IGFnYWluIHRoZSBuZXh0IGl0ZXJhdGlvbi4gICovCi0JCSAgcS0+cmVkID0gMTsKLQkJICByID0gcDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFEgaXMgYmxhY2ssIG9uZSBvZiBRJ3Mgc3VjY2Vzc29ycyBpcyByZWQuICBXZSBjYW4KLQkJICAgICByZXBhaXIgdGhlIHRyZWUgd2l0aCBvbmUgb3BlcmF0aW9uIGFuZCB3aWxsIGV4aXQgdGhlCi0JCSAgICAgbG9vcCBhZnRlcndhcmRzLiAgKi8KLQkJICBpZiAocS0+cmlnaHQgPT0gTlVMTCB8fCAhcS0+cmlnaHQtPnJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxlZnQgb25lIGlzIHJlZC4gIFdlIHBlcmZvcm0gdGhlIHNhbWUgYWN0aW9uIGFzCi0JCQkgaW4gbWF5YmVfc3BsaXRfZm9yX2luc2VydCB3aGVyZSB0d28gcmVkIGVkZ2VzIGFyZQotCQkJIGFkamFjZW50IGJ1dCBwb2ludCBpbiBkaWZmZXJlbnQgZGlyZWN0aW9uczoKLQkJCSBRJ3MgbGVmdCBzdWNjZXNzb3IgKGxldCdzIGNhbGwgaXQgUTIpIGJlY29tZXMgdGhlCi0JCQkgdG9wIG9mIHRoZSBzdWJ0cmVlIHdlIGFyZSBsb29raW5nIGF0LCBpdHMgcGFyZW50IChRKQotCQkJIGFuZCBncmFuZHBhcmVudCAoUCkgYmVjb21lIGl0cyBzdWNjZXNzb3JzLiBUaGUgZm9ybWVyCi0JCQkgc3VjY2Vzc29ycyBvZiBRMiBhcmUgcGxhY2VkIGJlbG93IFAgYW5kIFEuCi0JCQkgUCBiZWNvbWVzIGJsYWNrLCBhbmQgUTIgZ2V0cyB0aGUgY29sb3IgdGhhdCBQIGhhZC4KLQkJCSBUaGlzIGNoYW5nZXMgdGhlIGJsYWNrIGVkZ2UgY291bnQgb25seSBmb3Igbm9kZSBSIGFuZAotCQkJIGl0cyBzdWNjZXNzb3JzLiAgKi8KLQkJICAgICAgbm9kZSBxMiA9IHEtPmxlZnQ7Ci0JCSAgICAgIHEyLT5yZWQgPSBwLT5yZWQ7Ci0JCSAgICAgIHAtPnJpZ2h0ID0gcTItPmxlZnQ7Ci0JCSAgICAgIHEtPmxlZnQgPSBxMi0+cmlnaHQ7Ci0JCSAgICAgIHEyLT5yaWdodCA9IHE7Ci0JCSAgICAgIHEyLT5sZWZ0ID0gcDsKLQkJICAgICAgKnBwID0gcTI7Ci0JCSAgICAgIHAtPnJlZCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJdCdzIHRoZSByaWdodCBvbmUuICBSb3RhdGUgUCBsZWZ0LiBQIGJlY29tZXMgYmxhY2ssCi0JCQkgYW5kIFEgZ2V0cyB0aGUgY29sb3IgdGhhdCBQIGhhZC4gIFEncyByaWdodCBzdWNjZXNzb3IKLQkJCSBhbHNvIGJlY29tZXMgYmxhY2suICBUaGlzIGNoYW5nZXMgdGhlIGJsYWNrIGVkZ2UKLQkJCSBjb3VudCBvbmx5IGZvciBub2RlIFIgYW5kIGl0cyBzdWNjZXNzb3JzLiAgKi8KLQkJICAgICAgcS0+cmVkID0gcC0+cmVkOwotCQkgICAgICBwLT5yZWQgPSAwOwotCi0JCSAgICAgIHEtPnJpZ2h0LT5yZWQgPSAwOwotCi0JCSAgICAgIC8qIGxlZnQgcm90YXRlIHAgKi8KLQkJICAgICAgcC0+cmlnaHQgPSBxLT5sZWZ0OwotCQkgICAgICBxLT5sZWZ0ID0gcDsKLQkJICAgICAgKnBwID0gcTsKLQkJICAgIH0KLQotCQkgIC8qIFdlJ3JlIGRvbmUuICAqLwotCQkgIHNwID0gMTsKLQkJICByID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBDb21tZW50czogc2VlIGFib3ZlLiAgKi8KLQkgICAgICBxID0gcC0+bGVmdDsKLQkgICAgICBpZiAocS0+cmVkKQotCQl7Ci0JCSAgcS0+cmVkID0gMDsKLQkJICBwLT5yZWQgPSAxOwotCQkgIHAtPmxlZnQgPSBxLT5yaWdodDsKLQkJICBxLT5yaWdodCA9IHA7Ci0JCSAgKnBwID0gcTsKLQkJICBub2Rlc3RhY2tbc3ArK10gPSBwcCA9ICZxLT5yaWdodDsKLQkJICBxID0gcC0+bGVmdDsKLQkJfQotCSAgICAgIGlmICgocS0+cmlnaHQgPT0gTlVMTCB8fCAhcS0+cmlnaHQtPnJlZCkKLQkJICAgICAgICYmIChxLT5sZWZ0ID09IE5VTEwgfHwgIXEtPmxlZnQtPnJlZCkpCi0JCXsKLQkJICBxLT5yZWQgPSAxOwotCQkgIHIgPSBwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHEtPmxlZnQgPT0gTlVMTCB8fCAhcS0+bGVmdC0+cmVkKQotCQkgICAgewotCQkgICAgICBub2RlIHEyID0gcS0+cmlnaHQ7Ci0JCSAgICAgIHEyLT5yZWQgPSBwLT5yZWQ7Ci0JCSAgICAgIHAtPmxlZnQgPSBxMi0+cmlnaHQ7Ci0JCSAgICAgIHEtPnJpZ2h0ID0gcTItPmxlZnQ7Ci0JCSAgICAgIHEyLT5sZWZ0ID0gcTsKLQkJICAgICAgcTItPnJpZ2h0ID0gcDsKLQkJICAgICAgKnBwID0gcTI7Ci0JCSAgICAgIHAtPnJlZCA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBxLT5yZWQgPSBwLT5yZWQ7Ci0JCSAgICAgIHAtPnJlZCA9IDA7Ci0JCSAgICAgIHEtPmxlZnQtPnJlZCA9IDA7Ci0JCSAgICAgIHAtPmxlZnQgPSBxLT5yaWdodDsKLQkJICAgICAgcS0+cmlnaHQgPSBwOwotCQkgICAgICAqcHAgPSBxOwotCQkgICAgfQotCQkgIHNwID0gMTsKLQkJICByID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICAtLXNwOwotCX0KLSAgICAgIGlmIChyICE9IE5VTEwpCi0Jci0+cmVkID0gMDsKLSAgICB9Ci0KLSAgZnJlZSAodW5jaGFpbmVkKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLSNpZmRlZiB3ZWFrX2FsaWFzCi13ZWFrX2FsaWFzIChfX3RkZWxldGUsIHRkZWxldGUpCi0jZW5kaWYKLQotCi0vKiBXYWxrIHRoZSBub2RlcyBvZiBhIHRyZWUuCi0gICBST09UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIGJlIHdhbGtlZCwgQUNUSU9OIHRoZSBmdW5jdGlvbiB0byBiZQotICAgY2FsbGVkIGF0IGVhY2ggbm9kZS4gIExFVkVMIGlzIHRoZSBsZXZlbCBvZiBST09UIGluIHRoZSB3aG9sZSB0cmVlLiAgKi8KLXN0YXRpYyB2b2lkCi1pbnRlcm5hbF9mdW5jdGlvbgotdHJlY3Vyc2UgKGNvbnN0IHZvaWQgKnZyb290LCBfX2FjdGlvbl9mbl90IGFjdGlvbiwgaW50IGxldmVsKQotewotICBjb25zdF9ub2RlIHJvb3QgPSAoY29uc3Rfbm9kZSkgdnJvb3Q7Ci0KLSAgaWYgKHJvb3QtPmxlZnQgPT0gTlVMTCAmJiByb290LT5yaWdodCA9PSBOVUxMKQotICAgICgqYWN0aW9uKSAocm9vdCwgbGVhZiwgbGV2ZWwpOwotICBlbHNlCi0gICAgewotICAgICAgKCphY3Rpb24pIChyb290LCBwcmVvcmRlciwgbGV2ZWwpOwotICAgICAgaWYgKHJvb3QtPmxlZnQgIT0gTlVMTCkKLQl0cmVjdXJzZSAocm9vdC0+bGVmdCwgYWN0aW9uLCBsZXZlbCArIDEpOwotICAgICAgKCphY3Rpb24pIChyb290LCBwb3N0b3JkZXIsIGxldmVsKTsKLSAgICAgIGlmIChyb290LT5yaWdodCAhPSBOVUxMKQotCXRyZWN1cnNlIChyb290LT5yaWdodCwgYWN0aW9uLCBsZXZlbCArIDEpOwotICAgICAgKCphY3Rpb24pIChyb290LCBlbmRvcmRlciwgbGV2ZWwpOwotICAgIH0KLX0KLQotCi0vKiBXYWxrIHRoZSBub2RlcyBvZiBhIHRyZWUuCi0gICBST09UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlIHRvIGJlIHdhbGtlZCwgQUNUSU9OIHRoZSBmdW5jdGlvbiB0byBiZQotICAgY2FsbGVkIGF0IGVhY2ggbm9kZS4gICovCi12b2lkCi1fX3R3YWxrIChjb25zdCB2b2lkICp2cm9vdCwgX19hY3Rpb25fZm5fdCBhY3Rpb24pCi17Ci0gIGNvbnN0X25vZGUgcm9vdCA9IChjb25zdF9ub2RlKSB2cm9vdDsKLQotICBDSEVDS19UUkVFIChyb290KTsKLQotICBpZiAocm9vdCAhPSBOVUxMICYmIGFjdGlvbiAhPSBOVUxMKQotICAgIHRyZWN1cnNlIChyb290LCBhY3Rpb24sIDApOwotfQotI2lmZGVmIHdlYWtfYWxpYXMKLXdlYWtfYWxpYXMgKF9fdHdhbGssIHR3YWxrKQotI2VuZGlmCi0KLQotI2lmZGVmIF9MSUJDCi0KLS8qIFRoZSBzdGFuZGFyZGl6ZWQgZnVuY3Rpb25zIG1pc3MgYW4gaW1wb3J0YW50IGZ1bmN0aW9uYWxpdHk6IHRoZQotICAgdHJlZSBjYW5ub3QgYmUgcmVtb3ZlZCBlYXNpbHkuICBXZSBwcm92aWRlIGEgZnVuY3Rpb24gdG8gZG8gdGhpcy4gICovCi1zdGF0aWMgdm9pZAotaW50ZXJuYWxfZnVuY3Rpb24KLXRkZXN0cm95X3JlY3Vyc2UgKG5vZGUgcm9vdCwgX19mcmVlX2ZuX3QgZnJlZWZjdCkKLXsKLSAgaWYgKHJvb3QtPmxlZnQgIT0gTlVMTCkKLSAgICB0ZGVzdHJveV9yZWN1cnNlIChyb290LT5sZWZ0LCBmcmVlZmN0KTsKLSAgaWYgKHJvb3QtPnJpZ2h0ICE9IE5VTEwpCi0gICAgdGRlc3Ryb3lfcmVjdXJzZSAocm9vdC0+cmlnaHQsIGZyZWVmY3QpOwotICAoKmZyZWVmY3QpICgodm9pZCAqKSByb290LT5rZXkpOwotICAvKiBGcmVlIHRoZSBub2RlIGl0c2VsZi4gICovCi0gIGZyZWUgKHJvb3QpOwotfQotCi12b2lkCi1fX3RkZXN0cm95ICh2b2lkICp2cm9vdCwgX19mcmVlX2ZuX3QgZnJlZWZjdCkKLXsKLSAgbm9kZSByb290ID0gKG5vZGUpIHZyb290OwotCi0gIENIRUNLX1RSRUUgKHJvb3QpOwotCi0gIGlmIChyb290ICE9IE5VTEwpCi0gICAgdGRlc3Ryb3lfcmVjdXJzZSAocm9vdCwgZnJlZWZjdCk7Ci19Ci13ZWFrX2FsaWFzIChfX3RkZXN0cm95LCB0ZGVzdHJveSkKLQotI2VuZGlmIC8qIF9MSUJDICovCmRpZmYgLS1naXQgYS9pbnRsL3RzZWFyY2guaCBiL2ludGwvdHNlYXJjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhlNGE5Li4wMDAwMDAwCi0tLSBhL2ludGwvdHNlYXJjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogQmluYXJ5IHRyZWUgZGF0YSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfVFNFQVJDSF9ICi0jZGVmaW5lIF9UU0VBUkNIX0gKLQotI2lmIEhBVkVfVFNFQVJDSAotCi0vKiBHZXQgdHNlYWNoKCksIHRmaW5kKCksIHRkZWxldGUoKSwgdHdhbGsoKSBkZWNsYXJhdGlvbnMuICAqLwotI2luY2x1ZGUgPHNlYXJjaC5oPgotCi0jZWxzZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFNlZSA8aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL3N1c3YzeGJkL3NlYXJjaC5oLmh0bWw+LAotICAgICAgIDxodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvc3VzdjN4c2gvdHNlYXJjaC5odG1sPgotICAgZm9yIGRldGFpbHMuICAqLwotCi10eXBlZGVmIGVudW0KLXsgCi0gIHByZW9yZGVyLAotICBwb3N0b3JkZXIsIAotICBlbmRvcmRlciwKLSAgbGVhZgotfQotVklTSVQ7Ci0KLS8qIFNlYXJjaGVzIGFuIGVsZW1lbnQgaW4gdGhlIHRyZWUgKlZST09UUCB0aGF0IGNvbXBhcmVzIGVxdWFsIHRvIEtFWS4KLSAgIElmIG9uZSBpcyBmb3VuZCwgaXQgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGEgbmV3IGVsZW1lbnQgZXF1YWwgdG8gS0VZCi0gICBpcyBpbnNlcnRlZCBpbiB0aGUgdHJlZSBhbmQgaXMgcmV0dXJuZWQuICAqLwotZXh0ZXJuIHZvaWQgKiB0c2VhcmNoIChjb25zdCB2b2lkICprZXksIHZvaWQgKip2cm9vdHAsCi0JCSAgICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTZWFyY2hlcyBhbiBlbGVtZW50IGluIHRoZSB0cmVlICpWUk9PVFAgdGhhdCBjb21wYXJlcyBlcXVhbCB0byBLRVkuCi0gICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBOVUxMIGlzIHJldHVybmVkLiAgKi8KLWV4dGVybiB2b2lkICogdGZpbmQgKGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqY29uc3QgKnZyb290cCwKLQkJICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTZWFyY2hlcyBhbiBlbGVtZW50IGluIHRoZSB0cmVlICpWUk9PVFAgdGhhdCBjb21wYXJlcyBlcXVhbCB0byBLRVkuCi0gICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSwgYW5kIGl0cyBwYXJlbnQgbm9kZSBpcwotICAgcmV0dXJuZWQuICBPdGhlcndpc2UsIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotZXh0ZXJuIHZvaWQgKiB0ZGVsZXRlIChjb25zdCB2b2lkICprZXksIHZvaWQgKip2cm9vdHAsCi0JCSAgICAgICBpbnQgKCpjb21wYXIpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBQZXJmb3JtIGEgZGVwdGgtZmlyc3QsIGxlZnQtdG8tcmlnaHQgdHJhdmVyc2FsIG9mIHRoZSB0cmVlIFZST09ULgotICAgVGhlIEFDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQ6Ci0gICAgIC0gZm9yIG5vbi1sZWFmIG5vZGVzOiAzIHRpbWVzLCBiZWZvcmUgdGhlIGxlZnQgc3VidHJlZSB0cmF2ZXJzYWwsCi0gICAgICAgYWZ0ZXIgdGhlIGxlZnQgc3VidHJlZSB0cmF2ZXJzYWwgYnV0IGJlZm9yZSB0aGUgcmlnaHQgc3VidHJlZSB0cmF2ZXJzYWwsCi0gICAgICAgYW5kIGFmdGVyIHRoZSByaWdodCBzdWJ0cmVlIHRyYXZlcnNhbCwKLSAgICAgLSBmb3IgbGVhZiBub2Rlczogb25jZS4KLSAgIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIEFDVElPTiBhcmU6Ci0gICAgIDEuIHRoZSBub2RlOyBpdCBjYW4gYmUgY2FzdGVkIHRvIGEgJ2NvbnN0IHZvaWQgKiBjb25zdCAqJywgaS5lLiBpbnRvIGEKLSAgICAgICAgcG9pbnRlciB0byB0aGUga2V5LAotICAgICAyLiBhbiBpbmRpY2F0b3Igd2hpY2ggdmlzaXQgb2YgdGhlIG5vZGUgdGhpcyBpcywKLSAgICAgMy4gdGhlIGxldmVsIG9mIHRoZSBub2RlIGluIHRoZSB0cmVlICgwIGZvciB0aGUgcm9vdCkuICAqLwotZXh0ZXJuIHZvaWQgdHdhbGsgKGNvbnN0IHZvaWQgKnZyb290LAotCQkgICB2b2lkICgqYWN0aW9uKSAoY29uc3Qgdm9pZCAqLCBWSVNJVCwgaW50KSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCi0jZW5kaWYgLyogX1RTRUFSQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW50bC92YXNucHJpbnRmLmMgYi9pbnRsL3Zhc25wcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4ZTdmMC4uMDAwMDAwMAotLS0gYS9pbnRsL3Zhc25wcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NzcgKzAsMCBAQAotLyogdnNwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIGJlIHBhcmFtZXRyaXplZCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgotICAgICBWQVNOUFJJTlRGICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQuCi0gICAgIEZDSEFSX1QgICAgICAgICAgICBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBmb3JtYXQgc3RyaW5nLgotICAgICBEQ0hBUl9UICAgICAgICAgICAgVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgZGVzdGluYXRpb24gKHJlc3VsdCkgc3RyaW5nLgotICAgICBGQ0hBUl9UX09OTFlfQVNDSUkgU2V0IHRvIDEgdG8gZW5hYmxlIHZlcmlmaWNhdGlvbiB0aGF0IGFsbCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IHN0cmluZyBhcmUgQVNDSUkuIE1VU1QgYmUgc2V0IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBGQ0hBUl9UIGFuZCBEQ0hBUl9UIGFyZSBub3QgdGhlIHNhbWUgdHlwZS4KLSAgICAgRElSRUNUSVZFICAgICAgICAgIFN0cnVjdHVyZSBkZW5vdGluZyBhIGZvcm1hdCBkaXJlY3RpdmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRzIG9uIEZDSEFSX1QuCi0gICAgIERJUkVDVElWRVMgICAgICAgICBTdHJ1Y3R1cmUgZGVub3RpbmcgdGhlIHNldCBvZiBmb3JtYXQgZGlyZWN0aXZlcyBvZiBhCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3RyaW5nLiAgRGVwZW5kcyBvbiBGQ0hBUl9ULgotICAgICBQUklOVEZfUEFSU0UgICAgICAgRnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBmb3JtYXQgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kcyBvbiBGQ0hBUl9ULgotICAgICBEQ0hBUl9DUFkgICAgICAgICAgbWVtY3B5IGxpa2UgZnVuY3Rpb24gZm9yIERDSEFSX1RbXSBhcnJheXMuCi0gICAgIERDSEFSX1NFVCAgICAgICAgICBtZW1zZXQgbGlrZSBmdW5jdGlvbiBmb3IgRENIQVJfVFtdIGFycmF5cy4KLSAgICAgRENIQVJfTUJTTkxFTiAgICAgIG1ic25sZW4gbGlrZSBmdW5jdGlvbiBmb3IgRENIQVJfVFtdIGFycmF5cy4KLSAgICAgU05QUklOVEYgICAgICAgICAgIFRoZSBzeXN0ZW0ncyBzbnByaW50ZiAob3Igc2ltaWxhcikgZnVuY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1heSBiZSBlaXRoZXIgc25wcmludGYgb3Igc3dwcmludGYuCi0gICAgIFRDSEFSX1QgICAgICAgICAgICBUaGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcmd1bWVudCBhbmQgcmVzdWx0IHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNhaWQgU05QUklOVEYgZnVuY3Rpb24uICBUaGlzIG1heSBiZSBlaXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgb3Igd2NoYXJfdC4gIFRoZSBjb2RlIGV4cGxvaXRzIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoVENIQVJfVCkgfCBzaXplb2YgKERDSEFSX1QpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25vZiAoVENIQVJfVCkgPD0gYWxpZ25vZiAoRENIQVJfVCkuCi0gICAgIERDSEFSX0lTX1RDSEFSICAgICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGFuZCBUQ0hBUl9UIGFyZSB0aGUgc2FtZSB0eXBlLgotICAgICBEQ0hBUl9DT05WX0ZST01fRU5DT0RJTkcgQSBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gY2hhcltdIHRvIERDSEFSW10uCi0gICAgIERDSEFSX0lTX1VJTlQ4X1QgICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGlzIHVpbnQ4X3QuCi0gICAgIERDSEFSX0lTX1VJTlQxNl9UICBTZXQgdG8gMSBpZiBEQ0hBUl9UIGlzIHVpbnQxNl90LgotICAgICBEQ0hBUl9JU19VSU5UMzJfVCAgU2V0IHRvIDEgaWYgRENIQVJfVCBpcyB1aW50MzJfdC4gICovCi0KLS8qIFRlbGwgZ2xpYmMncyA8c3RkaW8uaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc25wcmludGYoKS4KLSAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQotICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgVkFTTlBSSU5URgotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotI2lmbmRlZiBJTl9MSUJJTlRMCi0jIGluY2x1ZGUgPGFsbG9jYS5oPgotI2VuZGlmCi0KLS8qIFNwZWNpZmljYXRpb24uICAqLwotI2lmbmRlZiBWQVNOUFJJTlRGCi0jIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0jICBpbmNsdWRlICJ2YXNud3ByaW50Zi5oIgotIyBlbHNlCi0jICBpbmNsdWRlICJ2YXNucHJpbnRmLmgiCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGxvY2FsZS5oPgkvKiBsb2NhbGVjb252KCkgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgkvKiBzbnByaW50ZigpLCBzcHJpbnRmKCkgKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4JLyogYWJvcnQoKSwgbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpICovCi0jaW5jbHVkZSA8c3RyaW5nLmg+CS8qIG1lbWNweSgpLCBzdHJsZW4oKSAqLwotI2luY2x1ZGUgPGVycm5vLmg+CS8qIGVycm5vICovCi0jaW5jbHVkZSA8bGltaXRzLmg+CS8qIENIQVJfQklUICovCi0jaW5jbHVkZSA8ZmxvYXQuaD4JLyogREJMX01BWF9FWFAsIExEQkxfTUFYX0VYUCAqLwotI2lmIEhBVkVfTkxfTEFOR0lORk8KLSMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KLSNlbmRpZgotI2lmbmRlZiBWQVNOUFJJTlRGCi0jIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0jICBpbmNsdWRlICJ3cHJpbnRmLXBhcnNlLmgiCi0jIGVsc2UKLSMgIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCi0jaW5jbHVkZSAieHNpemUuaCIKLQotI2lmIChORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLSMgaW5jbHVkZSA8bWF0aC5oPgotIyBpbmNsdWRlICJmbG9hdCsuaCIKLSNlbmRpZgotCi0jaWYgKE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLSMgaW5jbHVkZSA8bWF0aC5oPgotIyBpbmNsdWRlICJpc25hbi5oIgotI2VuZGlmCi0KLSNpZiAoTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfTE9OR19ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLSMgaW5jbHVkZSA8bWF0aC5oPgotIyBpbmNsdWRlICJpc25hbmwtbm9saWJtLmgiCi0jIGluY2x1ZGUgImZwdWN3LmgiCi0jZW5kaWYKLQotI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9ET1VCTEUpICYmICFkZWZpbmVkIElOX0xJQklOVEwKLSMgaW5jbHVkZSA8bWF0aC5oPgotIyBpbmNsdWRlICJpc25hbi5oIgotIyBpbmNsdWRlICJwcmludGYtZnJleHAuaCIKLSNlbmRpZgotCi0jaWYgKE5FRURfUFJJTlRGX0RJUkVDVElWRV9BIHx8IE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0jIGluY2x1ZGUgPG1hdGguaD4KLSMgaW5jbHVkZSAiaXNuYW5sLW5vbGlibS5oIgotIyBpbmNsdWRlICJwcmludGYtZnJleHBsLmgiCi0jIGluY2x1ZGUgImZwdWN3LmgiCi0jZW5kaWYKLQotLyogU29tZSBzeXN0ZW1zLCBsaWtlIE9TRi8xIDQuMCBhbmQgV29lMzIsIGRvbid0IGhhdmUgRU9WRVJGTE9XLiAgKi8KLSNpZm5kZWYgRU9WRVJGTE9XCi0jIGRlZmluZSBFT1ZFUkZMT1cgRTJCSUcKLSNlbmRpZgotCi0jaWYgSEFWRV9XQ0hBUl9UCi0jIGlmIEhBVkVfV0NTTEVOCi0jICBkZWZpbmUgbG9jYWxfd2NzbGVuIHdjc2xlbgotIyBlbHNlCi0gICAvKiBTb2xhcmlzIDIuNS4xIGhhcyB3Y3NsZW4oKSBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgbGlidy5zby4gVG8gYXZvaWQKLSAgICAgIGEgZGVwZW5kZW5jeSB0b3dhcmRzIHRoaXMgbGlicmFyeSwgaGVyZSBpcyBhIGxvY2FsIHN1YnN0aXR1dGUuCi0gICAgICBEZWZpbmUgdGhpcyBzdWJzdGl0dXRlIG9ubHkgb25jZSwgZXZlbiBpZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKLSAgICAgIHR3aWNlIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotIyAgaWZuZGVmIGxvY2FsX3djc2xlbl9kZWZpbmVkCi0jICAgZGVmaW5lIGxvY2FsX3djc2xlbl9kZWZpbmVkIDEKLXN0YXRpYyBzaXplX3QKLWxvY2FsX3djc2xlbiAoY29uc3Qgd2NoYXJfdCAqcykKLXsKLSAgY29uc3Qgd2NoYXJfdCAqcHRyOwotCi0gIGZvciAocHRyID0gczsgKnB0ciAhPSAod2NoYXJfdCkgMDsgcHRyKyspCi0gICAgOwotICByZXR1cm4gcHRyIC0gczsKLX0KLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogRGVmYXVsdCBwYXJhbWV0ZXJzLiAgKi8KLSNpZm5kZWYgVkFTTlBSSU5URgotIyBpZiBXSURFX0NIQVJfVkVSU0lPTgotIyAgZGVmaW5lIFZBU05QUklOVEYgdmFzbndwcmludGYKLSMgIGRlZmluZSBGQ0hBUl9UIHdjaGFyX3QKLSMgIGRlZmluZSBEQ0hBUl9UIHdjaGFyX3QKLSMgIGRlZmluZSBUQ0hBUl9UIHdjaGFyX3QKLSMgIGRlZmluZSBEQ0hBUl9JU19UQ0hBUiAxCi0jICBkZWZpbmUgRElSRUNUSVZFIHdjaGFyX3RfZGlyZWN0aXZlCi0jICBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKLSMgIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQotIyAgZGVmaW5lIERDSEFSX0NQWSB3bWVtY3B5Ci0jIGVsc2UKLSMgIGRlZmluZSBWQVNOUFJJTlRGIHZhc25wcmludGYKLSMgIGRlZmluZSBGQ0hBUl9UIGNoYXIKLSMgIGRlZmluZSBEQ0hBUl9UIGNoYXIKLSMgIGRlZmluZSBUQ0hBUl9UIGNoYXIKLSMgIGRlZmluZSBEQ0hBUl9JU19UQ0hBUiAxCi0jICBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCi0jICBkZWZpbmUgRElSRUNUSVZFUyBjaGFyX2RpcmVjdGl2ZXMKLSMgIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCi0jICBkZWZpbmUgRENIQVJfQ1BZIG1lbWNweQotIyBlbmRpZgotI2VuZGlmCi0jaWYgV0lERV9DSEFSX1ZFUlNJT04KLSAgLyogVENIQVJfVCBpcyB3Y2hhcl90LiAgKi8KLSMgZGVmaW5lIFVTRV9TTlBSSU5URiAxCi0jIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCi0gICAvKiBPbiBXaW5kb3dzLCB0aGUgZnVuY3Rpb24gc3dwcmludGYoKSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlIHRoYW4KLSAgICAgIG9uIFVuaXg7IHdlIHVzZSB0aGUgX3Nud3ByaW50ZigpIGZ1bmN0aW9uIGluc3RlYWQuICAqLwotIyAgZGVmaW5lIFNOUFJJTlRGIF9zbndwcmludGYKLSMgZWxzZQotICAgLyogVW5peC4gICovCi0jICBkZWZpbmUgU05QUklOVEYgc3dwcmludGYKLSMgZW5kaWYKLSNlbHNlCi0gIC8qIFRDSEFSX1QgaXMgY2hhci4gICovCi0jIC8qIFVzZSBzbnByaW50ZiBpZiBpdCBleGlzdHMgdW5kZXIgdGhlIG5hbWUgJ3NucHJpbnRmJyBvciAnX3NucHJpbnRmJy4KLSAgICAgQnV0IGRvbid0IHVzZSBpdCBvbiBCZU9TLCBzaW5jZSBCZU9TIHNucHJpbnRmIHByb2R1Y2VzIG5vIG91dHB1dCBpZiB0aGUKLSAgICAgc2l6ZSBhcmd1bWVudCBpcyA+PSAweDMwMDAwMDAuICAqLwotIyBpZiAoSEFWRV9ERUNMX19TTlBSSU5URiB8fCBIQVZFX1NOUFJJTlRGKSAmJiAhZGVmaW5lZCBfX0JFT1NfXwotIyAgZGVmaW5lIFVTRV9TTlBSSU5URiAxCi0jIGVsc2UKLSMgIGRlZmluZSBVU0VfU05QUklOVEYgMAotIyBlbmRpZgotIyBpZiBIQVZFX0RFQ0xfX1NOUFJJTlRGCi0gICAvKiBXaW5kb3dzLiAgKi8KLSMgIGRlZmluZSBTTlBSSU5URiBfc25wcmludGYKLSMgZWxzZQotICAgLyogVW5peC4gICovCi0jICBkZWZpbmUgU05QUklOVEYgc25wcmludGYKLSAgIC8qIEhlcmUgd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc25wcmludGYsIG5vdCBycGxfc25wcmludGYuICAqLwotIyAgdW5kZWYgc25wcmludGYKLSMgZW5kaWYKLSNlbmRpZgotLyogSGVyZSB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5hdGl2ZSBzcHJpbnRmLCBub3QgcnBsX3NwcmludGYuICAqLwotI3VuZGVmIHNwcmludGYKLQotI2lmIChORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0vKiBEZXRlcm1pbmUgdGhlIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBsb2NhbGUuICAqLwotIyBpZm5kZWYgZGVjaW1hbF9wb2ludF9jaGFyX2RlZmluZWQKLSMgIGRlZmluZSBkZWNpbWFsX3BvaW50X2NoYXJfZGVmaW5lZCAxCi1zdGF0aWMgY2hhcgotZGVjaW1hbF9wb2ludF9jaGFyICgpCi17Ci0gIGNvbnN0IGNoYXIgKnBvaW50OwotICAvKiBEZXRlcm1pbmUgaXQgaW4gYSBtdWx0aXRocmVhZC1zYWZlIHdheS4gIFdlIGtub3cgbmxfbGFuZ2luZm8gaXMKLSAgICAgbXVsdGl0aHJlYWQtc2FmZSBvbiBnbGliYyBzeXN0ZW1zLCBidXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIG11bHRpdGhyZWFkLQotICAgICBzYWZlIGJ5IFBPU0lYLiAgc3ByaW50ZigpLCBob3dldmVyLCBpcyBtdWx0aXRocmVhZC1zYWZlLiAgbG9jYWxlY29udigpCi0gICAgIGlzIHJhcmVseSBtdWx0aXRocmVhZC1zYWZlLiAgKi8KLSMgIGlmIEhBVkVfTkxfTEFOR0lORk8gJiYgX19HTElCQ19fCi0gIHBvaW50ID0gbmxfbGFuZ2luZm8gKFJBRElYQ0hBUik7Ci0jICBlbGlmIDEKLSAgY2hhciBwb2ludGJ1Zls1XTsKLSAgc3ByaW50ZiAocG9pbnRidWYsICIlIy4wZiIsIDEuMCk7Ci0gIHBvaW50ID0gJnBvaW50YnVmWzFdOwotIyAgZWxzZQotICBwb2ludCA9IGxvY2FsZWNvbnYgKCkgLT4gZGVjaW1hbF9wb2ludDsKLSMgIGVuZGlmCi0gIC8qIFRoZSBkZWNpbWFsIHBvaW50IGlzIGFsd2F5cyBhIHNpbmdsZSBieXRlOiBlaXRoZXIgJy4nIG9yICcsJy4gICovCi0gIHJldHVybiAocG9pbnRbMF0gIT0gJ1wwJyA/IHBvaW50WzBdIDogJy4nKTsKLX0KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFICYmICFORUVEX1BSSU5URl9ET1VCTEUgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotCi0vKiBFcXVpdmFsZW50IHRvICFpc2Zpbml0ZSh4KSB8fCB4ID09IDAsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGxpYm0uICAqLwotc3RhdGljIGludAotaXNfaW5maW5pdGVfb3JfemVybyAoZG91YmxlIHgpCi17Ci0gIHJldHVybiBpc25hbiAoeCkgfHwgeCArIHggPT0geDsKLX0KLQotI2VuZGlmCi0KLSNpZiBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRSAmJiAhTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotCi0vKiBFcXVpdmFsZW50IHRvICFpc2Zpbml0ZSh4KSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgbGlibS4gICovCi1zdGF0aWMgaW50Ci1pc19pbmZpbml0ZWwgKGxvbmcgZG91YmxlIHgpCi17Ci0gIHJldHVybiBpc25hbmwgKHgpIHx8ICh4ICsgeCA9PSB4ICYmIHggIT0gMC4wTCk7Ci19Ci0KLSNlbmRpZgotCi0jaWYgKE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotCi0vKiBDb252ZXJ0aW5nICdsb25nIGRvdWJsZScgdG8gZGVjaW1hbCB3aXRob3V0IHJhcmUgcm91bmRpbmcgYnVncyByZXF1aXJlcwotICAgcmVhbCBiaWdudW1zLiAgV2UgdXNlIHRoZSBuYW1pbmcgY29udmVudGlvbnMgb2YgR05VIGdtcCwgYnV0IHZhc3RseSBzaW1wbGVyCi0gICAoYW5kIHNsb3dlcikgYWxnb3JpdGhtcy4gICovCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IG1wX2xpbWJfdDsKLSMgZGVmaW5lIEdNUF9MSU1CX0JJVFMgMzIKLXR5cGVkZWYgaW50IG1wX2xpbWJfdmVyaWZ5WzIgKiAoc2l6ZW9mIChtcF9saW1iX3QpICogQ0hBUl9CSVQgPT0gR01QX0xJTUJfQklUUykgLSAxXTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgbXBfdHdvbGltYl90OwotIyBkZWZpbmUgR01QX1RXT0xJTUJfQklUUyA2NAotdHlwZWRlZiBpbnQgbXBfdHdvbGltYl92ZXJpZnlbMiAqIChzaXplb2YgKG1wX3R3b2xpbWJfdCkgKiBDSEFSX0JJVCA9PSBHTVBfVFdPTElNQl9CSVRTKSAtIDFdOwotCi0vKiBSZXByZXNlbnRhdGlvbiBvZiBhIGJpZ251bSA+PSAwLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHNpemVfdCBubGltYnM7Ci0gIG1wX2xpbWJfdCAqbGltYnM7IC8qIEJpdHMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciwgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuICAqLwotfSBtcG5fdDsKLQotLyogQ29tcHV0ZSB0aGUgcHJvZHVjdCBvZiB0d28gYmlnbnVtcyA+PSAwLgotICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeQotICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLXN0YXRpYyB2b2lkICoKLW11bHRpcGx5IChtcG5fdCBzcmMxLCBtcG5fdCBzcmMyLCBtcG5fdCAqZGVzdCkKLXsKLSAgY29uc3QgbXBfbGltYl90ICpwMTsKLSAgY29uc3QgbXBfbGltYl90ICpwMjsKLSAgc2l6ZV90IGxlbjE7Ci0gIHNpemVfdCBsZW4yOwotCi0gIGlmIChzcmMxLm5saW1icyA8PSBzcmMyLm5saW1icykKLSAgICB7Ci0gICAgICBsZW4xID0gc3JjMS5ubGltYnM7Ci0gICAgICBwMSA9IHNyYzEubGltYnM7Ci0gICAgICBsZW4yID0gc3JjMi5ubGltYnM7Ci0gICAgICBwMiA9IHNyYzIubGltYnM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbGVuMSA9IHNyYzIubmxpbWJzOwotICAgICAgcDEgPSBzcmMyLmxpbWJzOwotICAgICAgbGVuMiA9IHNyYzEubmxpbWJzOwotICAgICAgcDIgPSBzcmMxLmxpbWJzOwotICAgIH0KLSAgLyogTm93IDAgPD0gbGVuMSA8PSBsZW4yLiAgKi8KLSAgaWYgKGxlbjEgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBzcmMxIG9yIHNyYzIgaXMgemVyby4gICovCi0gICAgICBkZXN0LT5ubGltYnMgPSAwOwotICAgICAgZGVzdC0+bGltYnMgPSAobXBfbGltYl90ICopIG1hbGxvYyAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSGVyZSAxIDw9IGxlbjEgPD0gbGVuMi4gICovCi0gICAgICBzaXplX3QgZGxlbjsKLSAgICAgIG1wX2xpbWJfdCAqZHA7Ci0gICAgICBzaXplX3QgaywgaSwgajsKLQotICAgICAgZGxlbiA9IGxlbjEgKyBsZW4yOwotICAgICAgZHAgPSAobXBfbGltYl90ICopIG1hbGxvYyAoZGxlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0gICAgICBpZiAoZHAgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZvciAoayA9IGxlbjI7IGsgPiAwOyApCi0JZHBbLS1rXSA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuMTsgaSsrKQotCXsKLQkgIG1wX2xpbWJfdCBkaWdpdDEgPSBwMVtpXTsKLQkgIG1wX3R3b2xpbWJfdCBjYXJyeSA9IDA7Ci0JICBmb3IgKGogPSAwOyBqIDwgbGVuMjsgaisrKQotCSAgICB7Ci0JICAgICAgbXBfbGltYl90IGRpZ2l0MiA9IHAyW2pdOwotCSAgICAgIGNhcnJ5ICs9IChtcF90d29saW1iX3QpIGRpZ2l0MSAqIChtcF90d29saW1iX3QpIGRpZ2l0MjsKLQkgICAgICBjYXJyeSArPSBkcFtpICsgal07Ci0JICAgICAgZHBbaSArIGpdID0gKG1wX2xpbWJfdCkgY2Fycnk7Ci0JICAgICAgY2FycnkgPSBjYXJyeSA+PiBHTVBfTElNQl9CSVRTOwotCSAgICB9Ci0JICBkcFtpICsgbGVuMl0gPSAobXBfbGltYl90KSBjYXJyeTsKLQl9Ci0gICAgICAvKiBOb3JtYWxpc2UuICAqLwotICAgICAgd2hpbGUgKGRsZW4gPiAwICYmIGRwW2RsZW4gLSAxXSA9PSAwKQotCWRsZW4tLTsKLSAgICAgIGRlc3QtPm5saW1icyA9IGRsZW47Ci0gICAgICBkZXN0LT5saW1icyA9IGRwOwotICAgIH0KLSAgcmV0dXJuIGRlc3QtPmxpbWJzOwotfQotCi0vKiBDb21wdXRlIHRoZSBxdW90aWVudCBvZiBhIGJpZ251bSBhID49IDAgYW5kIGEgYmlnbnVtIGIgPiAwLgotICAgYSBpcyB3cml0dGVuIGFzICBhID0gcSAqIGIgKyByICB3aXRoIDAgPD0gciA8IGIuICBxIGlzIHRoZSBxdW90aWVudCwgcgotICAgdGhlIHJlbWFpbmRlci4KLSAgIEZpbmFsbHksIHJvdW5kLXRvLWV2ZW4gaXMgcGVyZm9ybWVkOiBJZiByID4gYi8yIG9yIGlmIHIgPSBiLzIgYW5kIHEgaXMgb2RkLAotICAgcSBpcyBpbmNyZW1lbnRlZC4KLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkKLSAgIGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi1zdGF0aWMgdm9pZCAqCi1kaXZpZGUgKG1wbl90IGEsIG1wbl90IGIsIG1wbl90ICpxKQotewotICAvKiBBbGdvcml0aG06Ci0gICAgIEZpcnN0IG5vcm1hbGlzZSBhIGFuZCBiOiBhPVthW20tMV0sLi4uLGFbMF1dLCBiPVtiW24tMV0sLi4uLGJbMF1dCi0gICAgIHdpdGggbT49MCBhbmQgbj4wIChpbiBiYXNlIGJldGEgPSAyXkdNUF9MSU1CX0JJVFMpLgotICAgICBJZiBtPG4sIHRoZW4gcTo9MCBhbmQgcjo9YS4KLSAgICAgSWYgbT49bj0xLCBwZXJmb3JtIGEgc2luZ2xlLXByZWNpc2lvbiBkaXZpc2lvbjoKLSAgICAgICByOj0wLCBqOj1tLAotICAgICAgIHdoaWxlIGo+MCBkbwotICAgICAgICAge0hlcmUgKHFbbS0xXSpiZXRhXihtLTEpKy4uLitxW2pdKmJldGFeaikgKiBiWzBdICsgcipiZXRhXmogPQotICAgICAgICAgICAgICAgPSBhW20tMV0qYmV0YV4obS0xKSsuLi4rYVtqXSpiZXRhXmogdW5kIDA8PXI8YlswXTxiZXRhfQotICAgICAgICAgajo9ai0xLCByOj1yKmJldGErYVtqXSwgcVtqXTo9Zmxvb3Ioci9iWzBdKSwgcjo9ci1iWzBdKnFbal0uCi0gICAgICAgTm9ybWFsaXNlIFtxW20tMV0sLi4uLHFbMF1dLCB5aWVsZHMgcS4KLSAgICAgSWYgbT49bj4xLCBwZXJmb3JtIGEgbXVsdGlwbGUtcHJlY2lzaW9uIGRpdmlzaW9uOgotICAgICAgIFdlIGhhdmUgYS9iIDwgYmV0YV4obS1uKzEpLgotICAgICAgIHM6PWludERzaXplLTEtKGhpZ2h0ZXN0IGJpdCBpbiBiW24tMV0pLCAwPD1zPGludERzaXplLgotICAgICAgIFNoaWZ0IGEgYW5kIGIgbGVmdCBieSBzIGJpdHMsIGNvcHlpbmcgdGhlbS4gcjo9YS4KLSAgICAgICByPVtyW21dLC4uLixyWzBdXSwgYj1bYltuLTFdLC4uLixiWzBdXSB3aXRoIGJbbi0xXT49YmV0YS8yLgotICAgICAgIEZvciBqPW0tbiwuLi4sMDoge0hlcmUgMCA8PSByIDwgYipiZXRhXihqKzEpLn0KLSAgICAgICAgIENvbXB1dGUgcSogOgotICAgICAgICAgICBxKiA6PSBmbG9vcigocltqK25dKmJldGErcltqK24tMV0pL2Jbbi0xXSkuCi0gICAgICAgICAgIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKHEqID49IGJldGEpIHNldCBxKiA6PSBiZXRhLTEuCi0gICAgICAgICAgIENvbXB1dGUgYzIgOj0gKChyW2orbl0qYmV0YStyW2orbi0xXSkgLSBxKiAqIGJbbi0xXSkqYmV0YSArIHJbaituLTJdCi0gICAgICAgICAgIGFuZCBjMyA6PSBiW24tMl0gKiBxKi4KLSAgICAgICAgICAge1dlIGhhdmUgMCA8PSBjMiA8IDIqYmV0YV4yLCBldmVuIDAgPD0gYzIgPCBiZXRhXjIgaWYgbm8gb3ZlcmZsb3cKLSAgICAgICAgICAgIG9jY3VycmVkLiAgRnVydGhlcm1vcmUgMCA8PSBjMyA8IGJldGFeMi4KLSAgICAgICAgICAgIElmIHRoZXJlIHdhcyBvdmVyZmxvdyBhbmQKLSAgICAgICAgICAgIHJbaituXSpiZXRhK3JbaituLTFdIC0gcSogKiBiW24tMV0gPj0gYmV0YSwgaS5lLiBjMiA+PSBiZXRhXjIsCi0gICAgICAgICAgICB0aGUgbmV4dCB0ZXN0IGNhbiBiZSBza2lwcGVkLn0KLSAgICAgICAgICAgV2hpbGUgYzMgPiBjMiwge0hlcmUgMCA8PSBjMiA8IGMzIDwgYmV0YV4yfQotICAgICAgICAgICAgIFB1dCBxKiA6PSBxKiAtIDEsIGMyIDo9IGMyICsgYltuLTFdKmJldGEsIGMzIDo9IGMzIC0gYltuLTJdLgotICAgICAgICAgICBJZiBxKiA+IDA6Ci0gICAgICAgICAgICAgUHV0IHIgOj0gciAtIGIgKiBxKiAqIGJldGFeai4gSW4gZGV0YWlsOgotICAgICAgICAgICAgICAgW3JbbitqXSwuLi4scltqXV0gOj0gW3JbbitqXSwuLi4scltqXV0gLSBxKiAqIFtiW24tMV0sLi4uLGJbMF1dLgotICAgICAgICAgICAgICAgaGVuY2U6IHU6PTAsIGZvciBpOj0wIHRvIG4tMSBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA6PSB1ICsgcSogKiBiW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltqK2ldOj1yW2oraV0tKHUgbW9kIGJldGEpICgrIGJldGEsIGlmIGNhcnJ5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU6PXUgZGl2IGJldGEgKCsgMSwgaWYgY2FycnkgaW4gc3VidHJhY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgcltuK2pdOj1yW24ral0tdS4KLSAgICAgICAgICAgICAgIHtTaW5jZSBhbHdheXMgdSA9IChxKiAqIFtiW2ktMV0sLi4uLGJbMF1dIGRpdiBiZXRhXmkpICsgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcSogKyAxIDw9IGJldGEsCi0gICAgICAgICAgICAgICAgdGhlIGNhcnJ5IHUgZG9lcyBub3Qgb3ZlcmZsb3cufQotICAgICAgICAgICAgIElmIGEgbmVnYXRpdmUgY2Fycnkgb2NjdXJzLCBwdXQgcSogOj0gcSogLSAxCi0gICAgICAgICAgICAgICBhbmQgW3JbbitqXSwuLi4scltqXV0gOj0gW3JbbitqXSwuLi4scltqXV0gKyBbMCxiW24tMV0sLi4uLGJbMF1dLgotICAgICAgICAgU2V0IHFbal0gOj0gcSouCi0gICAgICAgTm9ybWFsaXNlIFtxW20tbl0sLi4scVswXV07IHRoaXMgeWllbGRzIHRoZSBxdW90aWVudCBxLgotICAgICAgIFNoaWZ0IFtyW24tMV0sLi4uLHJbMF1dIHJpZ2h0IGJ5IHMgYml0cyBhbmQgbm9ybWFsaXNlOyB0aGlzIHlpZWxkcyB0aGUKLSAgICAgICByZXN0IHIuCi0gICAgICAgVGhlIHJvb20gZm9yIHFbal0gY2FuIGJlIGFsbG9jYXRlZCBhdCB0aGUgbWVtb3J5IGxvY2F0aW9uIG9mIHJbbitqXS4KLSAgICAgRmluYWxseSwgcm91bmQtdG8tZXZlbjoKLSAgICAgICBTaGlmdCByIGxlZnQgYnkgMSBiaXQuCi0gICAgICAgSWYgciA+IGIgb3IgaWYgciA9IGIgYW5kIHFbMF0gaXMgb2RkLCBxIDo9IHErMS4KLSAgICovCi0gIGNvbnN0IG1wX2xpbWJfdCAqYV9wdHIgPSBhLmxpbWJzOwotICBzaXplX3QgYV9sZW4gPSBhLm5saW1iczsKLSAgY29uc3QgbXBfbGltYl90ICpiX3B0ciA9IGIubGltYnM7Ci0gIHNpemVfdCBiX2xlbiA9IGIubmxpbWJzOwotICBtcF9saW1iX3QgKnJvb21wdHI7Ci0gIG1wX2xpbWJfdCAqdG1wX3Jvb21wdHIgPSBOVUxMOwotICBtcF9saW1iX3QgKnFfcHRyOwotICBzaXplX3QgcV9sZW47Ci0gIG1wX2xpbWJfdCAqcl9wdHI7Ci0gIHNpemVfdCByX2xlbjsKLQotICAvKiBBbGxvY2F0ZSByb29tIGZvciBhX2xlbisyIGRpZ2l0cy4KLSAgICAgKE5lZWQgYV9sZW4rMSBkaWdpdHMgZm9yIHRoZSByZWFsIGRpdmlzaW9uIGFuZCAxIG1vcmUgZGlnaXQgZm9yIHRoZQotICAgICBmaW5hbCByb3VuZGluZyBvZiBxLikgICovCi0gIHJvb21wdHIgPSAobXBfbGltYl90ICopIG1hbGxvYyAoKGFfbGVuICsgMikgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotICBpZiAocm9vbXB0ciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE5vcm1hbGlzZSBhLiAgKi8KLSAgd2hpbGUgKGFfbGVuID4gMCAmJiBhX3B0clthX2xlbiAtIDFdID09IDApCi0gICAgYV9sZW4tLTsKLQotICAvKiBOb3JtYWxpc2UgYi4gICovCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaWYgKGJfbGVuID09IDApCi0JLyogRGl2aXNpb24gYnkgemVyby4gICovCi0JYWJvcnQgKCk7Ci0gICAgICBpZiAoYl9wdHJbYl9sZW4gLSAxXSA9PSAwKQotCWJfbGVuLS07Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIC8qIEhlcmUgbSA9IGFfbGVuID49IDAgYW5kIG4gPSBiX2xlbiA+IDAuICAqLwotCi0gIGlmIChhX2xlbiA8IGJfbGVuKQotICAgIHsKLSAgICAgIC8qIG08bjogdHJpdmlhbCBjYXNlLiAgcT0wLCByIDo9IGNvcHkgb2YgYS4gICovCi0gICAgICByX3B0ciA9IHJvb21wdHI7Ci0gICAgICByX2xlbiA9IGFfbGVuOwotICAgICAgbWVtY3B5IChyX3B0ciwgYV9wdHIsIGFfbGVuICogc2l6ZW9mIChtcF9saW1iX3QpKTsKLSAgICAgIHFfcHRyID0gcm9vbXB0ciArIGFfbGVuOwotICAgICAgcV9sZW4gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoYl9sZW4gPT0gMSkKLSAgICB7Ci0gICAgICAvKiBuPTE6IHNpbmdsZSBwcmVjaXNpb24gZGl2aXNpb24uCi0JIGJldGFeKG0tMSkgPD0gYSA8IGJldGFebSAgPT0+ICBiZXRhXihtLTIpIDw9IGEvYiA8IGJldGFebSAgKi8KLSAgICAgIHJfcHRyID0gcm9vbXB0cjsKLSAgICAgIHFfcHRyID0gcm9vbXB0ciArIDE7Ci0gICAgICB7Ci0JbXBfbGltYl90IGRlbiA9IGJfcHRyWzBdOwotCW1wX2xpbWJfdCByZW1haW5kZXIgPSAwOwotCWNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYV9wdHIgKyBhX2xlbjsKLQltcF9saW1iX3QgKmRlc3RwdHIgPSBxX3B0ciArIGFfbGVuOwotCXNpemVfdCBjb3VudDsKLQlmb3IgKGNvdW50ID0gYV9sZW47IGNvdW50ID4gMDsgY291bnQtLSkKLQkgIHsKLQkgICAgbXBfdHdvbGltYl90IG51bSA9Ci0JICAgICAgKChtcF90d29saW1iX3QpIHJlbWFpbmRlciA8PCBHTVBfTElNQl9CSVRTKSB8ICotLXNvdXJjZXB0cjsKLQkgICAgKi0tZGVzdHB0ciA9IG51bSAvIGRlbjsKLQkgICAgcmVtYWluZGVyID0gbnVtICUgZGVuOwotCSAgfQotCS8qIE5vcm1hbGlzZSBhbmQgc3RvcmUgci4gICovCi0JaWYgKHJlbWFpbmRlciA+IDApCi0JICB7Ci0JICAgIHJfcHRyWzBdID0gcmVtYWluZGVyOwotCSAgICByX2xlbiA9IDE7Ci0JICB9Ci0JZWxzZQotCSAgcl9sZW4gPSAwOwotCS8qIE5vcm1hbGlzZSBxLiAgKi8KLQlxX2xlbiA9IGFfbGVuOwotCWlmIChxX3B0cltxX2xlbiAtIDFdID09IDApCi0JICBxX2xlbi0tOwotICAgICAgfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIG4+MTogbXVsdGlwbGUgcHJlY2lzaW9uIGRpdmlzaW9uLgotCSBiZXRhXihtLTEpIDw9IGEgPCBiZXRhXm0sIGJldGFeKG4tMSkgPD0gYiA8IGJldGFebiAgPT0+Ci0JIGJldGFeKG0tbi0xKSA8PSBhL2IgPCBiZXRhXihtLW4rMSkuICAqLwotICAgICAgLyogRGV0ZXJtaW5lIHMuICAqLwotICAgICAgc2l6ZV90IHM7Ci0gICAgICB7Ci0JbXBfbGltYl90IG1zZCA9IGJfcHRyW2JfbGVuIC0gMV07IC8qID0gYltuLTFdLCA+IDAgKi8KLQlzID0gMzE7Ci0JaWYgKG1zZCA+PSAweDEwMDAwKQotCSAgewotCSAgICBtc2QgPSBtc2QgPj4gMTY7Ci0JICAgIHMgLT0gMTY7Ci0JICB9Ci0JaWYgKG1zZCA+PSAweDEwMCkKLQkgIHsKLQkgICAgbXNkID0gbXNkID4+IDg7Ci0JICAgIHMgLT0gODsKLQkgIH0KLQlpZiAobXNkID49IDB4MTApCi0JICB7Ci0JICAgIG1zZCA9IG1zZCA+PiA0OwotCSAgICBzIC09IDQ7Ci0JICB9Ci0JaWYgKG1zZCA+PSAweDQpCi0JICB7Ci0JICAgIG1zZCA9IG1zZCA+PiAyOwotCSAgICBzIC09IDI7Ci0JICB9Ci0JaWYgKG1zZCA+PSAweDIpCi0JICB7Ci0JICAgIG1zZCA9IG1zZCA+PiAxOwotCSAgICBzIC09IDE7Ci0JICB9Ci0gICAgICB9Ci0gICAgICAvKiAwIDw9IHMgPCBHTVBfTElNQl9CSVRTLgotCSBDb3B5IGIsIHNoaWZ0aW5nIGl0IGxlZnQgYnkgcyBiaXRzLiAgKi8KLSAgICAgIGlmIChzID4gMCkKLQl7Ci0JICB0bXBfcm9vbXB0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jIChiX2xlbiAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0JICBpZiAodG1wX3Jvb21wdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHJvb21wdHIpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICB7Ci0JICAgIGNvbnN0IG1wX2xpbWJfdCAqc291cmNlcHRyID0gYl9wdHI7Ci0JICAgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IHRtcF9yb29tcHRyOwotCSAgICBtcF90d29saW1iX3QgYWNjdSA9IDA7Ci0JICAgIHNpemVfdCBjb3VudDsKLQkgICAgZm9yIChjb3VudCA9IGJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JICAgICAgewotCQlhY2N1ICs9IChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKyA8PCBzOwotCQkqZGVzdHB0cisrID0gKG1wX2xpbWJfdCkgYWNjdTsKLQkJYWNjdSA9IGFjY3UgPj4gR01QX0xJTUJfQklUUzsKLQkgICAgICB9Ci0JICAgIC8qIGFjY3UgbXVzdCBiZSB6ZXJvLCBzaW5jZSB0aGF0IHdhcyBob3cgcyB3YXMgZGV0ZXJtaW5lZC4gICovCi0JICAgIGlmIChhY2N1ICE9IDApCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JICBiX3B0ciA9IHRtcF9yb29tcHRyOwotCX0KLSAgICAgIC8qIENvcHkgYSwgc2hpZnRpbmcgaXQgbGVmdCBieSBzIGJpdHMsIHlpZWxkcyByLgotCSBNZW1vcnkgbGF5b3V0OgotCSBBdCB0aGUgYmVnaW5uaW5nOiByID0gcm9vbXB0clswLi5hX2xlbl0sCi0JIGF0IHRoZSBlbmQ6IHIgPSByb29tcHRyWzAuLmJfbGVuLTFdLCBxID0gcm9vbXB0cltiX2xlbi4uYV9sZW5dICAqLwotICAgICAgcl9wdHIgPSByb29tcHRyOwotICAgICAgaWYgKHMgPT0gMCkKLQl7Ci0JICBtZW1jcHkgKHJfcHRyLCBhX3B0ciwgYV9sZW4gKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotCSAgcl9wdHJbYV9sZW5dID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBhX3B0cjsKLQkgIG1wX2xpbWJfdCAqZGVzdHB0ciA9IHJfcHRyOwotCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotCSAgc2l6ZV90IGNvdW50OwotCSAgZm9yIChjb3VudCA9IGFfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JICAgIHsKLQkgICAgICBhY2N1ICs9IChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKyA8PCBzOwotCSAgICAgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotCSAgICAgIGFjY3UgPSBhY2N1ID4+IEdNUF9MSU1CX0JJVFM7Ci0JICAgIH0KLQkgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotCX0KLSAgICAgIHFfcHRyID0gcm9vbXB0ciArIGJfbGVuOwotICAgICAgcV9sZW4gPSBhX2xlbiAtIGJfbGVuICsgMTsgLyogcSB3aWxsIGhhdmUgbS1uKzEgbGltYnMgKi8KLSAgICAgIHsKLQlzaXplX3QgaiA9IGFfbGVuIC0gYl9sZW47IC8qIG0tbiAqLwotCW1wX2xpbWJfdCBiX21zZCA9IGJfcHRyW2JfbGVuIC0gMV07IC8qIGJbbi0xXSAqLwotCW1wX2xpbWJfdCBiXzJtc2QgPSBiX3B0cltiX2xlbiAtIDJdOyAvKiBiW24tMl0gKi8KLQltcF90d29saW1iX3QgYl9tc2RkID0gLyogYltuLTFdKmJldGErYltuLTJdICovCi0JICAoKG1wX3R3b2xpbWJfdCkgYl9tc2QgPDwgR01QX0xJTUJfQklUUykgfCBiXzJtc2Q7Ci0JLyogRGl2aXNpb24gbG9vcCwgdHJhdmVyc2VkIG0tbisxIHRpbWVzLgotCSAgIGogY291bnRzIGRvd24sIGIgaXMgdW5jaGFuZ2VkLCBiZXRhLzIgPD0gYltuLTFdIDwgYmV0YS4gICovCi0JZm9yICg7OykKLQkgIHsKLQkgICAgbXBfbGltYl90IHFfc3RhcjsKLQkgICAgbXBfbGltYl90IGMxOwotCSAgICBpZiAocl9wdHJbaiArIGJfbGVuXSA8IGJfbXNkKSAvKiByW2orbl0gPCBiW24tMV0gPyAqLwotCSAgICAgIHsKLQkJLyogRGl2aWRlIHJbaituXSpiZXRhK3JbaituLTFdIGJ5IGJbbi0xXSwgbm8gb3ZlcmZsb3cuICAqLwotCQltcF90d29saW1iX3QgbnVtID0KLQkJICAoKG1wX3R3b2xpbWJfdCkgcl9wdHJbaiArIGJfbGVuXSA8PCBHTVBfTElNQl9CSVRTKQotCQkgIHwgcl9wdHJbaiArIGJfbGVuIC0gMV07Ci0JCXFfc3RhciA9IG51bSAvIGJfbXNkOwotCQljMSA9IG51bSAlIGJfbXNkOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogT3ZlcmZsb3csIGhlbmNlIHJbaituXSpiZXRhK3JbaituLTFdID49IGJldGEqYltuLTFdLiAgKi8KLQkJcV9zdGFyID0gKG1wX2xpbWJfdCl+KG1wX2xpbWJfdCkwOyAvKiBxKiA9IGJldGEtMSAqLwotCQkvKiBUZXN0IHdoZXRoZXIgcltqK25dKmJldGErcltqK24tMV0gLSAoYmV0YS0xKSpiW24tMV0gPj0gYmV0YQotCQkgICA8PT0+IHJbaituXSpiZXRhK3JbaituLTFdICsgYltuLTFdID49IGJldGEqYltuLTFdK2JldGEKLQkJICAgPD09PiBiW24tMV0gPCBmbG9vcigocltqK25dKmJldGErcltqK24tMV0rYltuLTFdKS9iZXRhKQotCQkgICAgICAgIHs8PSBiZXRhICF9LgotCQkgICBJZiB5ZXMsIGp1bXAgZGlyZWN0bHkgdG8gdGhlIHN1YnRyYWN0aW9uIGxvb3AuCi0JCSAgIChPdGhlcndpc2UsIHJbaituXSpiZXRhK3JbaituLTFdIC0gKGJldGEtMSkqYltuLTFdIDwgYmV0YQotCQkgICAgPD09PiBmbG9vcigocltqK25dKmJldGErcltqK24tMV0rYltuLTFdKS9iZXRhKSA9IGJbbi0xXSApICovCi0JCWlmIChyX3B0cltqICsgYl9sZW5dID4gYl9tc2QKLQkJICAgIHx8IChjMSA9IHJfcHRyW2ogKyBiX2xlbiAtIDFdICsgYl9tc2QpIDwgYl9tc2QpCi0JCSAgLyogcltqK25dID49IGJbbi0xXSsxIG9yCi0JCSAgICAgcltqK25dID0gYltuLTFdIGFuZCB0aGUgYWRkaXRpb24gcltqK24tMV0rYltuLTFdIGdpdmVzIGEKLQkJICAgICBjYXJyeS4gICovCi0JCSAgZ290byBzdWJ0cmFjdDsKLQkgICAgICB9Ci0JICAgIC8qIHFfc3RhciA9IHEqLAotCSAgICAgICBjMSA9IChyW2orbl0qYmV0YStyW2orbi0xXSkgLSBxKiAqIGJbbi0xXSAoPj0wLCA8YmV0YSkuICAqLwotCSAgICB7Ci0JICAgICAgbXBfdHdvbGltYl90IGMyID0gLyogYzEqYmV0YStyW2orbi0yXSAqLwotCQkoKG1wX3R3b2xpbWJfdCkgYzEgPDwgR01QX0xJTUJfQklUUykgfCByX3B0cltqICsgYl9sZW4gLSAyXTsKLQkgICAgICBtcF90d29saW1iX3QgYzMgPSAvKiBiW24tMl0gKiBxKiAqLwotCQkobXBfdHdvbGltYl90KSBiXzJtc2QgKiAobXBfdHdvbGltYl90KSBxX3N0YXI7Ci0JICAgICAgLyogV2hpbGUgYzIgPCBjMywgaW5jcmVhc2UgYzIgYW5kIGRlY3JlYXNlIGMzLgotCQkgQ29uc2lkZXIgYzMtYzIuICBXaGlsZSBpdCBpcyA+IDAsIGRlY3JlYXNlIGl0IGJ5Ci0JCSBiW24tMV0qYmV0YStiW24tMl0uICBCZWNhdXNlIG9mIGJbbi0xXSpiZXRhK2Jbbi0yXSA+PSBiZXRhXjIvMgotCQkgdGhpcyBjYW4gaGFwcGVuIG9ubHkgdHdpY2UuICAqLwotCSAgICAgIGlmIChjMyA+IGMyKQotCQl7Ci0JCSAgcV9zdGFyID0gcV9zdGFyIC0gMTsgLyogcSogOj0gcSogLSAxICovCi0JCSAgaWYgKGMzIC0gYzIgPiBiX21zZGQpCi0JCSAgICBxX3N0YXIgPSBxX3N0YXIgLSAxOyAvKiBxKiA6PSBxKiAtIDEgKi8KLQkJfQotCSAgICB9Ci0JICAgIGlmIChxX3N0YXIgPiAwKQotCSAgICAgIHN1YnRyYWN0OgotCSAgICAgIHsKLQkJLyogU3VidHJhY3QgciA6PSByIC0gYiAqIHEqICogYmV0YV5qLiAgKi8KLQkJbXBfbGltYl90IGNyOwotCQl7Ci0JCSAgY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBiX3B0cjsKLQkJICBtcF9saW1iX3QgKmRlc3RwdHIgPSByX3B0ciArIGo7Ci0JCSAgbXBfdHdvbGltYl90IGNhcnJ5ID0gMDsKLQkJICBzaXplX3QgY291bnQ7Ci0JCSAgZm9yIChjb3VudCA9IGJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JCSAgICB7Ci0JCSAgICAgIC8qIEhlcmUgMCA8PSBjYXJyeSA8PSBxKi4gICovCi0JCSAgICAgIGNhcnJ5ID0KLQkJCWNhcnJ5Ci0JCQkrIChtcF90d29saW1iX3QpIHFfc3RhciAqIChtcF90d29saW1iX3QpICpzb3VyY2VwdHIrKwotCQkJKyAobXBfbGltYl90KSB+KCpkZXN0cHRyKTsKLQkJICAgICAgLyogSGVyZSAwIDw9IGNhcnJ5IDw9IGJldGEqcSogKyBiZXRhLTEuICAqLwotCQkgICAgICAqZGVzdHB0cisrID0gfihtcF9saW1iX3QpIGNhcnJ5OwotCQkgICAgICBjYXJyeSA9IGNhcnJ5ID4+IEdNUF9MSU1CX0JJVFM7IC8qIDw9IHEqICovCi0JCSAgICB9Ci0JCSAgY3IgPSAobXBfbGltYl90KSBjYXJyeTsKLQkJfQotCQkvKiBTdWJ0cmFjdCBjciBmcm9tIHJfcHRyW2ogKyBiX2xlbl0sIHRoZW4gZm9yZ2V0IGFib3V0Ci0JCSAgIHJfcHRyW2ogKyBiX2xlbl0uICAqLwotCQlpZiAoY3IgPiByX3B0cltqICsgYl9sZW5dKQotCQkgIHsKLQkJICAgIC8qIFN1YnRyYWN0aW9uIGdhdmUgYSBjYXJyeS4gICovCi0JCSAgICBxX3N0YXIgPSBxX3N0YXIgLSAxOyAvKiBxKiA6PSBxKiAtIDEgKi8KLQkJICAgIC8qIEFkZCBiIGJhY2suICAqLwotCQkgICAgewotCQkgICAgICBjb25zdCBtcF9saW1iX3QgKnNvdXJjZXB0ciA9IGJfcHRyOwotCQkgICAgICBtcF9saW1iX3QgKmRlc3RwdHIgPSByX3B0ciArIGo7Ci0JCSAgICAgIG1wX2xpbWJfdCBjYXJyeSA9IDA7Ci0JCSAgICAgIHNpemVfdCBjb3VudDsKLQkJICAgICAgZm9yIChjb3VudCA9IGJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JCQl7Ci0JCQkgIG1wX2xpbWJfdCBzb3VyY2UxID0gKnNvdXJjZXB0cisrOwotCQkJICBtcF9saW1iX3Qgc291cmNlMiA9ICpkZXN0cHRyOwotCQkJICAqZGVzdHB0cisrID0gc291cmNlMSArIHNvdXJjZTIgKyBjYXJyeTsKLQkJCSAgY2FycnkgPQotCQkJICAgIChjYXJyeQotCQkJICAgICA/IHNvdXJjZTEgPj0gKG1wX2xpbWJfdCkgfnNvdXJjZTIKLQkJCSAgICAgOiBzb3VyY2UxID4gKG1wX2xpbWJfdCkgfnNvdXJjZTIpOwotCQkJfQotCQkgICAgfQotCQkgICAgLyogRm9yZ2V0IGFib3V0IHRoZSBjYXJyeSBhbmQgYWJvdXQgcltqK25dLiAgKi8KLQkJICB9Ci0JICAgICAgfQotCSAgICAvKiBxKiBpcyBkZXRlcm1pbmVkLiAgU3RvcmUgaXQgYXMgcVtqXS4gICovCi0JICAgIHFfcHRyW2pdID0gcV9zdGFyOwotCSAgICBpZiAoaiA9PSAwKQotCSAgICAgIGJyZWFrOwotCSAgICBqLS07Ci0JICB9Ci0gICAgICB9Ci0gICAgICByX2xlbiA9IGJfbGVuOwotICAgICAgLyogTm9ybWFsaXNlIHEuICAqLwotICAgICAgaWYgKHFfcHRyW3FfbGVuIC0gMV0gPT0gMCkKLQlxX2xlbi0tOwotIyBpZiAwIC8qIE5vdCBuZWVkZWQgaGVyZSwgc2luY2Ugd2UgbmVlZCByIG9ubHkgdG8gY29tcGFyZSBpdCB3aXRoIGIvMiwgYW5kCi0JICBiIGlzIHNoaWZ0ZWQgbGVmdCBieSBzIGJpdHMuICAqLwotICAgICAgLyogU2hpZnQgciByaWdodCBieSBzIGJpdHMuICAqLwotICAgICAgaWYgKHMgPiAwKQotCXsKLQkgIG1wX2xpbWJfdCBwdHIgPSByX3B0ciArIHJfbGVuOwotCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotCSAgc2l6ZV90IGNvdW50OwotCSAgZm9yIChjb3VudCA9IHJfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JICAgIHsKLQkgICAgICBhY2N1ID0gKG1wX3R3b2xpbWJfdCkgKG1wX2xpbWJfdCkgYWNjdSA8PCBHTVBfTElNQl9CSVRTOwotCSAgICAgIGFjY3UgKz0gKG1wX3R3b2xpbWJfdCkgKi0tcHRyIDw8IChHTVBfTElNQl9CSVRTIC0gcyk7Ci0JICAgICAgKnB0ciA9IChtcF9saW1iX3QpIChhY2N1ID4+IEdNUF9MSU1CX0JJVFMpOwotCSAgICB9Ci0JfQotIyBlbmRpZgotICAgICAgLyogTm9ybWFsaXNlIHIuICAqLwotICAgICAgd2hpbGUgKHJfbGVuID4gMCAmJiByX3B0cltyX2xlbiAtIDFdID09IDApCi0Jcl9sZW4tLTsKLSAgICB9Ci0gIC8qIENvbXBhcmUgciA8PCAxIHdpdGggYi4gICovCi0gIGlmIChyX2xlbiA+IGJfbGVuKQotICAgIGdvdG8gaW5jcmVtZW50X3E7Ci0gIHsKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSBiX2xlbjs7KQotICAgICAgewotCW1wX2xpbWJfdCByX2kgPQotCSAgKGkgPD0gcl9sZW4gJiYgaSA+IDAgPyByX3B0cltpIC0gMV0gPj4gKEdNUF9MSU1CX0JJVFMgLSAxKSA6IDApCi0JICB8IChpIDwgcl9sZW4gPyByX3B0cltpXSA8PCAxIDogMCk7Ci0JbXBfbGltYl90IGJfaSA9IChpIDwgYl9sZW4gPyBiX3B0cltpXSA6IDApOwotCWlmIChyX2kgPiBiX2kpCi0JICBnb3RvIGluY3JlbWVudF9xOwotCWlmIChyX2kgPCBiX2kpCi0JICBnb3RvIGtlZXBfcTsKLQlpZiAoaSA9PSAwKQotCSAgYnJlYWs7Ci0JaS0tOwotICAgICAgfQotICB9Ci0gIGlmIChxX2xlbiA+IDAgJiYgKChxX3B0clswXSAmIDEpICE9IDApKQotICAgIC8qIHEgaXMgb2RkLiAgKi8KLSAgICBpbmNyZW1lbnRfcToKLSAgICB7Ci0gICAgICBzaXplX3QgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBxX2xlbjsgaSsrKQotCWlmICgrKyhxX3B0cltpXSkgIT0gMCkKLQkgIGdvdG8ga2VlcF9xOwotICAgICAgcV9wdHJbcV9sZW4rK10gPSAxOwotICAgIH0KLSAga2VlcF9xOgotICBpZiAodG1wX3Jvb21wdHIgIT0gTlVMTCkKLSAgICBmcmVlICh0bXBfcm9vbXB0cik7Ci0gIHEtPmxpbWJzID0gcV9wdHI7Ci0gIHEtPm5saW1icyA9IHFfbGVuOwotICByZXR1cm4gcm9vbXB0cjsKLX0KLQotLyogQ29udmVydCBhIGJpZ251bSBhID49IDAsIG11bHRpcGxpZWQgd2l0aCAxMF5leHRyYV96ZXJvZXMsIHRvIGRlY2ltYWwKLSAgIHJlcHJlc2VudGF0aW9uLgotICAgRGVzdHJveXMgdGhlIGNvbnRlbnRzIG9mIGEuCi0gICBSZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgLSBjb250YWluaW5nIHRoZSBkZWNpbWFsIGRpZ2l0cyBpbiBsb3ctdG8taGlnaAotICAgb3JkZXIsIHRlcm1pbmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIgLSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIE5VTEwgaW4gY2FzZQotICAgb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gICovCi1zdGF0aWMgY2hhciAqCi1jb252ZXJ0X3RvX2RlY2ltYWwgKG1wbl90IGEsIHNpemVfdCBleHRyYV96ZXJvZXMpCi17Ci0gIG1wX2xpbWJfdCAqYV9wdHIgPSBhLmxpbWJzOwotICBzaXplX3QgYV9sZW4gPSBhLm5saW1iczsKLSAgLyogMC4wMzM0NSBpcyBzbGlnaHRseSBsYXJnZXIgdGhhbiBsb2coMikvKDkqbG9nKDEwKSkuICAqLwotICBzaXplX3QgY19sZW4gPSA5ICogKChzaXplX3QpKGFfbGVuICogKEdNUF9MSU1CX0JJVFMgKiAwLjAzMzQ1ZikpICsgMSk7Ci0gIGNoYXIgKmNfcHRyID0gKGNoYXIgKikgbWFsbG9jICh4c3VtIChjX2xlbiwgZXh0cmFfemVyb2VzKSk7Ci0gIGlmIChjX3B0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKmRfcHRyID0gY19wdHI7Ci0gICAgICBmb3IgKDsgZXh0cmFfemVyb2VzID4gMDsgZXh0cmFfemVyb2VzLS0pCi0JKmRfcHRyKysgPSAnMCc7Ci0gICAgICB3aGlsZSAoYV9sZW4gPiAwKQotCXsKLQkgIC8qIERpdmlkZSBhIGJ5IDEwXjksIGluLXBsYWNlLiAgKi8KLQkgIG1wX2xpbWJfdCByZW1haW5kZXIgPSAwOwotCSAgbXBfbGltYl90ICpwdHIgPSBhX3B0ciArIGFfbGVuOwotCSAgc2l6ZV90IGNvdW50OwotCSAgZm9yIChjb3VudCA9IGFfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JICAgIHsKLQkgICAgICBtcF90d29saW1iX3QgbnVtID0KLQkJKChtcF90d29saW1iX3QpIHJlbWFpbmRlciA8PCBHTVBfTElNQl9CSVRTKSB8ICotLXB0cjsKLQkgICAgICAqcHRyID0gbnVtIC8gMTAwMDAwMDAwMDsKLQkgICAgICByZW1haW5kZXIgPSBudW0gJSAxMDAwMDAwMDAwOwotCSAgICB9Ci0JICAvKiBTdG9yZSB0aGUgcmVtYWluZGVyIGFzIDkgZGVjaW1hbCBkaWdpdHMuICAqLwotCSAgZm9yIChjb3VudCA9IDk7IGNvdW50ID4gMDsgY291bnQtLSkKLQkgICAgewotCSAgICAgICpkX3B0cisrID0gJzAnICsgKHJlbWFpbmRlciAlIDEwKTsKLQkgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIgLyAxMDsKLQkgICAgfQotCSAgLyogTm9ybWFsaXplIGEuICAqLwotCSAgaWYgKGFfcHRyW2FfbGVuIC0gMV0gPT0gMCkKLQkgICAgYV9sZW4tLTsKLQl9Ci0gICAgICAvKiBSZW1vdmUgbGVhZGluZyB6ZXJvZXMuICAqLwotICAgICAgd2hpbGUgKGRfcHRyID4gY19wdHIgJiYgZF9wdHJbLTFdID09ICcwJykKLQlkX3B0ci0tOwotICAgICAgLyogQnV0IGtlZXAgYXQgbGVhc3Qgb25lIHplcm8uICAqLwotICAgICAgaWYgKGRfcHRyID09IGNfcHRyKQotCSpkX3B0cisrID0gJzAnOwotICAgICAgLyogVGVybWluYXRlIHRoZSBzdHJpbmcuICAqLwotICAgICAgKmRfcHRyID0gJ1wwJzsKLSAgICB9Ci0gIHJldHVybiBjX3B0cjsKLX0KLQotIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotCi0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMDoKLSAgIHdyaXRlIHggYXMgeCA9IDJeZSAqIG0sIHdoZXJlIG0gaXMgYSBiaWdudW0uCi0gICBSZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBzdWNjZXNzLCBOVUxMIGluIGNhc2Ugb2YgbWVtb3J5Ci0gICBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLwotc3RhdGljIHZvaWQgKgotZGVjb2RlX2xvbmdfZG91YmxlIChsb25nIGRvdWJsZSB4LCBpbnQgKmVwLCBtcG5fdCAqbXApCi17Ci0gIG1wbl90IG07Ci0gIGludCBleHA7Ci0gIGxvbmcgZG91YmxlIHk7Ci0gIHNpemVfdCBpOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzdWx0LiAgKi8KLSAgbS5ubGltYnMgPSAoTERCTF9NQU5UX0JJVCArIEdNUF9MSU1CX0JJVFMgLSAxKSAvIEdNUF9MSU1CX0JJVFM7Ci0gIG0ubGltYnMgPSAobXBfbGltYl90ICopIG1hbGxvYyAobS5ubGltYnMgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotICBpZiAobS5saW1icyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLSAgeSA9IGZyZXhwbCAoeCwgJmV4cCk7Ci0gIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIHggPSAyXmV4cCAqIHkgPSAyXihleHAgLSBMREJMX01BTlRfQklUKSAqICh5ICogTERCTF9NQU5UX0JJVCksIGFuZCB0aGUKLSAgICAgbGF0dGVyIGlzIGFuIGludGVnZXIuICAqLwotICAvKiBDb252ZXJ0IHRoZSBtYW50aXNzYSAoeSAqIExEQkxfTUFOVF9CSVQpIHRvIGEgc2VxdWVuY2Ugb2YgbGltYnMuCi0gICAgIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0J3Mgc2FmZSB0byBjYXN0IGEgJ2xvbmcgZG91YmxlJyB2YWx1ZSBiZXR3ZWVuCi0gICAgIDJeMzEgYW5kIDJeMzIgdG8gJ3Vuc2lnbmVkIGludCcsIHRoZXJlZm9yZSBwbGF5IHNhZmUgYW5kIGNhc3Qgb25seQotICAgICAnbG9uZyBkb3VibGUnIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDJeMTYgKHRvICd1bnNpZ25lZCBpbnQnIG9yICdpbnQnLAotICAgICBkb2Vzbid0IG1hdHRlcikuICAqLwotIyAgaWYgKExEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSAhPSAwCi0jICAgaWYgKExEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSA+IEdNUF9MSU1CX0JJVFMgLyAyCi0gICAgewotICAgICAgbXBfbGltYl90IGhpLCBsbzsKLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoTERCTF9NQU5UX0JJVCAlIChHTVBfTElNQl9CSVRTIC8gMikpOwotICAgICAgaGkgPSAoaW50KSB5OwotICAgICAgeSAtPSBoaTsKLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0JYWJvcnQgKCk7Ci0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLSAgICAgIGxvID0gKGludCkgeTsKLSAgICAgIHkgLT0gbG87Ci0gICAgICBpZiAoISh5ID49IDAuMEwgJiYgeSA8IDEuMEwpKQotCWFib3J0ICgpOwotICAgICAgbS5saW1ic1tMREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUU10gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLSAgICB9Ci0jICAgZWxzZQotICAgIHsKLSAgICAgIG1wX2xpbWJfdCBkOwotICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChMREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUyk7Ci0gICAgICBkID0gKGludCkgeTsKLSAgICAgIHkgLT0gZDsKLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0JYWJvcnQgKCk7Ci0gICAgICBtLmxpbWJzW0xEQkxfTUFOVF9CSVQgLyBHTVBfTElNQl9CSVRTXSA9IGQ7Ci0gICAgfQotIyAgIGVuZGlmCi0jICBlbmRpZgotICBmb3IgKGkgPSBMREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUUzsgaSA+IDA7ICkKLSAgICB7Ci0gICAgICBtcF9saW1iX3QgaGksIGxvOwotICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0gICAgICBoaSA9IChpbnQpIHk7Ci0gICAgICB5IC09IGhpOwotICAgICAgaWYgKCEoeSA+PSAwLjBMICYmIHkgPCAxLjBMKSkKLQlhYm9ydCAoKTsKLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpOwotICAgICAgbG8gPSAoaW50KSB5OwotICAgICAgeSAtPSBsbzsKLSAgICAgIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0JYWJvcnQgKCk7Ci0gICAgICBtLmxpbWJzWy0taV0gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLSAgICB9Ci0gIGlmICghKHkgPT0gMC4wTCkpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIE5vcm1hbGlzZS4gICovCi0gIHdoaWxlIChtLm5saW1icyA+IDAgJiYgbS5saW1ic1ttLm5saW1icyAtIDFdID09IDApCi0gICAgbS5ubGltYnMtLTsKLSAgKm1wID0gbTsKLSAgKmVwID0gZXhwIC0gTERCTF9NQU5UX0JJVDsKLSAgcmV0dXJuIG0ubGltYnM7Ci19Ci0KLSMgZW5kaWYKLQotIyBpZiBORUVEX1BSSU5URl9ET1VCTEUKLQotLyogQXNzdW1pbmcgeCBpcyBmaW5pdGUgYW5kID49IDA6Ci0gICB3cml0ZSB4IGFzIHggPSAyXmUgKiBtLCB3aGVyZSBtIGlzIGEgYmlnbnVtLgotICAgUmV0dXJuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeQotICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLXN0YXRpYyB2b2lkICoKLWRlY29kZV9kb3VibGUgKGRvdWJsZSB4LCBpbnQgKmVwLCBtcG5fdCAqbXApCi17Ci0gIG1wbl90IG07Ci0gIGludCBleHA7Ci0gIGRvdWJsZSB5OwotICBzaXplX3QgaTsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3VsdC4gICovCi0gIG0ubmxpbWJzID0gKERCTF9NQU5UX0JJVCArIEdNUF9MSU1CX0JJVFMgLSAxKSAvIEdNUF9MSU1CX0JJVFM7Ci0gIG0ubGltYnMgPSAobXBfbGltYl90ICopIG1hbGxvYyAobS5ubGltYnMgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotICBpZiAobS5saW1icyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLSAgeSA9IGZyZXhwICh4LCAmZXhwKTsKLSAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIHggPSAyXmV4cCAqIHkgPSAyXihleHAgLSBEQkxfTUFOVF9CSVQpICogKHkgKiBEQkxfTUFOVF9CSVQpLCBhbmQgdGhlCi0gICAgIGxhdHRlciBpcyBhbiBpbnRlZ2VyLiAgKi8KLSAgLyogQ29udmVydCB0aGUgbWFudGlzc2EgKHkgKiBEQkxfTUFOVF9CSVQpIHRvIGEgc2VxdWVuY2Ugb2YgbGltYnMuCi0gICAgIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0J3Mgc2FmZSB0byBjYXN0IGEgJ2RvdWJsZScgdmFsdWUgYmV0d2VlbgotICAgICAyXjMxIGFuZCAyXjMyIHRvICd1bnNpZ25lZCBpbnQnLCB0aGVyZWZvcmUgcGxheSBzYWZlIGFuZCBjYXN0IG9ubHkKLSAgICAgJ2RvdWJsZScgdmFsdWVzIGJldHdlZW4gMCBhbmQgMl4xNiAodG8gJ3Vuc2lnbmVkIGludCcgb3IgJ2ludCcsCi0gICAgIGRvZXNuJ3QgbWF0dGVyKS4gICovCi0jICBpZiAoREJMX01BTlRfQklUICUgR01QX0xJTUJfQklUUykgIT0gMAotIyAgIGlmIChEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKSA+IEdNUF9MSU1CX0JJVFMgLyAyCi0gICAgewotICAgICAgbXBfbGltYl90IGhpLCBsbzsKLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoREJMX01BTlRfQklUICUgKEdNUF9MSU1CX0JJVFMgLyAyKSk7Ci0gICAgICBoaSA9IChpbnQpIHk7Ci0gICAgICB5IC09IGhpOwotICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0JYWJvcnQgKCk7Ci0gICAgICB5ICo9IChtcF9saW1iX3QpIDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKTsKLSAgICAgIGxvID0gKGludCkgeTsKLSAgICAgIHkgLT0gbG87Ci0gICAgICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLQlhYm9ydCAoKTsKLSAgICAgIG0ubGltYnNbREJMX01BTlRfQklUIC8gR01QX0xJTUJfQklUU10gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLSAgICB9Ci0jICAgZWxzZQotICAgIHsKLSAgICAgIG1wX2xpbWJfdCBkOwotICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChEQkxfTUFOVF9CSVQgJSBHTVBfTElNQl9CSVRTKTsKLSAgICAgIGQgPSAoaW50KSB5OwotICAgICAgeSAtPSBkOwotICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0JYWJvcnQgKCk7Ci0gICAgICBtLmxpbWJzW0RCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFNdID0gZDsKLSAgICB9Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0gIGZvciAoaSA9IERCTF9NQU5UX0JJVCAvIEdNUF9MSU1CX0JJVFM7IGkgPiAwOyApCi0gICAgewotICAgICAgbXBfbGltYl90IGhpLCBsbzsKLSAgICAgIHkgKj0gKG1wX2xpbWJfdCkgMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpOwotICAgICAgaGkgPSAoaW50KSB5OwotICAgICAgeSAtPSBoaTsKLSAgICAgIGlmICghKHkgPj0gMC4wICYmIHkgPCAxLjApKQotCWFib3J0ICgpOwotICAgICAgeSAqPSAobXBfbGltYl90KSAxIDw8IChHTVBfTElNQl9CSVRTIC8gMik7Ci0gICAgICBsbyA9IChpbnQpIHk7Ci0gICAgICB5IC09IGxvOwotICAgICAgaWYgKCEoeSA+PSAwLjAgJiYgeSA8IDEuMCkpCi0JYWJvcnQgKCk7Ci0gICAgICBtLmxpbWJzWy0taV0gPSAoaGkgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgfCBsbzsKLSAgICB9Ci0gIGlmICghKHkgPT0gMC4wKSkKLSAgICBhYm9ydCAoKTsKLSAgLyogTm9ybWFsaXNlLiAgKi8KLSAgd2hpbGUgKG0ubmxpbWJzID4gMCAmJiBtLmxpbWJzW20ubmxpbWJzIC0gMV0gPT0gMCkKLSAgICBtLm5saW1icy0tOwotICAqbXAgPSBtOwotICAqZXAgPSBleHAgLSBEQkxfTUFOVF9CSVQ7Ci0gIHJldHVybiBtLmxpbWJzOwotfQotCi0jIGVuZGlmCi0KLS8qIEFzc3VtaW5nIHggPSAyXmUgKiBtIGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLSAgIFJldHVybnMgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygcm91bmQgKHggKiAxMF5uKS4KLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0gICBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLXN0YXRpYyBjaGFyICoKLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9kZWNvZGVkIChpbnQgZSwgbXBuX3QgbSwgdm9pZCAqbWVtb3J5LCBpbnQgbikKLXsKLSAgaW50IHM7Ci0gIHNpemVfdCBleHRyYV96ZXJvZXM7Ci0gIHVuc2lnbmVkIGludCBhYnNfbjsKLSAgdW5zaWduZWQgaW50IGFic19zOwotICBtcF9saW1iX3QgKnBvdzVfcHRyOwotICBzaXplX3QgcG93NV9sZW47Ci0gIHVuc2lnbmVkIGludCBzX2xpbWJzOwotICB1bnNpZ25lZCBpbnQgc19iaXRzOwotICBtcG5fdCBwb3c1OwotICBtcG5fdCB6OwotICB2b2lkICp6X21lbW9yeTsKLSAgY2hhciAqZGlnaXRzOwotCi0gIGlmIChtZW1vcnkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgLyogeCA9IDJeZSAqIG0sIGhlbmNlCi0gICAgIHkgPSByb3VuZCAoMl5lICogMTBebiAqIG0pID0gcm91bmQgKDJeKGUrbikgKiA1Xm4gKiBtKQotICAgICAgID0gcm91bmQgKDJecyAqIDVebiAqIG0pLiAgKi8KLSAgcyA9IGUgKyBuOwotICBleHRyYV96ZXJvZXMgPSAwOwotICAvKiBGYWN0b3Igb3V0IGEgY29tbW9uIHBvd2VyIG9mIDEwIGlmIHBvc3NpYmxlLiAgKi8KLSAgaWYgKHMgPiAwICYmIG4gPiAwKQotICAgIHsKLSAgICAgIGV4dHJhX3plcm9lcyA9IChzIDwgbiA/IHMgOiBuKTsKLSAgICAgIHMgLT0gZXh0cmFfemVyb2VzOwotICAgICAgbiAtPSBleHRyYV96ZXJvZXM7Ci0gICAgfQotICAvKiBIZXJlIHkgPSByb3VuZCAoMl5zICogNV5uICogbSkgKiAxMF5leHRyYV96ZXJvZXMuCi0gICAgIEJlZm9yZSBjb252ZXJ0aW5nIHRvIGRlY2ltYWwsIHdlIG5lZWQgdG8gY29tcHV0ZQotICAgICB6ID0gcm91bmQgKDJecyAqIDVebiAqIG0pLiAgKi8KLSAgLyogQ29tcHV0ZSA1XnxufCwgcG9zc2libHkgc2hpZnRlZCBieSB8c3wgYml0cyBpZiBuIGFuZCBzIGhhdmUgdGhlIHNhbWUKLSAgICAgc2lnbi4gIDIuMzIyIGlzIHNsaWdodGx5IGxhcmdlciB0aGFuIGxvZyg1KS9sb2coMikuICAqLwotICBhYnNfbiA9IChuID49IDAgPyBuIDogLW4pOwotICBhYnNfcyA9IChzID49IDAgPyBzIDogLXMpOwotICBwb3c1X3B0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jICgoKGludCkoYWJzX24gKiAoMi4zMjJmIC8gR01QX0xJTUJfQklUUykpICsgMQotCQkJCSAgICArIGFic19zIC8gR01QX0xJTUJfQklUUyArIDEpCi0JCQkJICAgKiBzaXplb2YgKG1wX2xpbWJfdCkpOwotICBpZiAocG93NV9wdHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChtZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKiBJbml0aWFsaXplIHdpdGggMS4gICovCi0gIHBvdzVfcHRyWzBdID0gMTsKLSAgcG93NV9sZW4gPSAxOwotICAvKiBNdWx0aXBseSB3aXRoIDVefG58LiAgKi8KLSAgaWYgKGFic19uID4gMCkKLSAgICB7Ci0gICAgICBzdGF0aWMgbXBfbGltYl90IGNvbnN0IHNtYWxsX3BvdzVbMTMgKyAxXSA9Ci0JewotCSAgMSwgNSwgMjUsIDEyNSwgNjI1LCAzMTI1LCAxNTYyNSwgNzgxMjUsIDM5MDYyNSwgMTk1MzEyNSwgOTc2NTYyNSwKLQkgIDQ4ODI4MTI1LCAyNDQxNDA2MjUsIDEyMjA3MDMxMjUKLQl9OwotICAgICAgdW5zaWduZWQgaW50IG4xMzsKLSAgICAgIGZvciAobjEzID0gMDsgbjEzIDw9IGFic19uOyBuMTMgKz0gMTMpCi0JewotCSAgbXBfbGltYl90IGRpZ2l0MSA9IHNtYWxsX3BvdzVbbjEzICsgMTMgPD0gYWJzX24gPyAxMyA6IGFic19uIC0gbjEzXTsKLQkgIHNpemVfdCBqOwotCSAgbXBfdHdvbGltYl90IGNhcnJ5ID0gMDsKLQkgIGZvciAoaiA9IDA7IGogPCBwb3c1X2xlbjsgaisrKQotCSAgICB7Ci0JICAgICAgbXBfbGltYl90IGRpZ2l0MiA9IHBvdzVfcHRyW2pdOwotCSAgICAgIGNhcnJ5ICs9IChtcF90d29saW1iX3QpIGRpZ2l0MSAqIChtcF90d29saW1iX3QpIGRpZ2l0MjsKLQkgICAgICBwb3c1X3B0cltqXSA9IChtcF9saW1iX3QpIGNhcnJ5OwotCSAgICAgIGNhcnJ5ID0gY2FycnkgPj4gR01QX0xJTUJfQklUUzsKLQkgICAgfQotCSAgaWYgKGNhcnJ5ID4gMCkKLQkgICAgcG93NV9wdHJbcG93NV9sZW4rK10gPSAobXBfbGltYl90KSBjYXJyeTsKLQl9Ci0gICAgfQotICBzX2xpbWJzID0gYWJzX3MgLyBHTVBfTElNQl9CSVRTOwotICBzX2JpdHMgPSBhYnNfcyAlIEdNUF9MSU1CX0JJVFM7Ci0gIGlmIChuID49IDAgPyBzID49IDAgOiBzIDw9IDApCi0gICAgewotICAgICAgLyogTXVsdGlwbHkgd2l0aCAyXnxzfC4gICovCi0gICAgICBpZiAoc19iaXRzID4gMCkKLQl7Ci0JICBtcF9saW1iX3QgKnB0ciA9IHBvdzVfcHRyOwotCSAgbXBfdHdvbGltYl90IGFjY3UgPSAwOwotCSAgc2l6ZV90IGNvdW50OwotCSAgZm9yIChjb3VudCA9IHBvdzVfbGVuOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JICAgIHsKLQkgICAgICBhY2N1ICs9IChtcF90d29saW1iX3QpICpwdHIgPDwgc19iaXRzOwotCSAgICAgICpwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0JICAgICAgYWNjdSA9IGFjY3UgPj4gR01QX0xJTUJfQklUUzsKLQkgICAgfQotCSAgaWYgKGFjY3UgPiAwKQotCSAgICB7Ci0JICAgICAgKnB0ciA9IChtcF9saW1iX3QpIGFjY3U7Ci0JICAgICAgcG93NV9sZW4rKzsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzX2xpbWJzID4gMCkKLQl7Ci0JICBzaXplX3QgY291bnQ7Ci0JICBmb3IgKGNvdW50ID0gcG93NV9sZW47IGNvdW50ID4gMDspCi0JICAgIHsKLQkgICAgICBjb3VudC0tOwotCSAgICAgIHBvdzVfcHRyW3NfbGltYnMgKyBjb3VudF0gPSBwb3c1X3B0cltjb3VudF07Ci0JICAgIH0KLQkgIGZvciAoY291bnQgPSBzX2xpbWJzOyBjb3VudCA+IDA7KQotCSAgICB7Ci0JICAgICAgY291bnQtLTsKLQkgICAgICBwb3c1X3B0cltjb3VudF0gPSAwOwotCSAgICB9Ci0JICBwb3c1X2xlbiArPSBzX2xpbWJzOwotCX0KLSAgICAgIHBvdzUubGltYnMgPSBwb3c1X3B0cjsKLSAgICAgIHBvdzUubmxpbWJzID0gcG93NV9sZW47Ci0gICAgICBpZiAobiA+PSAwKQotCXsKLQkgIC8qIE11bHRpcGx5IG0gd2l0aCBwb3c1LiAgTm8gZGl2aXNpb24gbmVlZGVkLiAgKi8KLQkgIHpfbWVtb3J5ID0gbXVsdGlwbHkgKG0sIHBvdzUsICZ6KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRGl2aWRlIG0gYnkgcG93NSBhbmQgcm91bmQuICAqLwotCSAgel9tZW1vcnkgPSBkaXZpZGUgKG0sIHBvdzUsICZ6KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcG93NS5saW1icyA9IHBvdzVfcHRyOwotICAgICAgcG93NS5ubGltYnMgPSBwb3c1X2xlbjsKLSAgICAgIGlmIChuID49IDApCi0JewotCSAgLyogbiA+PSAwLCBzIDwgMC4KLQkgICAgIE11bHRpcGx5IG0gd2l0aCBwb3c1LCB0aGVuIGRpdmlkZSBieSAyXnxzfC4gICovCi0JICBtcG5fdCBudW1lcmF0b3I7Ci0JICBtcG5fdCBkZW5vbWluYXRvcjsKLQkgIHZvaWQgKnRtcF9tZW1vcnk7Ci0JICB0bXBfbWVtb3J5ID0gbXVsdGlwbHkgKG0sIHBvdzUsICZudW1lcmF0b3IpOwotCSAgaWYgKHRtcF9tZW1vcnkgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHBvdzVfcHRyKTsKLQkgICAgICBmcmVlIChtZW1vcnkpOwotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICAvKiBDb25zdHJ1Y3QgMl58c3wuICAqLwotCSAgewotCSAgICBtcF9saW1iX3QgKnB0ciA9IHBvdzVfcHRyICsgcG93NV9sZW47Ci0JICAgIHNpemVfdCBpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgc19saW1iczsgaSsrKQotCSAgICAgIHB0cltpXSA9IDA7Ci0JICAgIHB0cltzX2xpbWJzXSA9IChtcF9saW1iX3QpIDEgPDwgc19iaXRzOwotCSAgICBkZW5vbWluYXRvci5saW1icyA9IHB0cjsKLQkgICAgZGVub21pbmF0b3IubmxpbWJzID0gc19saW1icyArIDE7Ci0JICB9Ci0JICB6X21lbW9yeSA9IGRpdmlkZSAobnVtZXJhdG9yLCBkZW5vbWluYXRvciwgJnopOwotCSAgZnJlZSAodG1wX21lbW9yeSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG4gPCAwLCBzID4gMC4KLQkgICAgIE11bHRpcGx5IG0gd2l0aCAyXnMsIHRoZW4gZGl2aWRlIGJ5IHBvdzUuICAqLwotCSAgbXBuX3QgbnVtZXJhdG9yOwotCSAgbXBfbGltYl90ICpudW1fcHRyOwotCSAgbnVtX3B0ciA9IChtcF9saW1iX3QgKikgbWFsbG9jICgobS5ubGltYnMgKyBzX2xpbWJzICsgMSkKLQkJCQkJICAqIHNpemVvZiAobXBfbGltYl90KSk7Ci0JICBpZiAobnVtX3B0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAocG93NV9wdHIpOwotCSAgICAgIGZyZWUgKG1lbW9yeSk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIHsKLQkgICAgbXBfbGltYl90ICpkZXN0cHRyID0gbnVtX3B0cjsKLQkgICAgewotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzX2xpbWJzOyBpKyspCi0JCSpkZXN0cHRyKysgPSAwOwotCSAgICB9Ci0JICAgIGlmIChzX2JpdHMgPiAwKQotCSAgICAgIHsKLQkJY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBtLmxpbWJzOwotCQltcF90d29saW1iX3QgYWNjdSA9IDA7Ci0JCXNpemVfdCBjb3VudDsKLQkJZm9yIChjb3VudCA9IG0ubmxpbWJzOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JCSAgewotCQkgICAgYWNjdSArPSAobXBfdHdvbGltYl90KSAqc291cmNlcHRyKysgPDwgc19iaXRzOwotCQkgICAgKmRlc3RwdHIrKyA9IChtcF9saW1iX3QpIGFjY3U7Ci0JCSAgICBhY2N1ID0gYWNjdSA+PiBHTVBfTElNQl9CSVRTOwotCQkgIH0KLQkJaWYgKGFjY3UgPiAwKQotCQkgICpkZXN0cHRyKysgPSAobXBfbGltYl90KSBhY2N1OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJY29uc3QgbXBfbGltYl90ICpzb3VyY2VwdHIgPSBtLmxpbWJzOwotCQlzaXplX3QgY291bnQ7Ci0JCWZvciAoY291bnQgPSBtLm5saW1iczsgY291bnQgPiAwOyBjb3VudC0tKQotCQkgICpkZXN0cHRyKysgPSAqc291cmNlcHRyKys7Ci0JICAgICAgfQotCSAgICBudW1lcmF0b3IubGltYnMgPSBudW1fcHRyOwotCSAgICBudW1lcmF0b3IubmxpbWJzID0gZGVzdHB0ciAtIG51bV9wdHI7Ci0JICB9Ci0JICB6X21lbW9yeSA9IGRpdmlkZSAobnVtZXJhdG9yLCBwb3c1LCAmeik7Ci0JICBmcmVlIChudW1fcHRyKTsKLQl9Ci0gICAgfQotICBmcmVlIChwb3c1X3B0cik7Ci0gIGZyZWUgKG1lbW9yeSk7Ci0KLSAgLyogSGVyZSB5ID0gcm91bmQgKHggKiAxMF5uKSA9IHogKiAxMF5leHRyYV96ZXJvZXMuICAqLwotCi0gIGlmICh6X21lbW9yeSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBkaWdpdHMgPSBjb252ZXJ0X3RvX2RlY2ltYWwgKHosIGV4dHJhX3plcm9lcyk7Ci0gIGZyZWUgKHpfbWVtb3J5KTsKLSAgcmV0dXJuIGRpZ2l0czsKLX0KLQotIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotCi0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLSAgIFJldHVybnMgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygcm91bmQgKHggKiAxMF5uKS4KLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0gICBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLXN0YXRpYyBjaGFyICoKLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9sb25nX2RvdWJsZSAobG9uZyBkb3VibGUgeCwgaW50IG4pCi17Ci0gIGludCBlOwotICBtcG5fdCBtOwotICB2b2lkICptZW1vcnkgPSBkZWNvZGVfbG9uZ19kb3VibGUgKHgsICZlLCAmbSk7Ci0gIHJldHVybiBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZGVjb2RlZCAoZSwgbSwgbWVtb3J5LCBuKTsKLX0KLQotIyBlbmRpZgotCi0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotCi0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPj0gMCwgYW5kIG4gaXMgYW4gaW50ZWdlcjoKLSAgIFJldHVybnMgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2Ygcm91bmQgKHggKiAxMF5uKS4KLSAgIFJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAtIGNvbnRhaW5pbmcgdGhlIGRlY2ltYWwgZGlnaXRzIGluIGxvdy10by1oaWdoCi0gICBvcmRlciwgdGVybWluYXRlZCB3aXRoIGEgTlVMIGNoYXJhY3RlciAtIGluIGNhc2Ugb2Ygc3VjY2VzcywgTlVMTCBpbiBjYXNlCi0gICBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLiAgKi8KLXN0YXRpYyBjaGFyICoKLXNjYWxlMTBfcm91bmRfZGVjaW1hbF9kb3VibGUgKGRvdWJsZSB4LCBpbnQgbikKLXsKLSAgaW50IGU7Ci0gIG1wbl90IG07Ci0gIHZvaWQgKm1lbW9yeSA9IGRlY29kZV9kb3VibGUgKHgsICZlLCAmbSk7Ci0gIHJldHVybiBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZGVjb2RlZCAoZSwgbSwgbWVtb3J5LCBuKTsKLX0KLQotIyBlbmRpZgotCi0jIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0KLS8qIEFzc3VtaW5nIHggaXMgZmluaXRlIGFuZCA+IDA6Ci0gICBSZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBmb3IgbiB3aXRoIDEwXm4gPD0geCA8IDEwXihuKzEpLgotICAgVGhlIGFwcHJveGltYXRpb24gaXMgdXN1YWxseSB0aGUgcmlnaHQgbiwgYnV0IG1heSBiZSBvZmYgYnkgMSBzb21ldGltZXMuICAqLwotc3RhdGljIGludAotZmxvb3Jsb2cxMGwgKGxvbmcgZG91YmxlIHgpCi17Ci0gIGludCBleHA7Ci0gIGxvbmcgZG91YmxlIHk7Ci0gIGRvdWJsZSB6OwotICBkb3VibGUgbDsKLQotICAvKiBTcGxpdCBpbnRvIGV4cG9uZW50aWFsIHBhcnQgYW5kIG1hbnRpc3NhLiAgKi8KLSAgeSA9IGZyZXhwbCAoeCwgJmV4cCk7Ci0gIGlmICghKHkgPj0gMC4wTCAmJiB5IDwgMS4wTCkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh5ID09IDAuMEwpCi0gICAgcmV0dXJuIElOVF9NSU47Ci0gIGlmICh5IDwgMC41TCkKLSAgICB7Ci0gICAgICB3aGlsZSAoeSA8ICgxLjBMIC8gKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgLyAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSkpCi0JewotCSAgeSAqPSAxLjBMICogKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSkgKiAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKTsKLQkgIGV4cCAtPSBHTVBfTElNQl9CSVRTOwotCX0KLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCAxNikpKQotCXsKLQkgIHkgKj0gMS4wTCAqICgxIDw8IDE2KTsKLQkgIGV4cCAtPSAxNjsKLQl9Ci0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgOCkpKQotCXsKLQkgIHkgKj0gMS4wTCAqICgxIDw8IDgpOwotCSAgZXhwIC09IDg7Ci0JfQotICAgICAgaWYgKHkgPCAoMS4wTCAvICgxIDw8IDQpKSkKLQl7Ci0JICB5ICo9IDEuMEwgKiAoMSA8PCA0KTsKLQkgIGV4cCAtPSA0OwotCX0KLSAgICAgIGlmICh5IDwgKDEuMEwgLyAoMSA8PCAyKSkpCi0JewotCSAgeSAqPSAxLjBMICogKDEgPDwgMik7Ci0JICBleHAgLT0gMjsKLQl9Ci0gICAgICBpZiAoeSA8ICgxLjBMIC8gKDEgPDwgMSkpKQotCXsKLQkgIHkgKj0gMS4wTCAqICgxIDw8IDEpOwotCSAgZXhwIC09IDE7Ci0JfQotICAgIH0KLSAgaWYgKCEoeSA+PSAwLjVMICYmIHkgPCAxLjBMKSkKLSAgICBhYm9ydCAoKTsKLSAgLyogQ29tcHV0ZSBhbiBhcHByb3hpbWF0aW9uIGZvciBsID0gbG9nMih4KSA9IGV4cCArIGxvZzIoeSkuICAqLwotICBsID0gZXhwOwotICB6ID0geTsKLSAgaWYgKHogPCAwLjcwNzEwNjc4MTE4NjU0NzUyNDQ0KQotICAgIHsKLSAgICAgIHogKj0gMS40MTQyMTM1NjIzNzMwOTUwNDg4OwotICAgICAgbCAtPSAwLjU7Ci0gICAgfQotICBpZiAoeiA8IDAuODQwODk2NDE1MjUzNzE0NTQzMSkKLSAgICB7Ci0gICAgICB6ICo9IDEuMTg5MjA3MTE1MDAyNzIxMDY2NzsKLSAgICAgIGwgLT0gMC4yNTsKLSAgICB9Ci0gIGlmICh6IDwgMC45MTcwMDQwNDMyMDQ2NzEyMzE3NSkKLSAgICB7Ci0gICAgICB6ICo9IDEuMDkwNTA3NzMyNjY1MjU3NjU5MjsKLSAgICAgIGwgLT0gMC4xMjU7Ci0gICAgfQotICBpZiAoeiA8IDAuOTU3NjAzMjgwNjk4NTczNjQ2OSkKLSAgICB7Ci0gICAgICB6ICo9IDEuMDQ0MjczNzgyNDI3NDEzODQwMzsKLSAgICAgIGwgLT0gMC4wNjI1OwotICAgIH0KLSAgLyogTm93IDAuOTUgPD0geiA8PSAxLjAxLiAgKi8KLSAgeiA9IDEgLSB6OwotICAvKiBsb2coMS16KSA9IC0geiAtIHpeMi8yIC0gel4zLzMgLSB6XjQvNCAtIC4uLgotICAgICBGb3VyIHRlcm1zIGFyZSBlbm91Z2ggdG8gZ2V0IGFuIGFwcHJveGltYXRpb24gd2l0aCBlcnJvciA8IDEwXi03LiAgKi8KLSAgbCAtPSB6ICogKDEuMCArIHogKiAoMC41ICsgeiAqICgoMS4wIC8gMykgKyB6ICogMC4yNSkpKTsKLSAgLyogRmluYWxseSBtdWx0aXBseSB3aXRoIGxvZygyKS9sb2coMTApLCB5aWVsZHMgYW4gYXBwcm94aW1hdGlvbiBmb3IKLSAgICAgbG9nMTAoeCkuICAqLwotICBsICo9IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjM7Ci0gIC8qIFJvdW5kIGRvd24gdG8gdGhlIG5leHQgaW50ZWdlci4gICovCi0gIHJldHVybiAoaW50KSBsICsgKGwgPCAwID8gLTEgOiAwKTsKLX0KLQotIyBlbmRpZgotCi0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotCi0vKiBBc3N1bWluZyB4IGlzIGZpbml0ZSBhbmQgPiAwOgotICAgUmV0dXJuIGFuIGFwcHJveGltYXRpb24gZm9yIG4gd2l0aCAxMF5uIDw9IHggPCAxMF4obisxKS4KLSAgIFRoZSBhcHByb3hpbWF0aW9uIGlzIHVzdWFsbHkgdGhlIHJpZ2h0IG4sIGJ1dCBtYXkgYmUgb2ZmIGJ5IDEgc29tZXRpbWVzLiAgKi8KLXN0YXRpYyBpbnQKLWZsb29ybG9nMTAgKGRvdWJsZSB4KQotewotICBpbnQgZXhwOwotICBkb3VibGUgeTsKLSAgZG91YmxlIHo7Ci0gIGRvdWJsZSBsOwotCi0gIC8qIFNwbGl0IGludG8gZXhwb25lbnRpYWwgcGFydCBhbmQgbWFudGlzc2EuICAqLwotICB5ID0gZnJleHAgKHgsICZleHApOwotICBpZiAoISh5ID49IDAuMCAmJiB5IDwgMS4wKSkKLSAgICBhYm9ydCAoKTsKLSAgaWYgKHkgPT0gMC4wKQotICAgIHJldHVybiBJTlRfTUlOOwotICBpZiAoeSA8IDAuNSkKLSAgICB7Ci0gICAgICB3aGlsZSAoeSA8ICgxLjAgLyAoMSA8PCAoR01QX0xJTUJfQklUUyAvIDIpKSAvICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpKSkKLQl7Ci0JICB5ICo9IDEuMCAqICgxIDw8IChHTVBfTElNQl9CSVRTIC8gMikpICogKDEgPDwgKEdNUF9MSU1CX0JJVFMgLyAyKSk7Ci0JICBleHAgLT0gR01QX0xJTUJfQklUUzsKLQl9Ci0gICAgICBpZiAoeSA8ICgxLjAgLyAoMSA8PCAxNikpKQotCXsKLQkgIHkgKj0gMS4wICogKDEgPDwgMTYpOwotCSAgZXhwIC09IDE2OwotCX0KLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDgpKSkKLQl7Ci0JICB5ICo9IDEuMCAqICgxIDw8IDgpOwotCSAgZXhwIC09IDg7Ci0JfQotICAgICAgaWYgKHkgPCAoMS4wIC8gKDEgPDwgNCkpKQotCXsKLQkgIHkgKj0gMS4wICogKDEgPDwgNCk7Ci0JICBleHAgLT0gNDsKLQl9Ci0gICAgICBpZiAoeSA8ICgxLjAgLyAoMSA8PCAyKSkpCi0JewotCSAgeSAqPSAxLjAgKiAoMSA8PCAyKTsKLQkgIGV4cCAtPSAyOwotCX0KLSAgICAgIGlmICh5IDwgKDEuMCAvICgxIDw8IDEpKSkKLQl7Ci0JICB5ICo9IDEuMCAqICgxIDw8IDEpOwotCSAgZXhwIC09IDE7Ci0JfQotICAgIH0KLSAgaWYgKCEoeSA+PSAwLjUgJiYgeSA8IDEuMCkpCi0gICAgYWJvcnQgKCk7Ci0gIC8qIENvbXB1dGUgYW4gYXBwcm94aW1hdGlvbiBmb3IgbCA9IGxvZzIoeCkgPSBleHAgKyBsb2cyKHkpLiAgKi8KLSAgbCA9IGV4cDsKLSAgeiA9IHk7Ci0gIGlmICh6IDwgMC43MDcxMDY3ODExODY1NDc1MjQ0NCkKLSAgICB7Ci0gICAgICB6ICo9IDEuNDE0MjEzNTYyMzczMDk1MDQ4ODsKLSAgICAgIGwgLT0gMC41OwotICAgIH0KLSAgaWYgKHogPCAwLjg0MDg5NjQxNTI1MzcxNDU0MzEpCi0gICAgewotICAgICAgeiAqPSAxLjE4OTIwNzExNTAwMjcyMTA2Njc7Ci0gICAgICBsIC09IDAuMjU7Ci0gICAgfQotICBpZiAoeiA8IDAuOTE3MDA0MDQzMjA0NjcxMjMxNzUpCi0gICAgewotICAgICAgeiAqPSAxLjA5MDUwNzczMjY2NTI1NzY1OTI7Ci0gICAgICBsIC09IDAuMTI1OwotICAgIH0KLSAgaWYgKHogPCAwLjk1NzYwMzI4MDY5ODU3MzY0NjkpCi0gICAgewotICAgICAgeiAqPSAxLjA0NDI3Mzc4MjQyNzQxMzg0MDM7Ci0gICAgICBsIC09IDAuMDYyNTsKLSAgICB9Ci0gIC8qIE5vdyAwLjk1IDw9IHogPD0gMS4wMS4gICovCi0gIHogPSAxIC0gejsKLSAgLyogbG9nKDEteikgPSAtIHogLSB6XjIvMiAtIHpeMy8zIC0gel40LzQgLSAuLi4KLSAgICAgRm91ciB0ZXJtcyBhcmUgZW5vdWdoIHRvIGdldCBhbiBhcHByb3hpbWF0aW9uIHdpdGggZXJyb3IgPCAxMF4tNy4gICovCi0gIGwgLT0geiAqICgxLjAgKyB6ICogKDAuNSArIHogKiAoKDEuMCAvIDMpICsgeiAqIDAuMjUpKSk7Ci0gIC8qIEZpbmFsbHkgbXVsdGlwbHkgd2l0aCBsb2coMikvbG9nKDEwKSwgeWllbGRzIGFuIGFwcHJveGltYXRpb24gZm9yCi0gICAgIGxvZzEwKHgpLiAgKi8KLSAgbCAqPSAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIzOwotICAvKiBSb3VuZCBkb3duIHRvIHRoZSBuZXh0IGludGVnZXIuICAqLwotICByZXR1cm4gKGludCkgbCArIChsIDwgMCA/IC0xIDogMCk7Ci19Ci0KLSMgZW5kaWYKLQotI2VuZGlmCi0KLURDSEFSX1QgKgotVkFTTlBSSU5URiAoRENIQVJfVCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsCi0JICAgIGNvbnN0IEZDSEFSX1QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICBESVJFQ1RJVkVTIGQ7Ci0gIGFyZ3VtZW50cyBhOwotCi0gIGlmIChQUklOVEZfUEFSU0UgKGZvcm1hdCwgJmQsICZhKSA8IDApCi0gICAgLyogZXJybm8gaXMgYWxyZWFkeSBzZXQuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0jZGVmaW5lIENMRUFOVVAoKSBcCi0gIGZyZWUgKGQuZGlyKTsJCQkJCQkJCVwKLSAgaWYgKGEuYXJnKQkJCQkJCQkJXAotICAgIGZyZWUgKGEuYXJnKTsKLQotICBpZiAoUFJJTlRGX0ZFVENIQVJHUyAoYXJncywgJmEpIDwgMCkKLSAgICB7Ci0gICAgICBDTEVBTlVQICgpOwotICAgICAgZXJybm8gPSBFSU5WQUw7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgewotICAgIHNpemVfdCBidWZfbmVlZGVkbGVuZ3RoOwotICAgIFRDSEFSX1QgKmJ1ZjsKLSAgICBUQ0hBUl9UICpidWZfbWFsbG9jZWQ7Ci0gICAgY29uc3QgRkNIQVJfVCAqY3A7Ci0gICAgc2l6ZV90IGk7Ci0gICAgRElSRUNUSVZFICpkcDsKLSAgICAvKiBPdXRwdXQgc3RyaW5nIGFjY3VtdWxhdG9yLiAgKi8KLSAgICBEQ0hBUl9UICpyZXN1bHQ7Ci0gICAgc2l6ZV90IGFsbG9jYXRlZDsKLSAgICBzaXplX3QgbGVuZ3RoOwotCi0gICAgLyogQWxsb2NhdGUgYSBzbWFsbCBidWZmZXIgdGhhdCB3aWxsIGhvbGQgYSBkaXJlY3RpdmUgcGFzc2VkIHRvCi0gICAgICAgc3ByaW50ZiBvciBzbnByaW50Zi4gICovCi0gICAgYnVmX25lZWRlZGxlbmd0aCA9Ci0gICAgICB4c3VtNCAoNywgZC5tYXhfd2lkdGhfbGVuZ3RoLCBkLm1heF9wcmVjaXNpb25fbGVuZ3RoLCA2KTsKLSNpZiBIQVZFX0FMTE9DQQotICAgIGlmIChidWZfbmVlZGVkbGVuZ3RoIDwgNDAwMCAvIHNpemVvZiAoVENIQVJfVCkpCi0gICAgICB7Ci0JYnVmID0gKFRDSEFSX1QgKikgYWxsb2NhIChidWZfbmVlZGVkbGVuZ3RoICogc2l6ZW9mIChUQ0hBUl9UKSk7Ci0JYnVmX21hbGxvY2VkID0gTlVMTDsKLSAgICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHsKLQlzaXplX3QgYnVmX21lbXNpemUgPSB4dGltZXMgKGJ1Zl9uZWVkZWRsZW5ndGgsIHNpemVvZiAoVENIQVJfVCkpOwotCWlmIChzaXplX292ZXJmbG93X3AgKGJ1Zl9tZW1zaXplKSkKLQkgIGdvdG8gb3V0X29mX21lbW9yeV8xOwotCWJ1ZiA9IChUQ0hBUl9UICopIG1hbGxvYyAoYnVmX21lbXNpemUpOwotCWlmIChidWYgPT0gTlVMTCkKLQkgIGdvdG8gb3V0X29mX21lbW9yeV8xOwotCWJ1Zl9tYWxsb2NlZCA9IGJ1ZjsKLSAgICAgIH0KLQotICAgIGlmIChyZXN1bHRidWYgIT0gTlVMTCkKLSAgICAgIHsKLQlyZXN1bHQgPSByZXN1bHRidWY7Ci0JYWxsb2NhdGVkID0gKmxlbmd0aHA7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCXJlc3VsdCA9IE5VTEw7Ci0JYWxsb2NhdGVkID0gMDsKLSAgICAgIH0KLSAgICBsZW5ndGggPSAwOwotICAgIC8qIEludmFyaWFudHM6Ci0gICAgICAgcmVzdWx0IGlzIGVpdGhlciA9PSByZXN1bHRidWYgb3IgPT0gTlVMTCBvciBtYWxsb2MtYWxsb2NhdGVkLgotICAgICAgIElmIGxlbmd0aCA+IDAsIHRoZW4gcmVzdWx0ICE9IE5VTEwuICAqLwotCi0gICAgLyogRW5zdXJlcyB0aGF0IGFsbG9jYXRlZCA+PSBuZWVkZWQuICBBYm9ydHMgdGhyb3VnaCBhIGp1bXAgdG8KLSAgICAgICBvdXRfb2ZfbWVtb3J5IGlmIG5lZWRlZCBpcyBTSVpFX01BWCBvciBvdGhlcndpc2UgdG9vIGJpZy4gICovCi0jZGVmaW5lIEVOU1VSRV9BTExPQ0FUSU9OKG5lZWRlZCkgXAotICAgIGlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCQkgICAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICAgIFwKLQlzaXplX3QgbWVtb3J5X3NpemU7CQkJCQkJICAgICBcCi0JRENIQVJfVCAqbWVtb3J5OwkJCQkJCSAgICAgXAotCQkJCQkJCQkJICAgICBcCi0JYWxsb2NhdGVkID0gKGFsbG9jYXRlZCA+IDAgPyB4dGltZXMgKGFsbG9jYXRlZCwgMikgOiAxMik7CSAgICAgXAotCWlmICgobmVlZGVkKSA+IGFsbG9jYXRlZCkJCQkJCSAgICAgXAotCSAgYWxsb2NhdGVkID0gKG5lZWRlZCk7CQkJCQkJICAgICBcCi0JbWVtb3J5X3NpemUgPSB4dGltZXMgKGFsbG9jYXRlZCwgc2l6ZW9mIChEQ0hBUl9UKSk7CQkgICAgIFwKLQlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCSAgICAgXAotCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAotCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKQkJCSAgICAgXAotCSAgbWVtb3J5ID0gKERDSEFSX1QgKikgbWFsbG9jIChtZW1vcnlfc2l6ZSk7CQkJICAgICBcCi0JZWxzZQkJCQkJCQkJICAgICBcCi0JICBtZW1vcnkgPSAoRENIQVJfVCAqKSByZWFsbG9jIChyZXN1bHQsIG1lbW9yeV9zaXplKTsJCSAgICAgXAotCWlmIChtZW1vcnkgPT0gTlVMTCkJCQkJCQkgICAgIFwKLQkgIGdvdG8gb3V0X29mX21lbW9yeTsJCQkJCQkgICAgIFwKLQlpZiAocmVzdWx0ID09IHJlc3VsdGJ1ZiAmJiBsZW5ndGggPiAwKQkJCQkgICAgIFwKLQkgIERDSEFSX0NQWSAobWVtb3J5LCByZXN1bHQsIGxlbmd0aCk7CQkJCSAgICAgXAotCXJlc3VsdCA9IG1lbW9yeTsJCQkJCQkgICAgIFwKLSAgICAgIH0KLQotICAgIGZvciAoY3AgPSBmb3JtYXQsIGkgPSAwLCBkcCA9ICZkLmRpclswXTsgOyBjcCA9IGRwLT5kaXJfZW5kLCBpKyssIGRwKyspCi0gICAgICB7Ci0JaWYgKGNwICE9IGRwLT5kaXJfc3RhcnQpCi0JICB7Ci0JICAgIHNpemVfdCBuID0gZHAtPmRpcl9zdGFydCAtIGNwOwotCSAgICBzaXplX3QgYXVnbWVudGVkX2xlbmd0aCA9IHhzdW0gKGxlbmd0aCwgbik7Ci0KLQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOwotCSAgICAvKiBUaGlzIGNvcGllcyBhIHBpZWNlIG9mIEZDSEFSX1RbXSBpbnRvIGEgRENIQVJfVFtdLiAgSGVyZSB3ZQotCSAgICAgICBuZWVkIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgb25seSBBU0NJSSBjaGFyYWN0ZXJzCi0JICAgICAgIGlmIEZDSEFSX1QgYW5kIERDSEFSX1QgYXJlIG5vdCB0aGUgc2FtZSB0eXBlLiAgKi8KLQkgICAgaWYgKHNpemVvZiAoRkNIQVJfVCkgPT0gc2l6ZW9mIChEQ0hBUl9UKSkKLQkgICAgICB7Ci0JCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCAoY29uc3QgRENIQVJfVCAqKSBjcCwgbik7Ci0JCWxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlkbwotCQkgIHJlc3VsdFtsZW5ndGgrK10gPSAodW5zaWduZWQgY2hhcikgKmNwKys7Ci0JCXdoaWxlICgtLW4gPiAwKTsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKGkgPT0gZC5jb3VudCkKLQkgIGJyZWFrOwotCi0JLyogRXhlY3V0ZSBhIHNpbmdsZSBkaXJlY3RpdmUuICAqLwotCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnJScpCi0JICB7Ci0JICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoOwotCi0JICAgIGlmICghKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpKQotCSAgICAgIGFib3J0ICgpOwotCSAgICBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCAxKTsKLQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOwotCSAgICByZXN1bHRbbGVuZ3RoXSA9ICclJzsKLQkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmICghKGRwLT5hcmdfaW5kZXggIT0gQVJHX05PTkUpKQotCSAgICAgIGFib3J0ICgpOwotCi0JICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnbicpCi0JICAgICAgewotCQlzd2l0Y2ggKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUpCi0JCSAgewotCQkgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgotCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gbGVuZ3RoOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6Ci0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3Nob3J0X3BvaW50ZXIgPSBsZW5ndGg7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6Ci0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2ludF9wb2ludGVyID0gbGVuZ3RoOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKLQkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOwotCQkgICAgYnJlYWs7Ci0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0JCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6Ci0JCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSBsZW5ndGg7Ci0JCSAgICBicmVhazsKLSNlbmRpZgotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotI2lmIEVOQUJMRV9VTklTVERJTwotCSAgICAvKiBUaGUgdW5pc3RkaW8gZXh0ZW5zaW9ucy4gICovCi0JICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdVJykKLQkgICAgICB7Ci0JCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOwotCQlpbnQgZmxhZ3MgPSBkcC0+ZmxhZ3M7Ci0JCWludCBoYXNfd2lkdGg7Ci0JCXNpemVfdCB3aWR0aDsKLQkJaW50IGhhc19wcmVjaXNpb247Ci0JCXNpemVfdCBwcmVjaXNpb247Ci0KLQkJaGFzX3dpZHRoID0gMDsKLQkJd2lkdGggPSAwOwotCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0JCSAgewotCQkgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCSAgICAgIHsKLQkJCWludCBhcmc7Ci0KLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkJICBhYm9ydCAoKTsKLQkJCWFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQlpZiAoYXJnIDwgMCkKLQkJCSAgewotCQkJICAgIC8qICJBIG5lZ2F0aXZlIGZpZWxkIHdpZHRoIGlzIHRha2VuIGFzIGEgJy0nIGZsYWcKLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotCQkJICAgIGZsYWdzIHw9IEZMQUdfTEVGVDsKLQkJCSAgICB3aWR0aCA9ICh1bnNpZ25lZCBpbnQpICgtYXJnKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB3aWR0aCA9IGFyZzsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0KLQkJCWRvCi0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+d2lkdGhfZW5kKTsKLQkJICAgICAgfQotCQkgICAgaGFzX3dpZHRoID0gMTsKLQkJICB9Ci0KLQkJaGFzX3ByZWNpc2lvbiA9IDA7Ci0JCXByZWNpc2lvbiA9IDA7Ci0JCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotCQkgIHsKLQkJICAgIGlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLQkJICAgICAgewotCQkJaW50IGFyZzsKLQotCQkJaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkJICBhYm9ydCAoKTsKLQkJCWFyZyA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OwotCQkJLyogIkEgbmVnYXRpdmUgcHJlY2lzaW9uIGlzIHRha2VuIGFzIGlmIHRoZSBwcmVjaXNpb24KLQkJCSAgICB3ZXJlIG9taXR0ZWQuIiAgKi8KLQkJCWlmIChhcmcgPj0gMCkKLQkJCSAgewotCQkJICAgIHByZWNpc2lvbiA9IGFyZzsKLQkJCSAgICBoYXNfcHJlY2lzaW9uID0gMTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT5wcmVjaXNpb25fc3RhcnQgKyAxOwotCi0JCQlwcmVjaXNpb24gPSAwOwotCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLQkJCSAgcHJlY2lzaW9uID0geHN1bSAoeHRpbWVzIChwcmVjaXNpb24sIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLQkJCWhhc19wcmVjaXNpb24gPSAxOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCXN3aXRjaCAodHlwZSkKLQkJICB7Ci0JCSAgY2FzZSBUWVBFX1U4X1NUUklORzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgdWludDhfdCAqYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3U4X3N0cmluZzsKLQkJICAgICAgY29uc3QgdWludDhfdCAqYXJnX2VuZDsKLQkJICAgICAgc2l6ZV90IGNoYXJhY3RlcnM7Ci0KLQkJICAgICAgaWYgKGhhc19wcmVjaXNpb24pCi0JCQl7Ci0JCQkgIC8qIFVzZSBvbmx5IFBSRUNJU0lPTiBjaGFyYWN0ZXJzLCBmcm9tIHRoZSBsZWZ0LiAgKi8KLQkJCSAgYXJnX2VuZCA9IGFyZzsKLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0JCQkgIGZvciAoOyBwcmVjaXNpb24gPiAwOyBwcmVjaXNpb24tLSkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgY291bnQgPSB1OF9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0JCQkJewotCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0JCQkJICBDTEVBTlVQICgpOwotCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0JCQkJICByZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotCQkJICAgICAgY2hhcmFjdGVycysrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoaGFzX3dpZHRoKQotCQkJewotCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mCi0JCQkgICAgIGNoYXJhY3RlcnMuICAqLwotCQkJICBhcmdfZW5kID0gYXJnOwotCQkJICBjaGFyYWN0ZXJzID0gMDsKLQkJCSAgZm9yICg7OykKLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgY291bnQgPSB1OF9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0JCQkJewotCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0JCQkJICBDTEVBTlVQICgpOwotCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0JCQkJICByZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotCQkJICAgICAgY2hhcmFjdGVycysrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcuICAqLwotCQkJICBhcmdfZW5kID0gYXJnICsgdThfc3RybGVuIChhcmcpOwotCQkJICAvKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZG9lc24ndCBtYXR0ZXIuICAqLwotCQkJICBjaGFyYWN0ZXJzID0gMDsKLQkJCX0KLQotCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotCQkJICAmJiAhKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0JCQl7Ci0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotCQkJICBsZW5ndGggKz0gbjsKLQkJCX0KLQotIyBpZiBEQ0hBUl9JU19VSU5UOF9UCi0JCSAgICAgIHsKLQkJCXNpemVfdCBuID0gYXJnX2VuZCAtIGFyZzsKLQkJCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLQkJCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBhcmcsIG4pOwotCQkJbGVuZ3RoICs9IG47Ci0JCSAgICAgIH0KLSMgZWxzZQotCQkgICAgICB7IC8qIENvbnZlcnQuICAqLwotCQkJRENIQVJfVCAqY29udmVydGVkID0gcmVzdWx0ICsgbGVuZ3RoOwotCQkJc2l6ZV90IGNvbnZlcnRlZF9sZW4gPSBhbGxvY2F0ZWQgLSBsZW5ndGg7Ci0jICBpZiBEQ0hBUl9JU19UQ0hBUgotCQkJLyogQ29udmVydCBmcm9tIFVURi04IHRvIGxvY2FsZSBlbmNvZGluZy4gICovCi0JCQlpZiAodThfY29udl90b19lbmNvZGluZyAobG9jYWxlX2NoYXJzZXQgKCksCi0JCQkJCQkgaWNvbnZlaF9xdWVzdGlvbl9tYXJrLAotCQkJCQkJIGFyZywgYXJnX2VuZCAtIGFyZywgTlVMTCwKLQkJCQkJCSAmY29udmVydGVkLCAmY29udmVydGVkX2xlbikKLQkJCSAgICA8IDApCi0jICBlbHNlCi0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTggdG8gVVRGLTE2L1VURi0zMi4gICovCi0JCQljb252ZXJ0ZWQgPQotCQkJICBVOF9UT19EQ0hBUiAoYXJnLCBhcmdfZW5kIC0gYXJnLAotCQkJCSAgICAgICBjb252ZXJ0ZWQsICZjb252ZXJ0ZWRfbGVuKTsKLQkJCWlmIChjb252ZXJ0ZWQgPT0gTlVMTCkKLSMgIGVuZGlmCi0JCQkgIHsKLQkJCSAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQkJCSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLQkJCSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0JCQkgICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLQkJCSAgICBDTEVBTlVQICgpOwotCQkJICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0JCQkgICAgcmV0dXJuIE5VTEw7Ci0JCQkgIH0KLQkJCWlmIChjb252ZXJ0ZWQgIT0gcmVzdWx0ICsgbGVuZ3RoKQotCQkJICB7Ci0JCQkgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY29udmVydGVkX2xlbikpOwotCQkJICAgIERDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCBjb252ZXJ0ZWQsIGNvbnZlcnRlZF9sZW4pOwotCQkJICAgIGZyZWUgKGNvbnZlcnRlZCk7Ci0JCQkgIH0KLQkJCWxlbmd0aCArPSBjb252ZXJ0ZWRfbGVuOwotCQkgICAgICB9Ci0jIGVuZGlmCi0KLQkJICAgICAgaWYgKGhhc193aWR0aCAmJiB3aWR0aCA+IGNoYXJhY3RlcnMKLQkJCSAgJiYgKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0JCQl7Ci0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotCQkJICBsZW5ndGggKz0gbjsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSBUWVBFX1UxNl9TVFJJTkc6Ci0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IHVpbnQxNl90ICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdTE2X3N0cmluZzsKLQkJICAgICAgY29uc3QgdWludDE2X3QgKmFyZ19lbmQ7Ci0JCSAgICAgIHNpemVfdCBjaGFyYWN0ZXJzOwotCi0JCSAgICAgIGlmIChoYXNfcHJlY2lzaW9uKQotCQkJewotCQkJICAvKiBVc2Ugb25seSBQUkVDSVNJT04gY2hhcmFjdGVycywgZnJvbSB0aGUgbGVmdC4gICovCi0JCQkgIGFyZ19lbmQgPSBhcmc7Ci0JCQkgIGNoYXJhY3RlcnMgPSAwOwotCQkJICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0JCQkgICAgewotCQkJICAgICAgaW50IGNvdW50ID0gdTE2X3N0cm1ibGVuIChhcmdfZW5kKTsKLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotCQkJCWJyZWFrOwotCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLQkJCQl7Ci0JCQkJICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLQkJCQkgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLQkJCQkgIENMRUFOVVAgKCk7Ci0JCQkJICBlcnJubyA9IEVJTFNFUTsKLQkJCQkgIHJldHVybiBOVUxMOwotCQkJCX0KLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0JCQkgICAgICBjaGFyYWN0ZXJzKys7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlIGlmIChoYXNfd2lkdGgpCi0JCQl7Ci0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZywgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJCSAgICAgY2hhcmFjdGVycy4gICovCi0JCQkgIGFyZ19lbmQgPSBhcmc7Ci0JCQkgIGNoYXJhY3RlcnMgPSAwOwotCQkJICBmb3IgKDs7KQotCQkJICAgIHsKLQkJCSAgICAgIGludCBjb3VudCA9IHUxNl9zdHJtYmxlbiAoYXJnX2VuZCk7Ci0JCQkgICAgICBpZiAoY291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCSAgICAgIGlmIChjb3VudCA8IDApCi0JCQkJewotCQkJCSAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0JCQkJICAgIGZyZWUgKHJlc3VsdCk7Ci0JCQkJICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0JCQkJICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0JCQkJICBDTEVBTlVQICgpOwotCQkJCSAgZXJybm8gPSBFSUxTRVE7Ci0JCQkJICByZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkgICAgICBhcmdfZW5kICs9IGNvdW50OwotCQkJICAgICAgY2hhcmFjdGVycysrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBVc2UgdGhlIGVudGlyZSBzdHJpbmcuICAqLwotCQkJICBhcmdfZW5kID0gYXJnICsgdTE2X3N0cmxlbiAoYXJnKTsKLQkJCSAgLyogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGRvZXNuJ3QgbWF0dGVyLiAgKi8KLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGhhc193aWR0aCAmJiB3aWR0aCA+IGNoYXJhY3RlcnMKLQkJCSAgJiYgIShkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotCQkJewotCQkJICBzaXplX3QgbiA9IHdpZHRoIC0gY2hhcmFjdGVyczsKLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLQkJCSAgbGVuZ3RoICs9IG47Ci0JCQl9Ci0KLSMgaWYgRENIQVJfSVNfVUlOVDE2X1QKLQkJICAgICAgewotCQkJc2l6ZV90IG4gPSBhcmdfZW5kIC0gYXJnOwotCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotCQkJRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGFyZywgbik7Ci0JCQlsZW5ndGggKz0gbjsKLQkJICAgICAgfQotIyBlbHNlCi0JCSAgICAgIHsgLyogQ29udmVydC4gICovCi0JCQlEQ0hBUl9UICpjb252ZXJ0ZWQgPSByZXN1bHQgKyBsZW5ndGg7Ci0JCQlzaXplX3QgY29udmVydGVkX2xlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKLSMgIGlmIERDSEFSX0lTX1RDSEFSCi0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTE2IHRvIGxvY2FsZSBlbmNvZGluZy4gICovCi0JCQlpZiAodTE2X2NvbnZfdG9fZW5jb2RpbmcgKGxvY2FsZV9jaGFyc2V0ICgpLAotCQkJCQkJICBpY29udmVoX3F1ZXN0aW9uX21hcmssCi0JCQkJCQkgIGFyZywgYXJnX2VuZCAtIGFyZywgTlVMTCwKLQkJCQkJCSAgJmNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pCi0JCQkgICAgPCAwKQotIyAgZWxzZQotCQkJLyogQ29udmVydCBmcm9tIFVURi0xNiB0byBVVEYtOC9VVEYtMzIuICAqLwotCQkJY29udmVydGVkID0KLQkJCSAgVTE2X1RPX0RDSEFSIChhcmcsIGFyZ19lbmQgLSBhcmcsCi0JCQkJCWNvbnZlcnRlZCwgJmNvbnZlcnRlZF9sZW4pOwotCQkJaWYgKGNvbnZlcnRlZCA9PSBOVUxMKQotIyAgZW5kaWYKLQkJCSAgewotCQkJICAgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotCQkJICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotCQkJICAgICAgZnJlZSAocmVzdWx0KTsKLQkJCSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0JCQkgICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotCQkJICAgIENMRUFOVVAgKCk7Ci0JCQkgICAgZXJybm8gPSBzYXZlZF9lcnJubzsKLQkJCSAgICByZXR1cm4gTlVMTDsKLQkJCSAgfQotCQkJaWYgKGNvbnZlcnRlZCAhPSByZXN1bHQgKyBsZW5ndGgpCi0JCQkgIHsKLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBjb252ZXJ0ZWRfbGVuKSk7Ci0JCQkgICAgRENIQVJfQ1BZIChyZXN1bHQgKyBsZW5ndGgsIGNvbnZlcnRlZCwgY29udmVydGVkX2xlbik7Ci0JCQkgICAgZnJlZSAoY29udmVydGVkKTsKLQkJCSAgfQotCQkJbGVuZ3RoICs9IGNvbnZlcnRlZF9sZW47Ci0JCSAgICAgIH0KLSMgZW5kaWYKLQotCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotCQkJICAmJiAoZHAtPmZsYWdzICYgRkxBR19MRUZUKSkKLQkJCXsKLQkJCSAgc2l6ZV90IG4gPSB3aWR0aCAtIGNoYXJhY3RlcnM7Ci0JCQkgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIG4pKTsKLQkJCSAgRENIQVJfU0VUIChyZXN1bHQgKyBsZW5ndGgsICcgJywgbik7Ci0JCQkgIGxlbmd0aCArPSBuOwotCQkJfQotCQkgICAgfQotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlIFRZUEVfVTMyX1NUUklORzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgdWludDMyX3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91MzJfc3RyaW5nOwotCQkgICAgICBjb25zdCB1aW50MzJfdCAqYXJnX2VuZDsKLQkJICAgICAgc2l6ZV90IGNoYXJhY3RlcnM7Ci0KLQkJICAgICAgaWYgKGhhc19wcmVjaXNpb24pCi0JCQl7Ci0JCQkgIC8qIFVzZSBvbmx5IFBSRUNJU0lPTiBjaGFyYWN0ZXJzLCBmcm9tIHRoZSBsZWZ0LiAgKi8KLQkJCSAgYXJnX2VuZCA9IGFyZzsKLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0JCQkgIGZvciAoOyBwcmVjaXNpb24gPiAwOyBwcmVjaXNpb24tLSkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgY291bnQgPSB1MzJfc3RybWJsZW4gKGFyZ19lbmQpOwotCQkJICAgICAgaWYgKGNvdW50ID09IDApCi0JCQkJYnJlYWs7Ci0JCQkgICAgICBpZiAoY291bnQgPCAwKQotCQkJCXsKLQkJCQkgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotCQkJCSAgICBmcmVlIChyZXN1bHQpOwotCQkJCSAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotCQkJCSAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotCQkJCSAgQ0xFQU5VUCAoKTsKLQkJCQkgIGVycm5vID0gRUlMU0VROwotCQkJCSAgcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJICAgICAgYXJnX2VuZCArPSBjb3VudDsKLQkJCSAgICAgIGNoYXJhY3RlcnMrKzsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKGhhc193aWR0aCkKLQkJCXsKLQkJCSAgLyogVXNlIHRoZSBlbnRpcmUgc3RyaW5nLCBhbmQgY291bnQgdGhlIG51bWJlciBvZgotCQkJICAgICBjaGFyYWN0ZXJzLiAgKi8KLQkJCSAgYXJnX2VuZCA9IGFyZzsKLQkJCSAgY2hhcmFjdGVycyA9IDA7Ci0JCQkgIGZvciAoOzspCi0JCQkgICAgewotCQkJICAgICAgaW50IGNvdW50ID0gdTMyX3N0cm1ibGVuIChhcmdfZW5kKTsKLQkJCSAgICAgIGlmIChjb3VudCA9PSAwKQotCQkJCWJyZWFrOwotCQkJICAgICAgaWYgKGNvdW50IDwgMCkKLQkJCQl7Ci0JCQkJICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLQkJCQkgICAgZnJlZSAocmVzdWx0KTsKLQkJCQkgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLQkJCQkgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLQkJCQkgIENMRUFOVVAgKCk7Ci0JCQkJICBlcnJubyA9IEVJTFNFUTsKLQkJCQkgIHJldHVybiBOVUxMOwotCQkJCX0KLQkJCSAgICAgIGFyZ19lbmQgKz0gY291bnQ7Ci0JCQkgICAgICBjaGFyYWN0ZXJzKys7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIFVzZSB0aGUgZW50aXJlIHN0cmluZy4gICovCi0JCQkgIGFyZ19lbmQgPSBhcmcgKyB1MzJfc3RybGVuIChhcmcpOwotCQkJICAvKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZG9lc24ndCBtYXR0ZXIuICAqLwotCQkJICBjaGFyYWN0ZXJzID0gMDsKLQkJCX0KLQotCQkgICAgICBpZiAoaGFzX3dpZHRoICYmIHdpZHRoID4gY2hhcmFjdGVycwotCQkJICAmJiAhKGRwLT5mbGFncyAmIEZMQUdfTEVGVCkpCi0JCQl7Ci0JCQkgIHNpemVfdCBuID0gd2lkdGggLSBjaGFyYWN0ZXJzOwotCQkJICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0JCQkgIERDSEFSX1NFVCAocmVzdWx0ICsgbGVuZ3RoLCAnICcsIG4pOwotCQkJICBsZW5ndGggKz0gbjsKLQkJCX0KLQotIyBpZiBEQ0hBUl9JU19VSU5UMzJfVAotCQkgICAgICB7Ci0JCQlzaXplX3QgbiA9IGFyZ19lbmQgLSBhcmc7Ci0JCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBuKSk7Ci0JCQlEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgYXJnLCBuKTsKLQkJCWxlbmd0aCArPSBuOwotCQkgICAgICB9Ci0jIGVsc2UKLQkJICAgICAgeyAvKiBDb252ZXJ0LiAgKi8KLQkJCURDSEFSX1QgKmNvbnZlcnRlZCA9IHJlc3VsdCArIGxlbmd0aDsKLQkJCXNpemVfdCBjb252ZXJ0ZWRfbGVuID0gYWxsb2NhdGVkIC0gbGVuZ3RoOwotIyAgaWYgRENIQVJfSVNfVENIQVIKLQkJCS8qIENvbnZlcnQgZnJvbSBVVEYtMzIgdG8gbG9jYWxlIGVuY29kaW5nLiAgKi8KLQkJCWlmICh1MzJfY29udl90b19lbmNvZGluZyAobG9jYWxlX2NoYXJzZXQgKCksCi0JCQkJCQkgIGljb252ZWhfcXVlc3Rpb25fbWFyaywKLQkJCQkJCSAgYXJnLCBhcmdfZW5kIC0gYXJnLCBOVUxMLAotCQkJCQkJICAmY29udmVydGVkLCAmY29udmVydGVkX2xlbikKLQkJCSAgICA8IDApCi0jICBlbHNlCi0JCQkvKiBDb252ZXJ0IGZyb20gVVRGLTMyIHRvIFVURi04L1VURi0xNi4gICovCi0JCQljb252ZXJ0ZWQgPQotCQkJICBVMzJfVE9fRENIQVIgKGFyZywgYXJnX2VuZCAtIGFyZywKLQkJCQkJY29udmVydGVkLCAmY29udmVydGVkX2xlbik7Ci0JCQlpZiAoY29udmVydGVkID09IE5VTEwpCi0jICBlbmRpZgotCQkJICB7Ci0JCQkgICAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0JCQkgICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0JCQkgICAgICBmcmVlIChyZXN1bHQpOwotCQkJICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLQkJCSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0JCQkgICAgQ0xFQU5VUCAoKTsKLQkJCSAgICBlcnJubyA9IHNhdmVkX2Vycm5vOwotCQkJICAgIHJldHVybiBOVUxMOwotCQkJICB9Ci0JCQlpZiAoY29udmVydGVkICE9IHJlc3VsdCArIGxlbmd0aCkKLQkJCSAgewotCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvbnZlcnRlZF9sZW4pKTsKLQkJCSAgICBEQ0hBUl9DUFkgKHJlc3VsdCArIGxlbmd0aCwgY29udmVydGVkLCBjb252ZXJ0ZWRfbGVuKTsKLQkJCSAgICBmcmVlIChjb252ZXJ0ZWQpOwotCQkJICB9Ci0JCQlsZW5ndGggKz0gY29udmVydGVkX2xlbjsKLQkJICAgICAgfQotIyBlbmRpZgotCi0JCSAgICAgIGlmIChoYXNfd2lkdGggJiYgd2lkdGggPiBjaGFyYWN0ZXJzCi0JCQkgICYmIChkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpKQotCQkJewotCQkJICBzaXplX3QgbiA9IHdpZHRoIC0gY2hhcmFjdGVyczsKLQkJCSAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgbikpOwotCQkJICBEQ0hBUl9TRVQgKHJlc3VsdCArIGxlbmd0aCwgJyAnLCBuKTsKLQkJCSAgbGVuZ3RoICs9IG47Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotI2VuZGlmCi0jaWYgKE5FRURfUFJJTlRGX0RJUkVDVElWRV9BIHx8IE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0RPVUJMRSkgJiYgIWRlZmluZWQgSU5fTElCSU5UTAotCSAgICBlbHNlIGlmICgoZHAtPmNvbnZlcnNpb24gPT0gJ2EnIHx8IGRwLT5jb252ZXJzaW9uID09ICdBJykKLSMgaWYgIShORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCAoTkVFRF9QUklOVEZfTE9OR19ET1VCTEUgJiYgTkVFRF9QUklOVEZfRE9VQkxFKSkKLQkJICAgICAmJiAoMAotIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0RPVUJMRQotIyAgZW5kaWYKLSMgIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0xPTkdET1VCTEUKLSMgIGVuZGlmCi0JCQkpCi0jIGVuZGlmCi0JCSAgICApCi0JICAgICAgewotCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKLQkJaW50IGZsYWdzID0gZHAtPmZsYWdzOwotCQlpbnQgaGFzX3dpZHRoOwotCQlzaXplX3Qgd2lkdGg7Ci0JCWludCBoYXNfcHJlY2lzaW9uOwotCQlzaXplX3QgcHJlY2lzaW9uOwotCQlzaXplX3QgdG1wX2xlbmd0aDsKLQkJRENIQVJfVCB0bXBidWZbNzAwXTsKLQkJRENIQVJfVCAqdG1wOwotCQlEQ0hBUl9UICpwYWRfcHRyOwotCQlEQ0hBUl9UICpwOwotCi0JCWhhc193aWR0aCA9IDA7Ci0JCXdpZHRoID0gMDsKLQkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQotCQkgIHsKLQkJICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQotCQkgICAgICB7Ci0JCQlpbnQgYXJnOwotCi0JCQlpZiAoIShhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLQkJCSAgYWJvcnQgKCk7Ci0JCQlhcmcgPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OwotCQkJaWYgKGFyZyA8IDApCi0JCQkgIHsKLQkJCSAgICAvKiAiQSBuZWdhdGl2ZSBmaWVsZCB3aWR0aCBpcyB0YWtlbiBhcyBhICctJyBmbGFnCi0JCQkgICAgICAgIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgZmllbGQgd2lkdGguIiAgKi8KLQkJCSAgICBmbGFncyB8PSBGTEFHX0xFRlQ7Ci0JCQkgICAgd2lkdGggPSAodW5zaWduZWQgaW50KSAoLWFyZyk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgd2lkdGggPSBhcmc7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPndpZHRoX3N0YXJ0OwotCi0JCQlkbwotCQkJICB3aWR0aCA9IHhzdW0gKHh0aW1lcyAod2lkdGgsIDEwKSwgKmRpZ2l0cCsrIC0gJzAnKTsKLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPndpZHRoX2VuZCk7Ci0JCSAgICAgIH0KLQkJICAgIGhhc193aWR0aCA9IDE7Ci0JCSAgfQotCi0JCWhhc19wcmVjaXNpb24gPSAwOwotCQlwcmVjaXNpb24gPSAwOwotCQlpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKLQkJICB7Ci0JCSAgICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCSAgICAgIHsKLQkJCWludCBhcmc7Ci0KLQkJCWlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKLQkJCSAgYWJvcnQgKCk7Ci0JCQlhcmcgPSBhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0uYS5hX2ludDsKLQkJCS8qICJBIG5lZ2F0aXZlIHByZWNpc2lvbiBpcyB0YWtlbiBhcyBpZiB0aGUgcHJlY2lzaW9uCi0JCQkgICAgd2VyZSBvbWl0dGVkLiIgICovCi0JCQlpZiAoYXJnID49IDApCi0JCQkgIHsKLQkJCSAgICBwcmVjaXNpb24gPSBhcmc7Ci0JCQkgICAgaGFzX3ByZWNpc2lvbiA9IDE7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKLQotCQkJcHJlY2lzaW9uID0gMDsKLQkJCXdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0JCQkgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0JCQloYXNfcHJlY2lzaW9uID0gMTsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplLiAgKi8KLQkJaWYgKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFKQotCQkgIHRtcF9sZW5ndGggPQotCQkgICAgKHVuc2lnbmVkIGludCkgKChMREJMX0RJRyArIDEpCi0JCQkJICAgICogMC44MzEgLyogZGVjaW1hbCAtPiBoZXhhZGVjaW1hbCAqLwotCQkJCSAgICkKLQkJICAgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJZWxzZQotCQkgIHRtcF9sZW5ndGggPQotCQkgICAgKHVuc2lnbmVkIGludCkgKChEQkxfRElHICsgMSkKLQkJCQkgICAgKiAwLjgzMSAvKiBkZWNpbWFsIC0+IGhleGFkZWNpbWFsICovCi0JCQkJICAgKQotCQkgICAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQlpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLQkJICB0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotCQkvKiBBY2NvdW50IGZvciBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLQkJdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEyKTsKLQotCQlpZiAodG1wX2xlbmd0aCA8IHdpZHRoKQotCQkgIHRtcF9sZW5ndGggPSB3aWR0aDsKLQotCQl0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7IC8qIGFjY291bnQgZm9yIHRyYWlsaW5nIE5VTCAqLwotCi0JCWlmICh0bXBfbGVuZ3RoIDw9IHNpemVvZiAodG1wYnVmKSAvIHNpemVvZiAoRENIQVJfVCkpCi0JCSAgdG1wID0gdG1wYnVmOwotCQllbHNlCi0JCSAgewotCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKERDSEFSX1QpKTsKLQotCQkgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAodG1wX21lbXNpemUpKQotCQkgICAgICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotCQkgICAgdG1wID0gKERDSEFSX1QgKikgbWFsbG9jICh0bXBfbWVtc2l6ZSk7Ci0JCSAgICBpZiAodG1wID09IE5VTEwpCi0JCSAgICAgIC8qIE91dCBvZiBtZW1vcnkuICAqLwotCQkgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0JCSAgfQotCi0JCXBhZF9wdHIgPSBOVUxMOwotCQlwID0gdG1wOwotCQlpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0JCSAgewotIyBpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotCQkgICAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7Ci0KLQkJICAgIGlmIChpc25hbmwgKGFyZykpCi0JCSAgICAgIHsKLQkJCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnQScpCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ04nOyAqcCsrID0gJ0EnOyAqcCsrID0gJ04nOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW50IHNpZ24gPSAwOwotCQkJREVDTF9MT05HX0RPVUJMRV9ST1VORElORwotCi0JCQlCRUdJTl9MT05HX0RPVUJMRV9ST1VORElORyAoKTsKLQotCQkJaWYgKHNpZ25iaXQgKGFyZykpIC8qIGFyZyA8IDAuMEwgb3IgbmVnYXRpdmUgemVybyAqLwotCQkJICB7Ci0JCQkgICAgc2lnbiA9IC0xOwotCQkJICAgIGFyZyA9IC1hcmc7Ci0JCQkgIH0KLQotCQkJaWYgKHNpZ24gPCAwKQotCQkJICAqcCsrID0gJy0nOwotCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NIT1dTSUdOKQotCQkJICAqcCsrID0gJysnOwotCQkJZWxzZSBpZiAoZmxhZ3MgJiBGTEFHX1NQQUNFKQotCQkJICAqcCsrID0gJyAnOwotCi0JCQlpZiAoYXJnID4gMC4wTCAmJiBhcmcgKyBhcmcgPT0gYXJnKQotCQkJICB7Ci0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ2knOyAqcCsrID0gJ24nOyAqcCsrID0gJ2YnOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbnQgZXhwb25lbnQ7Ci0JCQkgICAgbG9uZyBkb3VibGUgbWFudGlzc2E7Ci0KLQkJCSAgICBpZiAoYXJnID4gMC4wTCkKLQkJCSAgICAgIG1hbnRpc3NhID0gcHJpbnRmX2ZyZXhwbCAoYXJnLCAmZXhwb25lbnQpOwotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlleHBvbmVudCA9IDA7Ci0JCQkJbWFudGlzc2EgPSAwLjBMOwotCQkJICAgICAgfQotCi0JCQkgICAgaWYgKGhhc19wcmVjaXNpb24KLQkJCQkmJiBwcmVjaXNpb24gPCAodW5zaWduZWQgaW50KSAoKExEQkxfRElHICsgMSkgKiAwLjgzMSkgKyAxKQotCQkJICAgICAgewotCQkJCS8qIFJvdW5kIHRoZSBtYW50aXNzYS4gICovCi0JCQkJbG9uZyBkb3VibGUgdGFpbCA9IG1hbnRpc3NhOwotCQkJCXNpemVfdCBxOwotCi0JCQkJZm9yIChxID0gcHJlY2lzaW9uOyA7IHEtLSkKLQkJCQkgIHsKLQkJCQkgICAgaW50IGRpZ2l0ID0gKGludCkgdGFpbDsKLQkJCQkgICAgdGFpbCAtPSBkaWdpdDsKLQkJCQkgICAgaWYgKHEgPT0gMCkKLQkJCQkgICAgICB7Ci0JCQkJCWlmIChkaWdpdCAmIDEgPyB0YWlsID49IDAuNUwgOiB0YWlsID4gMC41TCkKLQkJCQkJICB0YWlsID0gMSAtIHRhaWw7Ci0JCQkJCWVsc2UKLQkJCQkJICB0YWlsID0gLSB0YWlsOwotCQkJCQlicmVhazsKLQkJCQkgICAgICB9Ci0JCQkJICAgIHRhaWwgKj0gMTYuMEw7Ci0JCQkJICB9Ci0JCQkJaWYgKHRhaWwgIT0gMC4wTCkKLQkJCQkgIGZvciAocSA9IHByZWNpc2lvbjsgcSA+IDA7IHEtLSkKLQkJCQkgICAgdGFpbCAqPSAwLjA2MjVMOwotCQkJCW1hbnRpc3NhICs9IHRhaWw7Ci0JCQkgICAgICB9Ci0KLQkJCSAgICAqcCsrID0gJzAnOwotCQkJICAgICpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdBJyArICdYJzsKLQkJCSAgICBwYWRfcHRyID0gcDsKLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgZGlnaXQ7Ci0KLQkJCSAgICAgIGRpZ2l0ID0gKGludCkgbWFudGlzc2E7Ci0JCQkgICAgICBtYW50aXNzYSAtPSBkaWdpdDsKLQkJCSAgICAgICpwKysgPSAnMCcgKyBkaWdpdDsKLQkJCSAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkKLQkJCQkgIHx8IG1hbnRpc3NhID4gMC4wTCB8fCBwcmVjaXNpb24gPiAwKQotCQkJCXsKLQkJCQkgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0JCQkJICAvKiBUaGlzIGxvb3AgdGVybWluYXRlcyBiZWNhdXNlIHdlIGFzc3VtZQotCQkJCSAgICAgdGhhdCBGTFRfUkFESVggaXMgYSBwb3dlciBvZiAyLiAgKi8KLQkJCQkgIHdoaWxlIChtYW50aXNzYSA+IDAuMEwpCi0JCQkJICAgIHsKLQkJCQkgICAgICBtYW50aXNzYSAqPSAxNi4wTDsKLQkJCQkgICAgICBkaWdpdCA9IChpbnQpIG1hbnRpc3NhOwotCQkJCSAgICAgIG1hbnRpc3NhIC09IGRpZ2l0OwotCQkJCSAgICAgICpwKysgPSBkaWdpdAotCQkJCQkgICAgICsgKGRpZ2l0IDwgMTAKLQkJCQkJCT8gJzAnCi0JCQkJCQk6IGRwLT5jb252ZXJzaW9uIC0gMTApOwotCQkJCSAgICAgIGlmIChwcmVjaXNpb24gPiAwKQotCQkJCQlwcmVjaXNpb24tLTsKLQkJCQkgICAgfQotCQkJCSAgd2hpbGUgKHByZWNpc2lvbiA+IDApCi0JCQkJICAgIHsKLQkJCQkgICAgICAqcCsrID0gJzAnOwotCQkJCSAgICAgIHByZWNpc2lvbi0tOwotCQkJCSAgICB9Ci0JCQkJfQotCQkJICAgICAgfQotCQkJICAgICAgKnArKyA9IGRwLT5jb252ZXJzaW9uIC0gJ0EnICsgJ1AnOwotIyAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLQkJCSAgICAgIHsKLQkJCQlzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLQkJCQkgIHsgJyUnLCAnKycsICdkJywgJ1wwJyB9OwotCQkJCVNOUFJJTlRGIChwLCA2ICsgMSwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotCQkJCXArKzsKLSMgIGVsc2UKLQkJCSAgICAgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0JCQkJewotCQkJCSAgc3ByaW50ZiAoKGNoYXIgKikgcCwgIiUrZCIsIGV4cG9uZW50KTsKLQkJCQkgIHdoaWxlICgqcCAhPSAnXDAnKQotCQkJCSAgICBwKys7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGNoYXIgZXhwYnVmWzYgKyAxXTsKLQkJCQkgIGNvbnN0IGNoYXIgKmVwOwotCQkJCSAgc3ByaW50ZiAoZXhwYnVmLCAiJStkIiwgZXhwb25lbnQpOwotCQkJCSAgZm9yIChlcCA9IGV4cGJ1ZjsgKCpwID0gKmVwKSAhPSAnXDAnOyBlcCsrKQotCQkJCSAgICBwKys7Ci0JCQkJfQotIyAgZW5kaWYKLQkJCSAgfQotCi0JCQlFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0JCSAgICAgIH0KLSMgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0jIGVuZGlmCi0JCSAgfQotCQllbHNlCi0JCSAgewotIyBpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfQSB8fCBORUVEX1BSSU5URl9ET1VCTEUKLQkJICAgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotCi0JCSAgICBpZiAoaXNuYW4gKGFyZykpCi0JCSAgICAgIHsKLQkJCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnQScpCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ04nOyAqcCsrID0gJ0EnOyAqcCsrID0gJ04nOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW50IHNpZ24gPSAwOwotCi0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wIG9yIG5lZ2F0aXZlIHplcm8gKi8KLQkJCSAgewotCQkJICAgIHNpZ24gPSAtMTsKLQkJCSAgICBhcmcgPSAtYXJnOwotCQkJICB9Ci0KLQkJCWlmIChzaWduIDwgMCkKLQkJCSAgKnArKyA9ICctJzsKLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLQkJCSAgKnArKyA9ICcrJzsKLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TUEFDRSkKLQkJCSAgKnArKyA9ICcgJzsKLQotCQkJaWYgKGFyZyA+IDAuMCAmJiBhcmcgKyBhcmcgPT0gYXJnKQotCQkJICB7Ci0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdBJykKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ2knOyAqcCsrID0gJ24nOyAqcCsrID0gJ2YnOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBpbnQgZXhwb25lbnQ7Ci0JCQkgICAgZG91YmxlIG1hbnRpc3NhOwotCi0JCQkgICAgaWYgKGFyZyA+IDAuMCkKLQkJCSAgICAgIG1hbnRpc3NhID0gcHJpbnRmX2ZyZXhwIChhcmcsICZleHBvbmVudCk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgewotCQkJCWV4cG9uZW50ID0gMDsKLQkJCQltYW50aXNzYSA9IDAuMDsKLQkJCSAgICAgIH0KLQotCQkJICAgIGlmIChoYXNfcHJlY2lzaW9uCi0JCQkJJiYgcHJlY2lzaW9uIDwgKHVuc2lnbmVkIGludCkgKChEQkxfRElHICsgMSkgKiAwLjgzMSkgKyAxKQotCQkJICAgICAgewotCQkJCS8qIFJvdW5kIHRoZSBtYW50aXNzYS4gICovCi0JCQkJZG91YmxlIHRhaWwgPSBtYW50aXNzYTsKLQkJCQlzaXplX3QgcTsKLQotCQkJCWZvciAocSA9IHByZWNpc2lvbjsgOyBxLS0pCi0JCQkJICB7Ci0JCQkJICAgIGludCBkaWdpdCA9IChpbnQpIHRhaWw7Ci0JCQkJICAgIHRhaWwgLT0gZGlnaXQ7Ci0JCQkJICAgIGlmIChxID09IDApCi0JCQkJICAgICAgewotCQkJCQlpZiAoZGlnaXQgJiAxID8gdGFpbCA+PSAwLjUgOiB0YWlsID4gMC41KQotCQkJCQkgIHRhaWwgPSAxIC0gdGFpbDsKLQkJCQkJZWxzZQotCQkJCQkgIHRhaWwgPSAtIHRhaWw7Ci0JCQkJCWJyZWFrOwotCQkJCSAgICAgIH0KLQkJCQkgICAgdGFpbCAqPSAxNi4wOwotCQkJCSAgfQotCQkJCWlmICh0YWlsICE9IDAuMCkKLQkJCQkgIGZvciAocSA9IHByZWNpc2lvbjsgcSA+IDA7IHEtLSkKLQkJCQkgICAgdGFpbCAqPSAwLjA2MjU7Ci0JCQkJbWFudGlzc2EgKz0gdGFpbDsKLQkJCSAgICAgIH0KLQotCQkJICAgICpwKysgPSAnMCc7Ci0JCQkgICAgKnArKyA9IGRwLT5jb252ZXJzaW9uIC0gJ0EnICsgJ1gnOwotCQkJICAgIHBhZF9wdHIgPSBwOwotCQkJICAgIHsKLQkJCSAgICAgIGludCBkaWdpdDsKLQotCQkJICAgICAgZGlnaXQgPSAoaW50KSBtYW50aXNzYTsKLQkJCSAgICAgIG1hbnRpc3NhIC09IGRpZ2l0OwotCQkJICAgICAgKnArKyA9ICcwJyArIGRpZ2l0OwotCQkJICAgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKQotCQkJCSAgfHwgbWFudGlzc2EgPiAwLjAgfHwgcHJlY2lzaW9uID4gMCkKLQkJCQl7Ci0JCQkJICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCSAgLyogVGhpcyBsb29wIHRlcm1pbmF0ZXMgYmVjYXVzZSB3ZSBhc3N1bWUKLQkJCQkgICAgIHRoYXQgRkxUX1JBRElYIGlzIGEgcG93ZXIgb2YgMi4gICovCi0JCQkJICB3aGlsZSAobWFudGlzc2EgPiAwLjApCi0JCQkJICAgIHsKLQkJCQkgICAgICBtYW50aXNzYSAqPSAxNi4wOwotCQkJCSAgICAgIGRpZ2l0ID0gKGludCkgbWFudGlzc2E7Ci0JCQkJICAgICAgbWFudGlzc2EgLT0gZGlnaXQ7Ci0JCQkJICAgICAgKnArKyA9IGRpZ2l0Ci0JCQkJCSAgICAgKyAoZGlnaXQgPCAxMAotCQkJCQkJPyAnMCcKLQkJCQkJCTogZHAtPmNvbnZlcnNpb24gLSAxMCk7Ci0JCQkJICAgICAgaWYgKHByZWNpc2lvbiA+IDApCi0JCQkJCXByZWNpc2lvbi0tOwotCQkJCSAgICB9Ci0JCQkJICB3aGlsZSAocHJlY2lzaW9uID4gMCkKLQkJCQkgICAgewotCQkJCSAgICAgICpwKysgPSAnMCc7Ci0JCQkJICAgICAgcHJlY2lzaW9uLS07Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQkgICAgICB9Ci0JCQkgICAgICAqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnQScgKyAnUCc7Ci0jICBpZiBXSURFX0NIQVJfVkVSU0lPTgotCQkJICAgICAgewotCQkJCXN0YXRpYyBjb25zdCB3Y2hhcl90IGRlY2ltYWxfZm9ybWF0W10gPQotCQkJCSAgeyAnJScsICcrJywgJ2QnLCAnXDAnIH07Ci0JCQkJU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotCQkJICAgICAgfQotCQkJICAgICAgd2hpbGUgKCpwICE9ICdcMCcpCi0JCQkJcCsrOwotIyAgZWxzZQotCQkJICAgICAgaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLQkJCQl7Ci0JCQkJICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJStkIiwgZXhwb25lbnQpOwotCQkJCSAgd2hpbGUgKCpwICE9ICdcMCcpCi0JCQkJICAgIHArKzsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgY2hhciBleHBidWZbNiArIDFdOwotCQkJCSAgY29uc3QgY2hhciAqZXA7Ci0JCQkJICBzcHJpbnRmIChleHBidWYsICIlK2QiLCBleHBvbmVudCk7Ci0JCQkJICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0JCQkJICAgIHArKzsKLQkJCQl9Ci0jICBlbmRpZgotCQkJICB9Ci0JCSAgICAgIH0KLSMgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0jIGVuZGlmCi0JCSAgfQotCQkvKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBub3cgZXh0ZW5kcyBmcm9tIHRtcCB0byBwLCB3aXRoIHRoZQotCQkgICB6ZXJvIHBhZGRpbmcgaW5zZXJ0aW9uIHBvaW50IGJlaW5nIGF0IHBhZF9wdHIuICAqLwotCQlpZiAoaGFzX3dpZHRoICYmIHAgLSB0bXAgPCB3aWR0aCkKLQkJICB7Ci0JCSAgICBzaXplX3QgcGFkID0gd2lkdGggLSAocCAtIHRtcCk7Ci0JCSAgICBEQ0hBUl9UICplbmQgPSBwICsgcGFkOwotCi0JCSAgICBpZiAoZmxhZ3MgJiBGTEFHX0xFRlQpCi0JCSAgICAgIHsKLQkJCS8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgcmlnaHQuICAqLwotCQkJZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotCQkJICAqcCsrID0gJyAnOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1pFUk8pICYmIHBhZF9wdHIgIT0gTlVMTCkKLQkJICAgICAgewotCQkJLyogUGFkIHdpdGggemVyb2VzLiAgKi8KLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0KLQkJCXdoaWxlIChwID4gcGFkX3B0cikKLQkJCSAgKi0tcSA9ICotLXA7Ci0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0JCQkgICpwKysgPSAnMCc7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogUGFkIHdpdGggc3BhY2VzIG9uIHRoZSBsZWZ0LiAgKi8KLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0KLQkJCXdoaWxlIChwID4gdG1wKQotCQkJICAqLS1xID0gKi0tcDsKLQkJCWZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLQkJCSAgKnArKyA9ICcgJzsKLQkJICAgICAgfQotCi0JCSAgICBwID0gZW5kOwotCQkgIH0KLQotCQl7Ci0JCSAgc2l6ZV90IGNvdW50ID0gcCAtIHRtcDsKLQotCQkgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQotCQkgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKLQkJICAgICAgIGNvZGUgYWJvdmUhICAqLwotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLwotCQkgIGlmIChjb3VudCA+PSBhbGxvY2F0ZWQgLSBsZW5ndGgpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBuID0geHN1bSAobGVuZ3RoLCBjb3VudCk7Ci0KLQkJICAgICAgRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotCQkgICAgfQotCi0JCSAgLyogQXBwZW5kIHRoZSByZXN1bHQuICAqLwotCQkgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCB0bXAsIGNvdW50ICogc2l6ZW9mIChEQ0hBUl9UKSk7Ci0JCSAgaWYgKHRtcCAhPSB0bXBidWYpCi0JCSAgICBmcmVlICh0bXApOwotCQkgIGxlbmd0aCArPSBjb3VudDsKLQkJfQotCSAgICAgIH0KLSNlbmRpZgotI2lmIChORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUgfHwgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0xPTkdfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFKSAmJiAhZGVmaW5lZCBJTl9MSUJJTlRMCi0JICAgIGVsc2UgaWYgKChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnCi0JCSAgICAgIHx8IGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScKLQkJICAgICAgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ2cnIHx8IGRwLT5jb252ZXJzaW9uID09ICdHJwotCQkgICAgICB8fCBkcC0+Y29udmVyc2lvbiA9PSAnYScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0EnKQotCQkgICAgICYmICgwCi0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRQotCQkJIHx8IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9ET1VCTEUKLSMgZWxpZiBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUKLQkJCSB8fCAoYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0RPVUJMRQotCQkJICAgICAvKiBUaGUgc3lzdGVtcyAobWluZ3cpIHdoaWNoIHByb2R1Y2Ugd3Jvbmcgb3V0cHV0Ci0JCQkJZm9yIEluZiwgLUluZiwgYW5kIE5hTiBhbHNvIGRvIHNvIGZvciAtMC4wLgotCQkJCVRoZXJlZm9yZSB3ZSB0cmVhdCB0aGlzIGNhc2UgaGVyZSBhcyB3ZWxsLiAgKi8KLQkJCSAgICAgJiYgaXNfaW5maW5pdGVfb3JfemVybyAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZSkpCi0jIGVuZGlmCi0jIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0JCQkgfHwgYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZSA9PSBUWVBFX0xPTkdET1VCTEUKLSMgZWxpZiBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRQotCQkJIHx8IChhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlID09IFRZUEVfTE9OR0RPVUJMRQotCQkJICAgICAvKiBTb21lIHN5c3RlbXMgcHJvZHVjZSB3cm9uZyBvdXRwdXQgZm9yIEluZiwKLQkJCQktSW5mLCBhbmQgTmFOLiAgKi8KLQkJCSAgICAgJiYgaXNfaW5maW5pdGVsIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2RvdWJsZSkpCi0jIGVuZGlmCi0JCQkpKQotCSAgICAgIHsKLSMgaWYgKE5FRURfUFJJTlRGX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9ET1VCTEUpICYmIChORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRSkKLQkJYXJnX3R5cGUgdHlwZSA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGU7Ci0jIGVuZGlmCi0JCWludCBmbGFncyA9IGRwLT5mbGFnczsKLQkJaW50IGhhc193aWR0aDsKLQkJc2l6ZV90IHdpZHRoOwotCQlpbnQgaGFzX3ByZWNpc2lvbjsKLQkJc2l6ZV90IHByZWNpc2lvbjsKLQkJc2l6ZV90IHRtcF9sZW5ndGg7Ci0JCURDSEFSX1QgdG1wYnVmWzcwMF07Ci0JCURDSEFSX1QgKnRtcDsKLQkJRENIQVJfVCAqcGFkX3B0cjsKLQkJRENIQVJfVCAqcDsKLQotCQloYXNfd2lkdGggPSAwOwotCQl3aWR0aCA9IDA7Ci0JCWlmIChkcC0+d2lkdGhfc3RhcnQgIT0gZHAtPndpZHRoX2VuZCkKLQkJICB7Ci0JCSAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKLQkJICAgICAgewotCQkJaW50IGFyZzsKLQotCQkJaWYgKCEoYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0JCQkgIGFib3J0ICgpOwotCQkJYXJnID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKLQkJCWlmIChhcmcgPCAwKQotCQkJICB7Ci0JCQkgICAgLyogIkEgbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdGFrZW4gYXMgYSAnLScgZmxhZwotCQkJICAgICAgICBmb2xsb3dlZCBieSBhIHBvc2l0aXZlIGZpZWxkIHdpZHRoLiIgICovCi0JCQkgICAgZmxhZ3MgfD0gRkxBR19MRUZUOwotCQkJICAgIHdpZHRoID0gKHVuc2lnbmVkIGludCkgKC1hcmcpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHdpZHRoID0gYXJnOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWNvbnN0IEZDSEFSX1QgKmRpZ2l0cCA9IGRwLT53aWR0aF9zdGFydDsKLQotCQkJZG8KLQkJCSAgd2lkdGggPSB4c3VtICh4dGltZXMgKHdpZHRoLCAxMCksICpkaWdpdHArKyAtICcwJyk7Ci0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOwotCQkgICAgICB9Ci0JCSAgICBoYXNfd2lkdGggPSAxOwotCQkgIH0KLQotCQloYXNfcHJlY2lzaW9uID0gMDsKLQkJcHJlY2lzaW9uID0gMDsKLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0JCSAgewotCQkgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotCQkgICAgICB7Ci0JCQlpbnQgYXJnOwotCi0JCQlpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0JCQkgIGFib3J0ICgpOwotCQkJYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQkvKiAiQSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgaWYgdGhlIHByZWNpc2lvbgotCQkJICAgIHdlcmUgb21pdHRlZC4iICAqLwotCQkJaWYgKGFyZyA+PSAwKQotCQkJICB7Ci0JCQkgICAgcHJlY2lzaW9uID0gYXJnOwotCQkJICAgIGhhc19wcmVjaXNpb24gPSAxOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7Ci0KLQkJCXByZWNpc2lvbiA9IDA7Ci0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKQotCQkJICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotCQkJaGFzX3ByZWNpc2lvbiA9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkJLyogUE9TSVggc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHByZWNpc2lvbiB0byBiZSA2IGZvciAlZiwgJUYsCi0JCSAgICVlLCAlRSwgYnV0IG5vdCBmb3IgJWcsICVHLiAgSW1wbGVtZW50YXRpb25zIGFwcGVhciB0byB1c2UKLQkJICAgdGhlIHNhbWUgZGVmYXVsdCBwcmVjaXNpb24gYWxzbyBmb3IgJWcsICVHLiAgKi8KLQkJaWYgKCFoYXNfcHJlY2lzaW9uKQotCQkgIHByZWNpc2lvbiA9IDY7Ci0KLQkJLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZS4gICovCi0jIGlmIE5FRURfUFJJTlRGX0RPVUJMRSAmJiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotCQl0bXBfbGVuZ3RoID0gKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFID8gTERCTF9ESUcgKyAxIDogREJMX0RJRyArIDEpOwotIyBlbGlmIE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRSAmJiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotCQl0bXBfbGVuZ3RoID0gKHR5cGUgPT0gVFlQRV9MT05HRE9VQkxFID8gTERCTF9ESUcgKyAxIDogMCk7Ci0jIGVsaWYgTkVFRF9QUklOVEZfTE9OR19ET1VCTEUKLQkJdG1wX2xlbmd0aCA9IExEQkxfRElHICsgMTsKLSMgZWxpZiBORUVEX1BSSU5URl9ET1VCTEUKLQkJdG1wX2xlbmd0aCA9IERCTF9ESUcgKyAxOwotIyBlbHNlCi0JCXRtcF9sZW5ndGggPSAwOwotIyBlbmRpZgotCQlpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLQkJICB0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRQotIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRQotCQlpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0jICBlbmRpZgotCQkgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotCQkgICAgewotCQkgICAgICBsb25nIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2RvdWJsZTsKLQkJICAgICAgaWYgKCEoaXNuYW5sIChhcmcpIHx8IGFyZyArIGFyZyA9PSBhcmcpKQotCQkJewotCQkJICAvKiBhcmcgaXMgZmluaXRlIGFuZCBub256ZXJvLiAgKi8KLQkJCSAgaW50IGV4cG9uZW50ID0gZmxvb3Jsb2cxMGwgKGFyZyA8IDAgPyAtYXJnIDogYXJnKTsKLQkJCSAgaWYgKGV4cG9uZW50ID49IDAgJiYgdG1wX2xlbmd0aCA8IGV4cG9uZW50ICsgcHJlY2lzaW9uKQotCQkJICAgIHRtcF9sZW5ndGggPSBleHBvbmVudCArIHByZWNpc2lvbjsKLQkJCX0KLQkJICAgIH0KLSMgZW5kaWYKLSMgaWYgTkVFRF9QUklOVEZfRE9VQkxFCi0jICBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRQotCQlpZiAodHlwZSA9PSBUWVBFX0RPVUJMRSkKLSMgIGVuZGlmCi0JCSAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdmJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRicpCi0JCSAgICB7Ci0JCSAgICAgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotCQkgICAgICBpZiAoIShpc25hbiAoYXJnKSB8fCBhcmcgKyBhcmcgPT0gYXJnKSkKLQkJCXsKLQkJCSAgLyogYXJnIGlzIGZpbml0ZSBhbmQgbm9uemVyby4gICovCi0JCQkgIGludCBleHBvbmVudCA9IGZsb29ybG9nMTAgKGFyZyA8IDAgPyAtYXJnIDogYXJnKTsKLQkJCSAgaWYgKGV4cG9uZW50ID49IDAgJiYgdG1wX2xlbmd0aCA8IGV4cG9uZW50ICsgcHJlY2lzaW9uKQotCQkJICAgIHRtcF9sZW5ndGggPSBleHBvbmVudCArIHByZWNpc2lvbjsKLQkJCX0KLQkJICAgIH0KLSMgZW5kaWYKLQkJLyogQWNjb3VudCBmb3Igc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCi0JCXRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxMik7Ci0KLQkJaWYgKHRtcF9sZW5ndGggPCB3aWR0aCkKLQkJICB0bXBfbGVuZ3RoID0gd2lkdGg7Ci0KLQkJdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEpOyAvKiBhY2NvdW50IGZvciB0cmFpbGluZyBOVUwgKi8KLQotCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKERDSEFSX1QpKQotCQkgIHRtcCA9IHRtcGJ1ZjsKLQkJZWxzZQotCQkgIHsKLQkJICAgIHNpemVfdCB0bXBfbWVtc2l6ZSA9IHh0aW1lcyAodG1wX2xlbmd0aCwgc2l6ZW9mIChEQ0hBUl9UKSk7Ci0KLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLQkJICAgICAgLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCi0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLQkJICAgIHRtcCA9IChEQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOwotCQkgICAgaWYgKHRtcCA9PSBOVUxMKQotCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotCQkgIH0KLQotCQlwYWRfcHRyID0gTlVMTDsKLQkJcCA9IHRtcDsKLQotIyBpZiBORUVEX1BSSU5URl9MT05HX0RPVUJMRSB8fCBORUVEX1BSSU5URl9JTkZJTklURV9MT05HX0RPVUJMRQotIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRQotCQlpZiAodHlwZSA9PSBUWVBFX0xPTkdET1VCTEUpCi0jICBlbmRpZgotCQkgIHsKLQkJICAgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotCi0JCSAgICBpZiAoaXNuYW5sIChhcmcpKQotCQkgICAgICB7Ci0JCQlpZiAoZHAtPmNvbnZlcnNpb24gPj0gJ0EnICYmIGRwLT5jb252ZXJzaW9uIDw9ICdaJykKLQkJCSAgewotCQkJICAgICpwKysgPSAnTic7ICpwKysgPSAnQSc7ICpwKysgPSAnTic7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgICpwKysgPSAnbic7ICpwKysgPSAnYSc7ICpwKysgPSAnbic7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlpbnQgc2lnbiA9IDA7Ci0JCQlERUNMX0xPTkdfRE9VQkxFX1JPVU5ESU5HCi0KLQkJCUJFR0lOX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotCi0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wTCBvciBuZWdhdGl2ZSB6ZXJvICovCi0JCQkgIHsKLQkJCSAgICBzaWduID0gLTE7Ci0JCQkgICAgYXJnID0gLWFyZzsKLQkJCSAgfQotCi0JCQlpZiAoc2lnbiA8IDApCi0JCQkgICpwKysgPSAnLSc7Ci0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU0hPV1NJR04pCi0JCQkgICpwKysgPSAnKyc7Ci0JCQllbHNlIGlmIChmbGFncyAmIEZMQUdfU1BBQ0UpCi0JCQkgICpwKysgPSAnICc7Ci0KLQkJCWlmIChhcmcgPiAwLjBMICYmIGFyZyArIGFyZyA9PSBhcmcpCi0JCQkgIHsKLQkJCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPj0gJ0EnICYmIGRwLT5jb252ZXJzaW9uIDw9ICdaJykKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ0knOyAqcCsrID0gJ04nOyAqcCsrID0gJ0YnOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQkqcCsrID0gJ2knOyAqcCsrID0gJ24nOyAqcCsrID0gJ2YnOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLSMgIGlmIE5FRURfUFJJTlRGX0xPTkdfRE9VQkxFCi0JCQkgICAgcGFkX3B0ciA9IHA7Ci0KLQkJCSAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2YnIHx8IGRwLT5jb252ZXJzaW9uID09ICdGJykKLQkJCSAgICAgIHsKLQkJCQljaGFyICpkaWdpdHM7Ci0JCQkJc2l6ZV90IG5kaWdpdHM7Ci0KLQkJCQlkaWdpdHMgPQotCQkJCSAgc2NhbGUxMF9yb3VuZF9kZWNpbWFsX2xvbmdfZG91YmxlIChhcmcsIHByZWNpc2lvbik7Ci0JCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotCQkJCSAgewotCQkJCSAgICBFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0JCQkJICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLQkJCQkgIH0KLQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotCi0JCQkJaWYgKG5kaWdpdHMgPiBwcmVjaXNpb24pCi0JCQkJICBkbwotCQkJCSAgICB7Ci0JCQkJICAgICAgLS1uZGlnaXRzOwotCQkJCSAgICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJICAgIH0KLQkJCQkgIHdoaWxlIChuZGlnaXRzID4gcHJlY2lzaW9uKTsKLQkJCQllbHNlCi0JCQkJICAqcCsrID0gJzAnOwotCQkJCS8qIEhlcmUgbmRpZ2l0cyA8PSBwcmVjaXNpb24uICAqLwotCQkJCWlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLQkJCQkgIHsKLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkgICAgZm9yICg7IHByZWNpc2lvbiA+IG5kaWdpdHM7IHByZWNpc2lvbi0tKQotCQkJCSAgICAgICpwKysgPSAnMCc7Ci0JCQkJICAgIHdoaWxlIChuZGlnaXRzID4gMCkKLQkJCQkgICAgICB7Ci0JCQkJCS0tbmRpZ2l0czsKLQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLQkJCQkgICAgICB9Ci0JCQkJICB9Ci0KLQkJCQlmcmVlIChkaWdpdHMpOwotCQkJICAgICAgfQotCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdlJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRScpCi0JCQkgICAgICB7Ci0JCQkJaW50IGV4cG9uZW50OwotCi0JCQkJaWYgKGFyZyA9PSAwLjBMKQotCQkJCSAgewotCQkJCSAgICBleHBvbmVudCA9IDA7Ci0JCQkJICAgICpwKysgPSAnMCc7Ci0JCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgcHJlY2lzaW9uID4gMCkKLQkJCQkgICAgICB7Ci0JCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0JCQkJCWZvciAoOyBwcmVjaXNpb24gPiAwOyBwcmVjaXNpb24tLSkKLQkJCQkJICAqcCsrID0gJzAnOwotCQkJCSAgICAgIH0KLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIC8qIGFyZyA+IDAuMEwuICAqLwotCQkJCSAgICBpbnQgYWRqdXN0ZWQ7Ci0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLQkJCQkgICAgc2l6ZV90IG5kaWdpdHM7Ci0KLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwbCAoYXJnKTsKLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotCQkJCSAgICBmb3IgKDs7KQotCQkJCSAgICAgIHsKLQkJCQkJZGlnaXRzID0KLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfbG9uZ19kb3VibGUgKGFyZywKLQkJCQkJCQkJCSAgICAgKGludClwcmVjaXNpb24gLSBleHBvbmVudCk7Ci0JCQkJCWlmIChkaWdpdHMgPT0gTlVMTCkKLQkJCQkJICB7Ci0JCQkJCSAgICBFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0JCQkJCSAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0JCQkJCSAgfQotCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotCi0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbiArIDEpCi0JCQkJCSAgYnJlYWs7Ci0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uCi0JCQkJCSAgICB8fCBuZGlnaXRzID4gcHJlY2lzaW9uICsgMikKLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWlmIChhZGp1c3RlZCkKLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLQkJCQkJICAgICB0aGUgcmlnaHQgb25lLiAgUHJldmVudCBhbiBlbmRsZXNzCi0JCQkJCSAgICAgbG9vcC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWZyZWUgKGRpZ2l0cyk7Ci0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLQkJCQkJICBleHBvbmVudCAtPSAxOwotCQkJCQllbHNlCi0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLQkJCQkJYWRqdXN0ZWQgPSAxOwotCQkJCSAgICAgIH0KLQotCQkJCSAgICAvKiBIZXJlIG5kaWdpdHMgPSBwcmVjaXNpb24rMS4gICovCi0JCQkJICAgICpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotCQkJCSAgICAgIHsKLQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiAwKQotCQkJCQkgIHsKLQkJCQkJICAgIC0tbmRpZ2l0czsKLQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJCSAgfQotCQkJCSAgICAgIH0KLQotCQkJCSAgICBmcmVlIChkaWdpdHMpOwotCQkJCSAgfQotCi0JCQkJKnArKyA9IGRwLT5jb252ZXJzaW9uOyAvKiAnZScgb3IgJ0UnICovCi0jICAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLQkJCQl7Ci0JCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMicsICdkJywgJ1wwJyB9OwotCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotCQkJCX0KLQkJCQl3aGlsZSAoKnAgIT0gJ1wwJykKLQkJCQkgIHArKzsKLSMgICBlbHNlCi0JCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLQkJCQkgIHsKLQkJCQkgICAgc3ByaW50ZiAoKGNoYXIgKikgcCwgIiUrLjJkIiwgZXhwb25lbnQpOwotCQkJCSAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLQkJCQkgICAgICBwKys7Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICBjaGFyIGV4cGJ1Zls2ICsgMV07Ci0JCQkJICAgIGNvbnN0IGNoYXIgKmVwOwotCQkJCSAgICBzcHJpbnRmIChleHBidWYsICIlKy4yZCIsIGV4cG9uZW50KTsKLQkJCQkgICAgZm9yIChlcCA9IGV4cGJ1ZjsgKCpwID0gKmVwKSAhPSAnXDAnOyBlcCsrKQotCQkJCSAgICAgIHArKzsKLQkJCQkgIH0KLSMgICBlbmRpZgotCQkJICAgICAgfQotCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycpCi0JCQkgICAgICB7Ci0JCQkJaWYgKHByZWNpc2lvbiA9PSAwKQotCQkJCSAgcHJlY2lzaW9uID0gMTsKLQkJCQkvKiBwcmVjaXNpb24gPj0gMS4gICovCi0KLQkJCQlpZiAoYXJnID09IDAuMEwpCi0JCQkJICAvKiBUaGUgZXhwb25lbnQgaXMgMCwgPj0gLTQsIDwgcHJlY2lzaW9uLgotCQkJCSAgICAgVXNlIGZpeGVkLXBvaW50IG5vdGF0aW9uLiAgKi8KLQkJCQkgIHsKLQkJCQkgICAgc2l6ZV90IG5kaWdpdHMgPSBwcmVjaXNpb247Ci0JCQkJICAgIC8qIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvZXMgdGhhdCBoYXZlIHRvIGJlCi0JCQkJICAgICAgIGRyb3BwZWQuICAqLwotCQkJCSAgICBzaXplX3Qgbnplcm9lcyA9Ci0JCQkJICAgICAgKGZsYWdzICYgRkxBR19BTFQgPyAwIDogcHJlY2lzaW9uIC0gMSk7Ci0KLQkJCQkgICAgLS1uZGlnaXRzOwotCQkJCSAgICAqcCsrID0gJzAnOwotCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCSAgICAgIHsKLQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCQkgIHsKLQkJCQkJICAgIC0tbmRpZ2l0czsKLQkJCQkJICAgICpwKysgPSAnMCc7Ci0JCQkJCSAgfQotCQkJCSAgICAgIH0KLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIC8qIGFyZyA+IDAuMEwuICAqLwotCQkJCSAgICBpbnQgZXhwb25lbnQ7Ci0JCQkJICAgIGludCBhZGp1c3RlZDsKLQkJCQkgICAgY2hhciAqZGlnaXRzOwotCQkJCSAgICBzaXplX3QgbmRpZ2l0czsKLQkJCQkgICAgc2l6ZV90IG56ZXJvZXM7Ci0KLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwbCAoYXJnKTsKLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotCQkJCSAgICBmb3IgKDs7KQotCQkJCSAgICAgIHsKLQkJCQkJZGlnaXRzID0KLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfbG9uZ19kb3VibGUgKGFyZywKLQkJCQkJCQkJCSAgICAgKGludCkocHJlY2lzaW9uIC0gMSkgLSBleHBvbmVudCk7Ci0JCQkJCWlmIChkaWdpdHMgPT0gTlVMTCkKLQkJCQkJICB7Ci0JCQkJCSAgICBFTkRfTE9OR19ET1VCTEVfUk9VTkRJTkcgKCk7Ci0JCQkJCSAgICBnb3RvIG91dF9vZl9tZW1vcnk7Ci0JCQkJCSAgfQotCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotCi0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLQkJCQkJICBicmVhazsKLQkJCQkJaWYgKG5kaWdpdHMgPCBwcmVjaXNpb24gLSAxCi0JCQkJCSAgICB8fCBuZGlnaXRzID4gcHJlY2lzaW9uICsgMSkKLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWlmIChhZGp1c3RlZCkKLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLQkJCQkJICAgICB0aGUgcmlnaHQgb25lLiAgUHJldmVudCBhbiBlbmRsZXNzCi0JCQkJCSAgICAgbG9vcC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWZyZWUgKGRpZ2l0cyk7Ci0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uKQotCQkJCQkgIGV4cG9uZW50IC09IDE7Ci0JCQkJCWVsc2UKLQkJCQkJICBleHBvbmVudCArPSAxOwotCQkJCQlhZGp1c3RlZCA9IDE7Ci0JCQkJICAgICAgfQotCQkJCSAgICAvKiBIZXJlIG5kaWdpdHMgPSBwcmVjaXNpb24uICAqLwotCi0JCQkJICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9lcwotCQkJCSAgICAgICB0aGF0IGhhdmUgdG8gYmUgZHJvcHBlZC4gICovCi0JCQkJICAgIG56ZXJvZXMgPSAwOwotCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpID09IDApCi0JCQkJICAgICAgd2hpbGUgKG56ZXJvZXMgPCBuZGlnaXRzCi0JCQkJCSAgICAgJiYgZGlnaXRzW256ZXJvZXNdID09ICcwJykKLQkJCQkJbnplcm9lcysrOwotCi0JCQkJICAgIC8qIFRoZSBleHBvbmVudCBpcyBub3cgZGV0ZXJtaW5lZC4gICovCi0JCQkJICAgIGlmIChleHBvbmVudCA+PSAtNAotCQkJCQkmJiBleHBvbmVudCA8IChsb25nKXByZWNpc2lvbikKLQkJCQkgICAgICB7Ci0JCQkJCS8qIEZpeGVkLXBvaW50IG5vdGF0aW9uOgotCQkJCQkgICBtYXgoZXhwb25lbnQsMCkrMSBkaWdpdHMsIHRoZW4gdGhlCi0JCQkJCSAgIGRlY2ltYWwgcG9pbnQsIHRoZW4gdGhlIHJlbWFpbmluZwotCQkJCQkgICBkaWdpdHMgd2l0aG91dCB0cmFpbGluZyB6ZXJvZXMuICAqLwotCQkJCQlpZiAoZXhwb25lbnQgPj0gMCkKLQkJCQkJICB7Ci0JCQkJCSAgICBzaXplX3QgY291bnQgPSBleHBvbmVudCArIDE7Ci0JCQkJCSAgICAvKiBOb3RlOiBjb3VudCA8PSBwcmVjaXNpb24gPSBuZGlnaXRzLiAgKi8KLQkJCQkJICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JCQkJCSAgICAgICpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLQkJCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgbmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJCSAgICAgIHsKLQkJCQkJCSpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0JCQkJCQl3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJCQkgIHsKLQkJCQkJCSAgICAtLW5kaWdpdHM7Ci0JCQkJCQkgICAgKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLQkJCQkJCSAgfQotCQkJCQkgICAgICB9Ci0JCQkJCSAgfQotCQkJCQllbHNlCi0JCQkJCSAgewotCQkJCQkgICAgc2l6ZV90IGNvdW50ID0gLWV4cG9uZW50IC0gMTsKLQkJCQkJICAgICpwKysgPSAnMCc7Ci0JCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCQkgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQtLSkKLQkJCQkJICAgICAgKnArKyA9ICcwJzsKLQkJCQkJICAgIHdoaWxlIChuZGlnaXRzID4gbnplcm9lcykKLQkJCQkJICAgICAgewotCQkJCQkJLS1uZGlnaXRzOwotCQkJCQkJKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLQkJCQkJICAgICAgfQotCQkJCQkgIH0KLQkJCQkgICAgICB9Ci0JCQkJICAgIGVsc2UKLQkJCQkgICAgICB7Ci0JCQkJCS8qIEV4cG9uZW50aWFsIG5vdGF0aW9uLiAgKi8KLQkJCQkJKnArKyA9IGRpZ2l0c1stLW5kaWdpdHNdOwotCQkJCQlpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCQkgIHsKLQkJCQkJICAgICpwKysgPSBkZWNpbWFsX3BvaW50X2NoYXIgKCk7Ci0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJCSAgICAgIHsKLQkJCQkJCS0tbmRpZ2l0czsKLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJCSAgICAgIH0KLQkJCQkJICB9Ci0JCQkJCSpwKysgPSBkcC0+Y29udmVyc2lvbiAtICdHJyArICdFJzsgLyogJ2UnIG9yICdFJyAqLwotIyAgIGlmIFdJREVfQ0hBUl9WRVJTSU9OCi0JCQkJCXsKLQkJCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLQkJCQkJICAgIHsgJyUnLCAnKycsICcuJywgJzInLCAnZCcsICdcMCcgfTsKLQkJCQkJICBTTlBSSU5URiAocCwgNiArIDEsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKCpwICE9ICdcMCcpCi0JCQkJCSAgcCsrOwotIyAgIGVsc2UKLQkJCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLQkJCQkJICB7Ci0JCQkJCSAgICBzcHJpbnRmICgoY2hhciAqKSBwLCAiJSsuMmQiLCBleHBvbmVudCk7Ci0JCQkJCSAgICB3aGlsZSAoKnAgIT0gJ1wwJykKLQkJCQkJICAgICAgcCsrOwotCQkJCQkgIH0KLQkJCQkJZWxzZQotCQkJCQkgIHsKLQkJCQkJICAgIGNoYXIgZXhwYnVmWzYgKyAxXTsKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmVwOwotCQkJCQkgICAgc3ByaW50ZiAoZXhwYnVmLCAiJSsuMmQiLCBleHBvbmVudCk7Ci0JCQkJCSAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0JCQkJCSAgICAgIHArKzsKLQkJCQkJICB9Ci0jICAgZW5kaWYKLQkJCQkgICAgICB9Ci0KLQkJCQkgICAgZnJlZSAoZGlnaXRzKTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICBhYm9ydCAoKTsKLSMgIGVsc2UKLQkJCSAgICAvKiBhcmcgaXMgZmluaXRlLiAgKi8KLQkJCSAgICBhYm9ydCAoKTsKLSMgIGVuZGlmCi0JCQkgIH0KLQotCQkJRU5EX0xPTkdfRE9VQkxFX1JPVU5ESU5HICgpOwotCQkgICAgICB9Ci0JCSAgfQotIyAgaWYgTkVFRF9QUklOVEZfRE9VQkxFIHx8IE5FRURfUFJJTlRGX0lORklOSVRFX0RPVUJMRQotCQllbHNlCi0jICBlbmRpZgotIyBlbmRpZgotIyBpZiBORUVEX1BSSU5URl9ET1VCTEUgfHwgTkVFRF9QUklOVEZfSU5GSU5JVEVfRE9VQkxFCi0JCSAgewotCQkgICAgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9kb3VibGU7Ci0KLQkJICAgIGlmIChpc25hbiAoYXJnKSkKLQkJICAgICAgewotCQkJaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ04nOyAqcCsrID0gJ0EnOyAqcCsrID0gJ04nOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAqcCsrID0gJ24nOyAqcCsrID0gJ2EnOyAqcCsrID0gJ24nOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaW50IHNpZ24gPSAwOwotCi0JCQlpZiAoc2lnbmJpdCAoYXJnKSkgLyogYXJnIDwgMC4wIG9yIG5lZ2F0aXZlIHplcm8gKi8KLQkJCSAgewotCQkJICAgIHNpZ24gPSAtMTsKLQkJCSAgICBhcmcgPSAtYXJnOwotCQkJICB9Ci0KLQkJCWlmIChzaWduIDwgMCkKLQkJCSAgKnArKyA9ICctJzsKLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TSE9XU0lHTikKLQkJCSAgKnArKyA9ICcrJzsKLQkJCWVsc2UgaWYgKGZsYWdzICYgRkxBR19TUEFDRSkKLQkJCSAgKnArKyA9ICcgJzsKLQotCQkJaWYgKGFyZyA+IDAuMCAmJiBhcmcgKyBhcmcgPT0gYXJnKQotCQkJICB7Ci0JCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID49ICdBJyAmJiBkcC0+Y29udmVyc2lvbiA8PSAnWicpCi0JCQkgICAgICB7Ci0JCQkJKnArKyA9ICdJJzsgKnArKyA9ICdOJzsgKnArKyA9ICdGJzsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJKnArKyA9ICdpJzsgKnArKyA9ICduJzsgKnArKyA9ICdmJzsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0jICBpZiBORUVEX1BSSU5URl9ET1VCTEUKLQkJCSAgICBwYWRfcHRyID0gcDsKLQotCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotCQkJICAgICAgewotCQkJCWNoYXIgKmRpZ2l0czsKLQkJCQlzaXplX3QgbmRpZ2l0czsKLQotCQkJCWRpZ2l0cyA9Ci0JCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChhcmcsIHByZWNpc2lvbik7Ci0JCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotCQkJCSAgZ290byBvdXRfb2ZfbWVtb3J5OwotCQkJCW5kaWdpdHMgPSBzdHJsZW4gKGRpZ2l0cyk7Ci0KLQkJCQlpZiAobmRpZ2l0cyA+IHByZWNpc2lvbikKLQkJCQkgIGRvCi0JCQkJICAgIHsKLQkJCQkgICAgICAtLW5kaWdpdHM7Ci0JCQkJICAgICAgKnArKyA9IGRpZ2l0c1tuZGlnaXRzXTsKLQkJCQkgICAgfQotCQkJCSAgd2hpbGUgKG5kaWdpdHMgPiBwcmVjaXNpb24pOwotCQkJCWVsc2UKLQkJCQkgICpwKysgPSAnMCc7Ci0JCQkJLyogSGVyZSBuZGlnaXRzIDw9IHByZWNpc2lvbi4gICovCi0JCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotCQkJCSAgewotCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCSAgICBmb3IgKDsgcHJlY2lzaW9uID4gbmRpZ2l0czsgcHJlY2lzaW9uLS0pCi0JCQkJICAgICAgKnArKyA9ICcwJzsKLQkJCQkgICAgd2hpbGUgKG5kaWdpdHMgPiAwKQotCQkJCSAgICAgIHsKLQkJCQkJLS1uZGlnaXRzOwotCQkJCQkqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotCQkJCSAgICAgIH0KLQkJCQkgIH0KLQotCQkJCWZyZWUgKGRpZ2l0cyk7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZSBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2UnIHx8IGRwLT5jb252ZXJzaW9uID09ICdFJykKLQkJCSAgICAgIHsKLQkJCQlpbnQgZXhwb25lbnQ7Ci0KLQkJCQlpZiAoYXJnID09IDAuMCkKLQkJCQkgIHsKLQkJCQkgICAgZXhwb25lbnQgPSAwOwotCQkJCSAgICAqcCsrID0gJzAnOwotCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IHByZWNpc2lvbiA+IDApCi0JCQkJICAgICAgewotCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCQlmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0JCQkJCSAgKnArKyA9ICcwJzsKLQkJCQkgICAgICB9Ci0JCQkJICB9Ci0JCQkJZWxzZQotCQkJCSAgewotCQkJCSAgICAvKiBhcmcgPiAwLjAuICAqLwotCQkJCSAgICBpbnQgYWRqdXN0ZWQ7Ci0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLQkJCQkgICAgc2l6ZV90IG5kaWdpdHM7Ci0KLQkJCQkgICAgZXhwb25lbnQgPSBmbG9vcmxvZzEwIChhcmcpOwotCQkJCSAgICBhZGp1c3RlZCA9IDA7Ci0JCQkJICAgIGZvciAoOzspCi0JCQkJICAgICAgewotCQkJCQlkaWdpdHMgPQotCQkJCQkgIHNjYWxlMTBfcm91bmRfZGVjaW1hbF9kb3VibGUgKGFyZywKLQkJCQkJCQkJCShpbnQpcHJlY2lzaW9uIC0gZXhwb25lbnQpOwotCQkJCQlpZiAoZGlnaXRzID09IE5VTEwpCi0JCQkJCSAgZ290byBvdXRfb2ZfbWVtb3J5OwotCQkJCQluZGlnaXRzID0gc3RybGVuIChkaWdpdHMpOwotCi0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbiArIDEpCi0JCQkJCSAgYnJlYWs7Ci0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uCi0JCQkJCSAgICB8fCBuZGlnaXRzID4gcHJlY2lzaW9uICsgMikKLQkJCQkJICAvKiBUaGUgZXhwb25lbnQgd2FzIG5vdCBndWVzc2VkCi0JCQkJCSAgICAgcHJlY2lzZWx5IGVub3VnaC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWlmIChhZGp1c3RlZCkKLQkJCQkJICAvKiBOb25lIG9mIHR3byB2YWx1ZXMgb2YgZXhwb25lbnQgaXMKLQkJCQkJICAgICB0aGUgcmlnaHQgb25lLiAgUHJldmVudCBhbiBlbmRsZXNzCi0JCQkJCSAgICAgbG9vcC4gICovCi0JCQkJCSAgYWJvcnQgKCk7Ci0JCQkJCWZyZWUgKGRpZ2l0cyk7Ci0JCQkJCWlmIChuZGlnaXRzID09IHByZWNpc2lvbikKLQkJCQkJICBleHBvbmVudCAtPSAxOwotCQkJCQllbHNlCi0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLQkJCQkJYWRqdXN0ZWQgPSAxOwotCQkJCSAgICAgIH0KLQotCQkJCSAgICAvKiBIZXJlIG5kaWdpdHMgPSBwcmVjaXNpb24rMS4gICovCi0JCQkJICAgICpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotCQkJCSAgICAgIHsKLQkJCQkJKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkJd2hpbGUgKG5kaWdpdHMgPiAwKQotCQkJCQkgIHsKLQkJCQkJICAgIC0tbmRpZ2l0czsKLQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJCSAgfQotCQkJCSAgICAgIH0KLQotCQkJCSAgICBmcmVlIChkaWdpdHMpOwotCQkJCSAgfQotCi0JCQkJKnArKyA9IGRwLT5jb252ZXJzaW9uOyAvKiAnZScgb3IgJ0UnICovCi0jICAgaWYgV0lERV9DSEFSX1ZFUlNJT04KLQkJCQl7Ci0JCQkJICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBkZWNpbWFsX2Zvcm1hdFtdID0KLQkJCQkgICAgLyogUHJvZHVjZSB0aGUgc2FtZSBudW1iZXIgb2YgZXhwb25lbnQgZGlnaXRzCi0JCQkJICAgICAgIGFzIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotCQkJCSAgICB7ICclJywgJysnLCAnLicsICczJywgJ2QnLCAnXDAnIH07Ci0jICAgIGVsc2UKLQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMicsICdkJywgJ1wwJyB9OwotIyAgICBlbmRpZgotCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotCQkJCX0KLQkJCQl3aGlsZSAoKnAgIT0gJ1wwJykKLQkJCQkgIHArKzsKLSMgICBlbHNlCi0JCQkJewotCQkJCSAgc3RhdGljIGNvbnN0IGNoYXIgZGVjaW1hbF9mb3JtYXRbXSA9Ci0JCQkJICAgIC8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cwotCQkJCSAgICAgICBhcyB0aGUgbmF0aXZlIHByaW50ZiBpbXBsZW1lbnRhdGlvbi4gICovCi0jICAgIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLQkJCQkgICAgIiUrLjNkIjsKLSMgICAgZWxzZQotCQkJCSAgICAiJSsuMmQiOwotIyAgICBlbmRpZgotCQkJCSAgaWYgKHNpemVvZiAoRENIQVJfVCkgPT0gMSkKLQkJCQkgICAgewotCQkJCSAgICAgIHNwcmludGYgKChjaGFyICopIHAsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0JCQkJICAgICAgd2hpbGUgKCpwICE9ICdcMCcpCi0JCQkJCXArKzsKLQkJCQkgICAgfQotCQkJCSAgZWxzZQotCQkJCSAgICB7Ci0JCQkJICAgICAgY2hhciBleHBidWZbNiArIDFdOwotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmVwOwotCQkJCSAgICAgIHNwcmludGYgKGV4cGJ1ZiwgZGVjaW1hbF9mb3JtYXQsIGV4cG9uZW50KTsKLQkJCQkgICAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0JCQkJCXArKzsKLQkJCQkgICAgfQotCQkJCX0KLSMgICBlbmRpZgotCQkJICAgICAgfQotCQkJICAgIGVsc2UgaWYgKGRwLT5jb252ZXJzaW9uID09ICdnJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAnRycpCi0JCQkgICAgICB7Ci0JCQkJaWYgKHByZWNpc2lvbiA9PSAwKQotCQkJCSAgcHJlY2lzaW9uID0gMTsKLQkJCQkvKiBwcmVjaXNpb24gPj0gMS4gICovCi0KLQkJCQlpZiAoYXJnID09IDAuMCkKLQkJCQkgIC8qIFRoZSBleHBvbmVudCBpcyAwLCA+PSAtNCwgPCBwcmVjaXNpb24uCi0JCQkJICAgICBVc2UgZml4ZWQtcG9pbnQgbm90YXRpb24uICAqLwotCQkJCSAgewotCQkJCSAgICBzaXplX3QgbmRpZ2l0cyA9IHByZWNpc2lvbjsKLQkJCQkgICAgLyogTnVtYmVyIG9mIHRyYWlsaW5nIHplcm9lcyB0aGF0IGhhdmUgdG8gYmUKLQkJCQkgICAgICAgZHJvcHBlZC4gICovCi0JCQkJICAgIHNpemVfdCBuemVyb2VzID0KLQkJCQkgICAgICAoZmxhZ3MgJiBGTEFHX0FMVCA/IDAgOiBwcmVjaXNpb24gLSAxKTsKLQotCQkJCSAgICAtLW5kaWdpdHM7Ci0JCQkJICAgICpwKysgPSAnMCc7Ci0JCQkJICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FMVCkgfHwgbmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJICAgICAgewotCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCQl3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJCSAgewotCQkJCQkgICAgLS1uZGlnaXRzOwotCQkJCQkgICAgKnArKyA9ICcwJzsKLQkJCQkJICB9Ci0JCQkJICAgICAgfQotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgLyogYXJnID4gMC4wLiAgKi8KLQkJCQkgICAgaW50IGV4cG9uZW50OwotCQkJCSAgICBpbnQgYWRqdXN0ZWQ7Ci0JCQkJICAgIGNoYXIgKmRpZ2l0czsKLQkJCQkgICAgc2l6ZV90IG5kaWdpdHM7Ci0JCQkJICAgIHNpemVfdCBuemVyb2VzOwotCi0JCQkJICAgIGV4cG9uZW50ID0gZmxvb3Jsb2cxMCAoYXJnKTsKLQkJCQkgICAgYWRqdXN0ZWQgPSAwOwotCQkJCSAgICBmb3IgKDs7KQotCQkJCSAgICAgIHsKLQkJCQkJZGlnaXRzID0KLQkJCQkJICBzY2FsZTEwX3JvdW5kX2RlY2ltYWxfZG91YmxlIChhcmcsCi0JCQkJCQkJCQkoaW50KShwcmVjaXNpb24gLSAxKSAtIGV4cG9uZW50KTsKLQkJCQkJaWYgKGRpZ2l0cyA9PSBOVUxMKQotCQkJCQkgIGdvdG8gb3V0X29mX21lbW9yeTsKLQkJCQkJbmRpZ2l0cyA9IHN0cmxlbiAoZGlnaXRzKTsKLQotCQkJCQlpZiAobmRpZ2l0cyA9PSBwcmVjaXNpb24pCi0JCQkJCSAgYnJlYWs7Ci0JCQkJCWlmIChuZGlnaXRzIDwgcHJlY2lzaW9uIC0gMQotCQkJCQkgICAgfHwgbmRpZ2l0cyA+IHByZWNpc2lvbiArIDEpCi0JCQkJCSAgLyogVGhlIGV4cG9uZW50IHdhcyBub3QgZ3Vlc3NlZAotCQkJCQkgICAgIHByZWNpc2VseSBlbm91Z2guICAqLwotCQkJCQkgIGFib3J0ICgpOwotCQkJCQlpZiAoYWRqdXN0ZWQpCi0JCQkJCSAgLyogTm9uZSBvZiB0d28gdmFsdWVzIG9mIGV4cG9uZW50IGlzCi0JCQkJCSAgICAgdGhlIHJpZ2h0IG9uZS4gIFByZXZlbnQgYW4gZW5kbGVzcwotCQkJCQkgICAgIGxvb3AuICAqLwotCQkJCQkgIGFib3J0ICgpOwotCQkJCQlmcmVlIChkaWdpdHMpOwotCQkJCQlpZiAobmRpZ2l0cyA8IHByZWNpc2lvbikKLQkJCQkJICBleHBvbmVudCAtPSAxOwotCQkJCQllbHNlCi0JCQkJCSAgZXhwb25lbnQgKz0gMTsKLQkJCQkJYWRqdXN0ZWQgPSAxOwotCQkJCSAgICAgIH0KLQkJCQkgICAgLyogSGVyZSBuZGlnaXRzID0gcHJlY2lzaW9uLiAgKi8KLQotCQkJCSAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvZXMKLQkJCQkgICAgICAgdGhhdCBoYXZlIHRvIGJlIGRyb3BwZWQuICAqLwotCQkJCSAgICBuemVyb2VzID0gMDsKLQkJCQkgICAgaWYgKChmbGFncyAmIEZMQUdfQUxUKSA9PSAwKQotCQkJCSAgICAgIHdoaWxlIChuemVyb2VzIDwgbmRpZ2l0cwotCQkJCQkgICAgICYmIGRpZ2l0c1tuemVyb2VzXSA9PSAnMCcpCi0JCQkJCW56ZXJvZXMrKzsKLQotCQkJCSAgICAvKiBUaGUgZXhwb25lbnQgaXMgbm93IGRldGVybWluZWQuICAqLwotCQkJCSAgICBpZiAoZXhwb25lbnQgPj0gLTQKLQkJCQkJJiYgZXhwb25lbnQgPCAobG9uZylwcmVjaXNpb24pCi0JCQkJICAgICAgewotCQkJCQkvKiBGaXhlZC1wb2ludCBub3RhdGlvbjoKLQkJCQkJICAgbWF4KGV4cG9uZW50LDApKzEgZGlnaXRzLCB0aGVuIHRoZQotCQkJCQkgICBkZWNpbWFsIHBvaW50LCB0aGVuIHRoZSByZW1haW5pbmcKLQkJCQkJICAgZGlnaXRzIHdpdGhvdXQgdHJhaWxpbmcgemVyb2VzLiAgKi8KLQkJCQkJaWYgKGV4cG9uZW50ID49IDApCi0JCQkJCSAgewotCQkJCQkgICAgc2l6ZV90IGNvdW50ID0gZXhwb25lbnQgKyAxOwotCQkJCQkgICAgLyogTm90ZTogY291bnQgPD0gcHJlY2lzaW9uID0gbmRpZ2l0cy4gICovCi0JCQkJCSAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQotCQkJCQkgICAgICAqcCsrID0gZGlnaXRzWy0tbmRpZ2l0c107Ci0JCQkJCSAgICBpZiAoKGZsYWdzICYgRkxBR19BTFQpIHx8IG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCQkgICAgICB7Ci0JCQkJCQkqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCQkJd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCQkJICB7Ci0JCQkJCQkgICAgLS1uZGlnaXRzOwotCQkJCQkJICAgICpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJCQkgIH0KLQkJCQkJICAgICAgfQotCQkJCQkgIH0KLQkJCQkJZWxzZQotCQkJCQkgIHsKLQkJCQkJICAgIHNpemVfdCBjb3VudCA9IC1leHBvbmVudCAtIDE7Ci0JCQkJCSAgICAqcCsrID0gJzAnOwotCQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkJICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pCi0JCQkJCSAgICAgICpwKysgPSAnMCc7Ci0JCQkJCSAgICB3aGlsZSAobmRpZ2l0cyA+IG56ZXJvZXMpCi0JCQkJCSAgICAgIHsKLQkJCQkJCS0tbmRpZ2l0czsKLQkJCQkJCSpwKysgPSBkaWdpdHNbbmRpZ2l0c107Ci0JCQkJCSAgICAgIH0KLQkJCQkJICB9Ci0JCQkJICAgICAgfQotCQkJCSAgICBlbHNlCi0JCQkJICAgICAgewotCQkJCQkvKiBFeHBvbmVudGlhbCBub3RhdGlvbi4gICovCi0JCQkJCSpwKysgPSBkaWdpdHNbLS1uZGlnaXRzXTsKLQkJCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBuZGlnaXRzID4gbnplcm9lcykKLQkJCQkJICB7Ci0JCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCQkgICAgd2hpbGUgKG5kaWdpdHMgPiBuemVyb2VzKQotCQkJCQkgICAgICB7Ci0JCQkJCQktLW5kaWdpdHM7Ci0JCQkJCQkqcCsrID0gZGlnaXRzW25kaWdpdHNdOwotCQkJCQkgICAgICB9Ci0JCQkJCSAgfQotCQkJCQkqcCsrID0gZHAtPmNvbnZlcnNpb24gLSAnRycgKyAnRSc7IC8qICdlJyBvciAnRScgKi8KLSMgICBpZiBXSURFX0NIQVJfVkVSU0lPTgotCQkJCQl7Ci0JCQkJCSAgc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVjaW1hbF9mb3JtYXRbXSA9Ci0JCQkJCSAgICAvKiBQcm9kdWNlIHRoZSBzYW1lIG51bWJlciBvZiBleHBvbmVudCBkaWdpdHMKLQkJCQkJICAgICAgIGFzIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLSMgICAgaWYgKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKSAmJiAhIGRlZmluZWQgX19DWUdXSU5fXwotCQkJCQkgICAgeyAnJScsICcrJywgJy4nLCAnMycsICdkJywgJ1wwJyB9OwotIyAgICBlbHNlCi0JCQkJCSAgICB7ICclJywgJysnLCAnLicsICcyJywgJ2QnLCAnXDAnIH07Ci0jICAgIGVuZGlmCi0JCQkJCSAgU05QUklOVEYgKHAsIDYgKyAxLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotCQkJCQl9Ci0JCQkJCXdoaWxlICgqcCAhPSAnXDAnKQotCQkJCQkgIHArKzsKLSMgICBlbHNlCi0JCQkJCXsKLQkJCQkJICBzdGF0aWMgY29uc3QgY2hhciBkZWNpbWFsX2Zvcm1hdFtdID0KLQkJCQkJICAgIC8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cwotCQkJCQkgICAgICAgYXMgdGhlIG5hdGl2ZSBwcmludGYgaW1wbGVtZW50YXRpb24uICAqLwotIyAgICBpZiAoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICEgZGVmaW5lZCBfX0NZR1dJTl9fCi0JCQkJCSAgICAiJSsuM2QiOwotIyAgICBlbHNlCi0JCQkJCSAgICAiJSsuMmQiOwotIyAgICBlbmRpZgotCQkJCQkgIGlmIChzaXplb2YgKERDSEFSX1QpID09IDEpCi0JCQkJCSAgICB7Ci0JCQkJCSAgICAgIHNwcmludGYgKChjaGFyICopIHAsIGRlY2ltYWxfZm9ybWF0LCBleHBvbmVudCk7Ci0JCQkJCSAgICAgIHdoaWxlICgqcCAhPSAnXDAnKQotCQkJCQkJcCsrOwotCQkJCQkgICAgfQotCQkJCQkgIGVsc2UKLQkJCQkJICAgIHsKLQkJCQkJICAgICAgY2hhciBleHBidWZbNiArIDFdOwotCQkJCQkgICAgICBjb25zdCBjaGFyICplcDsKLQkJCQkJICAgICAgc3ByaW50ZiAoZXhwYnVmLCBkZWNpbWFsX2Zvcm1hdCwgZXhwb25lbnQpOwotCQkJCQkgICAgICBmb3IgKGVwID0gZXhwYnVmOyAoKnAgPSAqZXApICE9ICdcMCc7IGVwKyspCi0JCQkJCQlwKys7Ci0JCQkJCSAgICB9Ci0JCQkJCX0KLSMgICBlbmRpZgotCQkJCSAgICAgIH0KLQotCQkJCSAgICBmcmVlIChkaWdpdHMpOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIGFib3J0ICgpOwotIyAgZWxzZQotCQkJICAgIC8qIGFyZyBpcyBmaW5pdGUuICAqLwotCQkJICAgIGlmICghKGFyZyA9PSAwLjApKQotCQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJCSAgICBwYWRfcHRyID0gcDsKLQotCQkJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZicgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotCQkJICAgICAgewotCQkJCSpwKysgPSAnMCc7Ci0JCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotCQkJCSAgewotCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCSAgICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0JCQkJICAgICAgKnArKyA9ICcwJzsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZScgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0UnKQotCQkJICAgICAgewotCQkJCSpwKysgPSAnMCc7Ci0JCQkJaWYgKChmbGFncyAmIEZMQUdfQUxUKSB8fCBwcmVjaXNpb24gPiAwKQotCQkJCSAgewotCQkJCSAgICAqcCsrID0gZGVjaW1hbF9wb2ludF9jaGFyICgpOwotCQkJCSAgICBmb3IgKDsgcHJlY2lzaW9uID4gMDsgcHJlY2lzaW9uLS0pCi0JCQkJICAgICAgKnArKyA9ICcwJzsKLQkJCQkgIH0KLQkJCQkqcCsrID0gZHAtPmNvbnZlcnNpb247IC8qICdlJyBvciAnRScgKi8KLQkJCQkqcCsrID0gJysnOwotCQkJCS8qIFByb2R1Y2UgdGhlIHNhbWUgbnVtYmVyIG9mIGV4cG9uZW50IGRpZ2l0cyBhcwotCQkJCSAgIHRoZSBuYXRpdmUgcHJpbnRmIGltcGxlbWVudGF0aW9uLiAgKi8KLSMgICBpZiAoZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18pICYmICEgZGVmaW5lZCBfX0NZR1dJTl9fCi0JCQkJKnArKyA9ICcwJzsKLSMgICBlbmRpZgotCQkJCSpwKysgPSAnMCc7Ci0JCQkJKnArKyA9ICcwJzsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnZycgfHwgZHAtPmNvbnZlcnNpb24gPT0gJ0cnKQotCQkJICAgICAgewotCQkJCSpwKysgPSAnMCc7Ci0JCQkJaWYgKGZsYWdzICYgRkxBR19BTFQpCi0JCQkJICB7Ci0JCQkJICAgIHNpemVfdCBuZGlnaXRzID0KLQkJCQkgICAgICAocHJlY2lzaW9uID4gMCA/IHByZWNpc2lvbiAtIDEgOiAwKTsKLQkJCQkgICAgKnArKyA9IGRlY2ltYWxfcG9pbnRfY2hhciAoKTsKLQkJCQkgICAgZm9yICg7IG5kaWdpdHMgPiAwOyAtLW5kaWdpdHMpCi0JCQkJICAgICAgKnArKyA9ICcwJzsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICBhYm9ydCAoKTsKLSMgIGVuZGlmCi0JCQkgIH0KLQkJICAgICAgfQotCQkgIH0KLSMgZW5kaWYKLQotCQkvKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBub3cgZXh0ZW5kcyBmcm9tIHRtcCB0byBwLCB3aXRoIHRoZQotCQkgICB6ZXJvIHBhZGRpbmcgaW5zZXJ0aW9uIHBvaW50IGJlaW5nIGF0IHBhZF9wdHIuICAqLwotCQlpZiAoaGFzX3dpZHRoICYmIHAgLSB0bXAgPCB3aWR0aCkKLQkJICB7Ci0JCSAgICBzaXplX3QgcGFkID0gd2lkdGggLSAocCAtIHRtcCk7Ci0JCSAgICBEQ0hBUl9UICplbmQgPSBwICsgcGFkOwotCi0JCSAgICBpZiAoZmxhZ3MgJiBGTEFHX0xFRlQpCi0JCSAgICAgIHsKLQkJCS8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgcmlnaHQuICAqLwotCQkJZm9yICg7IHBhZCA+IDA7IHBhZC0tKQotCQkJICAqcCsrID0gJyAnOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1pFUk8pICYmIHBhZF9wdHIgIT0gTlVMTCkKLQkJICAgICAgewotCQkJLyogUGFkIHdpdGggemVyb2VzLiAgKi8KLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0KLQkJCXdoaWxlIChwID4gcGFkX3B0cikKLQkJCSAgKi0tcSA9ICotLXA7Ci0JCQlmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0JCQkgICpwKysgPSAnMCc7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogUGFkIHdpdGggc3BhY2VzIG9uIHRoZSBsZWZ0LiAgKi8KLQkJCURDSEFSX1QgKnEgPSBlbmQ7Ci0KLQkJCXdoaWxlIChwID4gdG1wKQotCQkJICAqLS1xID0gKi0tcDsKLQkJCWZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLQkJCSAgKnArKyA9ICcgJzsKLQkJICAgICAgfQotCi0JCSAgICBwID0gZW5kOwotCQkgIH0KLQotCQl7Ci0JCSAgc2l6ZV90IGNvdW50ID0gcCAtIHRtcDsKLQotCQkgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQotCQkgICAgLyogdG1wX2xlbmd0aCB3YXMgaW5jb3JyZWN0bHkgY2FsY3VsYXRlZCAtIGZpeCB0aGUKLQkJICAgICAgIGNvZGUgYWJvdmUhICAqLwotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLwotCQkgIGlmIChjb3VudCA+PSBhbGxvY2F0ZWQgLSBsZW5ndGgpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBuID0geHN1bSAobGVuZ3RoLCBjb3VudCk7Ci0KLQkJICAgICAgRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotCQkgICAgfQotCi0JCSAgLyogQXBwZW5kIHRoZSByZXN1bHQuICAqLwotCQkgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCB0bXAsIGNvdW50ICogc2l6ZW9mIChEQ0hBUl9UKSk7Ci0JCSAgaWYgKHRtcCAhPSB0bXBidWYpCi0JCSAgICBmcmVlICh0bXApOwotCQkgIGxlbmd0aCArPSBjb3VudDsKLQkJfQotCSAgICAgIH0KLSNlbmRpZgotCSAgICBlbHNlCi0JICAgICAgewotCQlhcmdfdHlwZSB0eXBlID0gYS5hcmdbZHAtPmFyZ19pbmRleF0udHlwZTsKLQkJaW50IGZsYWdzID0gZHAtPmZsYWdzOwotI2lmICFVU0VfU05QUklOVEYgfHwgIURDSEFSX0lTX1RDSEFSIHx8IEVOQUJMRV9VTklTVERJTyB8fCBORUVEX1BSSU5URl9GTEFHX1pFUk8gfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotCQlpbnQgaGFzX3dpZHRoOwotCQlzaXplX3Qgd2lkdGg7Ci0jZW5kaWYKLSNpZiAhVVNFX1NOUFJJTlRGIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLQkJaW50IGhhc19wcmVjaXNpb247Ci0JCXNpemVfdCBwcmVjaXNpb247Ci0jZW5kaWYKLSNpZiBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0JCWludCBwcmVjX291cnNlbHZlczsKLSNlbHNlCi0jCQlkZWZpbmUgcHJlY19vdXJzZWx2ZXMgMAotI2VuZGlmCi0jaWYgIURDSEFSX0lTX1RDSEFSIHx8IEVOQUJMRV9VTklTVERJTyB8fCBORUVEX1BSSU5URl9GTEFHX1pFUk8gfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotCQlpbnQgcGFkX291cnNlbHZlczsKLSNlbHNlCi0jCQlkZWZpbmUgcGFkX291cnNlbHZlcyAwCi0jZW5kaWYKLQkJVENIQVJfVCAqZmJwOwotCQl1bnNpZ25lZCBpbnQgcHJlZml4X2NvdW50OwotCQlpbnQgcHJlZml4ZXNbMl07Ci0jaWYgIVVTRV9TTlBSSU5URgotCQlzaXplX3QgdG1wX2xlbmd0aDsKLQkJVENIQVJfVCB0bXBidWZbNzAwXTsKLQkJVENIQVJfVCAqdG1wOwotI2VuZGlmCi0KLSNpZiAhVVNFX1NOUFJJTlRGIHx8ICFEQ0hBUl9JU19UQ0hBUiB8fCBFTkFCTEVfVU5JU1RESU8gfHwgTkVFRF9QUklOVEZfRkxBR19aRVJPIHx8IE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLQkJaGFzX3dpZHRoID0gMDsKLQkJd2lkdGggPSAwOwotCQlpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0JCSAgewotCQkgICAgaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCSAgICAgIHsKLQkJCWludCBhcmc7Ci0KLQkJCWlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkJICBhYm9ydCAoKTsKLQkJCWFyZyA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQlpZiAoYXJnIDwgMCkKLQkJCSAgewotCQkJICAgIC8qICJBIG5lZ2F0aXZlIGZpZWxkIHdpZHRoIGlzIHRha2VuIGFzIGEgJy0nIGZsYWcKLQkJCSAgICAgICAgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aC4iICAqLwotCQkJICAgIGZsYWdzIHw9IEZMQUdfTEVGVDsKLQkJCSAgICB3aWR0aCA9ICh1bnNpZ25lZCBpbnQpICgtYXJnKTsKLQkJCSAgfQotCQkJZWxzZQotCQkJICB3aWR0aCA9IGFyZzsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQljb25zdCBGQ0hBUl9UICpkaWdpdHAgPSBkcC0+d2lkdGhfc3RhcnQ7Ci0KLQkJCWRvCi0JCQkgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotCQkJd2hpbGUgKGRpZ2l0cCAhPSBkcC0+d2lkdGhfZW5kKTsKLQkJICAgICAgfQotCQkgICAgaGFzX3dpZHRoID0gMTsKLQkJICB9Ci0jZW5kaWYKLQotI2lmICFVU0VfU05QUklOVEYgfHwgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotCQloYXNfcHJlY2lzaW9uID0gMDsKLQkJcHJlY2lzaW9uID0gNjsKLQkJaWYgKGRwLT5wcmVjaXNpb25fc3RhcnQgIT0gZHAtPnByZWNpc2lvbl9lbmQpCi0JCSAgewotCQkgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQotCQkgICAgICB7Ci0JCQlpbnQgYXJnOwotCi0JCQlpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCi0JCQkgIGFib3J0ICgpOwotCQkJYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCQkvKiAiQSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgaWYgdGhlIHByZWNpc2lvbgotCQkJICAgIHdlcmUgb21pdHRlZC4iICAqLwotCQkJaWYgKGFyZyA+PSAwKQotCQkJICB7Ci0JCQkgICAgcHJlY2lzaW9uID0gYXJnOwotCQkJICAgIGhhc19wcmVjaXNpb24gPSAxOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29uc3QgRkNIQVJfVCAqZGlnaXRwID0gZHAtPnByZWNpc2lvbl9zdGFydCArIDE7Ci0KLQkJCXByZWNpc2lvbiA9IDA7Ci0JCQl3aGlsZSAoZGlnaXRwICE9IGRwLT5wcmVjaXNpb25fZW5kKQotCQkJICBwcmVjaXNpb24gPSB4c3VtICh4dGltZXMgKHByZWNpc2lvbiwgMTApLCAqZGlnaXRwKysgLSAnMCcpOwotCQkJaGFzX3ByZWNpc2lvbiA9IDE7Ci0JCSAgICAgIH0KLQkJICB9Ci0jZW5kaWYKLQotI2lmICFVU0VfU05QUklOVEYKLQkJLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZSBmb3IgY2FsbGluZwotCQkgICBzcHJpbnRmLiAgKi8KLQkJewotCQkgIHN3aXRjaCAoZHAtPmNvbnZlcnNpb24pCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2QnOiBjYXNlICdpJzogY2FzZSAndSc6Ci0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0JCQkJCSApCi0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJICAgICAgZWxzZQotIyBlbmRpZgotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKLQkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkgICAgICBlbHNlCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0JCQkJCSApCi0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotCQkgICAgICAvKiBNdWx0aXBseSBieSAyLCBhcyBhbiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUC4gICovCi0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCB0bXBfbGVuZ3RoKTsKLQkJICAgICAgLyogQWRkIDEsIHRvIGFjY291bnQgZm9yIGEgbGVhZGluZyBzaWduLiAgKi8KLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIDEpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnbyc6Ci0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAotCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCi0JCQkJCSApCi0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJICAgICAgZWxzZQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGludCkgKiBDSEFSX0JJVAotCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCi0JCQkJCSApCi0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotCQkgICAgICAvKiBBZGQgMSwgdG8gYWNjb3VudCBmb3IgYSBsZWFkaW5nIHNpZ24uICAqLwotCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICd4JzogY2FzZSAnWCc6Ci0jIGlmIEhBVkVfTE9OR19MT05HX0lOVAotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdMT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0xPTkdJTlQpCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotCQkJCQkgKQotCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCSAgICAgIGVsc2UKLSMgZW5kaWYKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HSU5UIHx8IHR5cGUgPT0gVFlQRV9VTE9OR0lOVCkKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUCi0JCQkJCSAgKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLwotCQkJCQkgKQotCQkJICArIDE7IC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCSAgICAgIGVsc2UKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKLQkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCi0JCQkJCSApCi0JCQkgICsgMTsgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJICAgICAgaWYgKHRtcF9sZW5ndGggPCBwcmVjaXNpb24pCi0JCQl0bXBfbGVuZ3RoID0gcHJlY2lzaW9uOwotCQkgICAgICAvKiBBZGQgMiwgdG8gYWNjb3VudCBmb3IgYSBsZWFkaW5nIHNpZ24gb3IgYWx0ZXJuYXRlIGZvcm0uICAqLwotCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdmJzogY2FzZSAnRic6Ci0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9NQVhfRVhQCi0JCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCi0JCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCi0JCQkJCSApCi0JCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KLQkJICAgICAgZWxzZQotCQkJdG1wX2xlbmd0aCA9Ci0JCQkgICh1bnNpZ25lZCBpbnQpIChEQkxfTUFYX0VYUAotCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLwotCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLwotCQkJCQkgKQotCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KLQkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCi0JCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6Ci0JCSAgICAgIHRtcF9sZW5ndGggPQotCQkJMTI7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQsIGV4cG9uZW50IGV0Yy4gKi8KLQkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdhJzogY2FzZSAnQSc6Ci0JCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKLQkJCXRtcF9sZW5ndGggPQotCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9ESUcKLQkJCQkJICAqIDAuODMxIC8qIGRlY2ltYWwgLT4gaGV4YWRlY2ltYWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkgICAgICBlbHNlCi0JCQl0bXBfbGVuZ3RoID0KLQkJCSAgKHVuc2lnbmVkIGludCkgKERCTF9ESUcKLQkJCQkJICAqIDAuODMxIC8qIGRlY2ltYWwgLT4gaGV4YWRlY2ltYWwgKi8KLQkJCQkJICkKLQkJCSAgKyAxOyAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLwotCQkgICAgICBpZiAodG1wX2xlbmd0aCA8IHByZWNpc2lvbikKLQkJCXRtcF9sZW5ndGggPSBwcmVjaXNpb247Ci0JCSAgICAgIC8qIEFjY291bnQgZm9yIHNpZ24sIGRlY2ltYWwgcG9pbnQgZXRjLiAqLwotCQkgICAgICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgMTIpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnYyc6Ci0jIGlmIEhBVkVfV0lOVF9UICYmICFXSURFX0NIQVJfVkVSU0lPTgotCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX1dJREVfQ0hBUikKLQkJCXRtcF9sZW5ndGggPSBNQl9DVVJfTUFYOwotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCQl0bXBfbGVuZ3RoID0gMTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3MnOgotIyBpZiBIQVZFX1dDSEFSX1QKLQkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9XSURFX1NUUklORykKLQkJCXsKLQkJCSAgdG1wX2xlbmd0aCA9Ci0JCQkgICAgbG9jYWxfd2NzbGVuIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9zdHJpbmcpOwotCi0jICBpZiAhV0lERV9DSEFSX1ZFUlNJT04KLQkJCSAgdG1wX2xlbmd0aCA9IHh0aW1lcyAodG1wX2xlbmd0aCwgTUJfQ1VSX01BWCk7Ci0jICBlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0jIGVuZGlmCi0JCQl0bXBfbGVuZ3RoID0gc3RybGVuIChhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICB0bXBfbGVuZ3RoID0KLQkJCSh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHZvaWQgKikgKiBDSEFSX0JJVAotCQkJCQkqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCi0JCQkJICAgICAgICkKLQkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCi0JCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyAweCAqLwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLSMgaWYgRU5BQkxFX1VOSVNURElPCi0JCSAgLyogUGFkZGluZyBjb25zaWRlcnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUgdGhlCi0JCSAgICAgbnVtYmVyIG9mIGVsZW1lbnRzIGFmdGVyIHBhZGRpbmcgbWF5IGJlCi0JCSAgICAgICA+IG1heCAodG1wX2xlbmd0aCwgd2lkdGgpCi0JCSAgICAgYnV0IGlzIGNlcnRhaW5seQotCQkgICAgICAgPD0gdG1wX2xlbmd0aCArIHdpZHRoLiAgKi8KLQkJICB0bXBfbGVuZ3RoID0geHN1bSAodG1wX2xlbmd0aCwgd2lkdGgpOwotIyBlbHNlCi0JCSAgLyogUGFkZGluZyBjb25zaWRlcnMgdGhlIG51bWJlciBvZiBlbGVtZW50cywgc2F5cyBQT1NJWC4gICovCi0JCSAgaWYgKHRtcF9sZW5ndGggPCB3aWR0aCkKLQkJICAgIHRtcF9sZW5ndGggPSB3aWR0aDsKLSMgZW5kaWYKLQotCQkgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCi0JCX0KLQotCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKFRDSEFSX1QpKQotCQkgIHRtcCA9IHRtcGJ1ZjsKLQkJZWxzZQotCQkgIHsKLQkJICAgIHNpemVfdCB0bXBfbWVtc2l6ZSA9IHh0aW1lcyAodG1wX2xlbmd0aCwgc2l6ZW9mIChUQ0hBUl9UKSk7Ci0KLQkJICAgIGlmIChzaXplX292ZXJmbG93X3AgKHRtcF9tZW1zaXplKSkKLQkJICAgICAgLyogT3ZlcmZsb3csIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeS4gICovCi0JCSAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKLQkJICAgIHRtcCA9IChUQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOwotCQkgICAgaWYgKHRtcCA9PSBOVUxMKQotCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KLQkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OwotCQkgIH0KLSNlbmRpZgotCi0JCS8qIERlY2lkZSB3aGV0aGVyIHRvIGhhbmRsZSB0aGUgcHJlY2lzaW9uIG91cnNlbHZlcy4gICovCi0jaWYgTkVFRF9QUklOVEZfVU5CT1VOREVEX1BSRUNJU0lPTgotCQlzd2l0Y2ggKGRwLT5jb252ZXJzaW9uKQotCQkgIHsKLQkJICBjYXNlICdkJzogY2FzZSAnaSc6IGNhc2UgJ3UnOgotCQkgIGNhc2UgJ28nOgotCQkgIGNhc2UgJ3gnOiBjYXNlICdYJzogY2FzZSAncCc6Ci0JCSAgICBwcmVjX291cnNlbHZlcyA9IGhhc19wcmVjaXNpb24gJiYgKHByZWNpc2lvbiA+IDApOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIHByZWNfb3Vyc2VsdmVzID0gMDsKLQkJICAgIGJyZWFrOwotCQkgIH0KLSNlbmRpZgotCi0JCS8qIERlY2lkZSB3aGV0aGVyIHRvIHBlcmZvcm0gdGhlIHBhZGRpbmcgb3Vyc2VsdmVzLiAgKi8KLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0JCXN3aXRjaCAoZHAtPmNvbnZlcnNpb24pCi0JCSAgewotIyBpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPCi0JCSAgLyogSWYgd2UgbmVlZCBjb252ZXJzaW9uIGZyb20gVENIQVJfVFtdIHRvIERDSEFSX1RbXSwgd2UgbmVlZAotCQkgICAgIHRvIHBlcmZvcm0gdGhlIHBhZGRpbmcgYWZ0ZXIgdGhpcyBjb252ZXJzaW9uLiAgRnVuY3Rpb25zCi0JCSAgICAgd2l0aCB1bmlzdGRpbyBleHRlbnNpb25zIHBlcmZvcm0gdGhlIHBhZGRpbmcgYmFzZWQgb24KLQkJICAgICBjaGFyYWN0ZXIgY291bnQgcmF0aGVyIHRoYW4gZWxlbWVudCBjb3VudC4gICovCi0JCSAgY2FzZSAnYyc6IGNhc2UgJ3MnOgotIyBlbmRpZgotIyBpZiBORUVEX1BSSU5URl9GTEFHX1pFUk8KLQkJICBjYXNlICdmJzogY2FzZSAnRic6IGNhc2UgJ2UnOiBjYXNlICdFJzogY2FzZSAnZyc6IGNhc2UgJ0cnOgotCQkgIGNhc2UgJ2EnOiBjYXNlICdBJzoKLSMgZW5kaWYKLQkJICAgIHBhZF9vdXJzZWx2ZXMgPSAxOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIHBhZF9vdXJzZWx2ZXMgPSBwcmVjX291cnNlbHZlczsKLQkJICAgIGJyZWFrOwotCQkgIH0KLSNlbmRpZgotCi0JCS8qIENvbnN0cnVjdCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgY2FsbGluZyBzbnByaW50ZiBvcgotCQkgICBzcHJpbnRmLiAgKi8KLQkJZmJwID0gYnVmOwotCQkqZmJwKysgPSAnJSc7Ci0jaWYgTkVFRF9QUklOVEZfRkxBR19HUk9VUElORwotCQkvKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlICcgZmxhZy4KLQkJICAgUHJvZHVjZSBubyBncm91cGluZyBjaGFyYWN0ZXJzIGluIHRoaXMgY2FzZTsgdGhpcyBpcwotCQkgICBhY2NlcHRhYmxlIGJlY2F1c2UgdGhlIGdyb3VwaW5nIGlzIGxvY2FsZSBkZXBlbmRlbnQuICAqLwotI2Vsc2UKLQkJaWYgKGZsYWdzICYgRkxBR19HUk9VUCkKLQkJICAqZmJwKysgPSAnXCcnOwotI2VuZGlmCi0JCWlmIChmbGFncyAmIEZMQUdfTEVGVCkKLQkJICAqZmJwKysgPSAnLSc7Ci0JCWlmIChmbGFncyAmIEZMQUdfU0hPV1NJR04pCi0JCSAgKmZicCsrID0gJysnOwotCQlpZiAoZmxhZ3MgJiBGTEFHX1NQQUNFKQotCQkgICpmYnArKyA9ICcgJzsKLQkJaWYgKGZsYWdzICYgRkxBR19BTFQpCi0JCSAgKmZicCsrID0gJyMnOwotCQlpZiAoIXBhZF9vdXJzZWx2ZXMpCi0JCSAgewotCQkgICAgaWYgKGZsYWdzICYgRkxBR19aRVJPKQotCQkgICAgICAqZmJwKysgPSAnMCc7Ci0JCSAgICBpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCi0JCSAgICAgIHsKLQkJCXNpemVfdCBuID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKLQkJCS8qIFRoZSB3aWR0aCBzcGVjaWZpY2F0aW9uIGlzIGtub3duIHRvIGNvbnNpc3Qgb25seQotCQkJICAgb2Ygc3RhbmRhcmQgQVNDSUkgY2hhcmFjdGVycy4gICovCi0JCQlpZiAoc2l6ZW9mIChGQ0hBUl9UKSA9PSBzaXplb2YgKFRDSEFSX1QpKQotCQkJICB7Ci0JCQkgICAgbWVtY3B5IChmYnAsIGRwLT53aWR0aF9zdGFydCwgbiAqIHNpemVvZiAoVENIQVJfVCkpOwotCQkJICAgIGZicCArPSBuOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBjb25zdCBGQ0hBUl9UICptcCA9IGRwLT53aWR0aF9zdGFydDsKLQkJCSAgICBkbwotCQkJICAgICAgKmZicCsrID0gKHVuc2lnbmVkIGNoYXIpICptcCsrOwotCQkJICAgIHdoaWxlICgtLW4gPiAwKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQlpZiAoIXByZWNfb3Vyc2VsdmVzKQotCQkgIHsKLQkJICAgIGlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQotCQkgICAgICB7Ci0JCQlzaXplX3QgbiA9IGRwLT5wcmVjaXNpb25fZW5kIC0gZHAtPnByZWNpc2lvbl9zdGFydDsKLQkJCS8qIFRoZSBwcmVjaXNpb24gc3BlY2lmaWNhdGlvbiBpcyBrbm93biB0byBjb25zaXN0IG9ubHkKLQkJCSAgIG9mIHN0YW5kYXJkIEFTQ0lJIGNoYXJhY3RlcnMuICAqLwotCQkJaWYgKHNpemVvZiAoRkNIQVJfVCkgPT0gc2l6ZW9mIChUQ0hBUl9UKSkKLQkJCSAgewotCQkJICAgIG1lbWNweSAoZmJwLCBkcC0+cHJlY2lzaW9uX3N0YXJ0LCBuICogc2l6ZW9mIChUQ0hBUl9UKSk7Ci0JCQkgICAgZmJwICs9IG47Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGNvbnN0IEZDSEFSX1QgKm1wID0gZHAtPnByZWNpc2lvbl9zdGFydDsKLQkJCSAgICBkbwotCQkJICAgICAgKmZicCsrID0gKHVuc2lnbmVkIGNoYXIpICptcCsrOwotCQkJICAgIHdoaWxlICgtLW4gPiAwKTsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCi0JCXN3aXRjaCAodHlwZSkKLQkJICB7Ci0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0JCSAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgotCQkgIGNhc2UgVFlQRV9VTE9OR0xPTkdJTlQ6Ci0jIGlmIChkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykgJiYgISBkZWZpbmVkIF9fQ1lHV0lOX18KLQkJICAgICpmYnArKyA9ICdJJzsKLQkJICAgICpmYnArKyA9ICc2JzsKLQkJICAgICpmYnArKyA9ICc0JzsKLQkJICAgIGJyZWFrOwotIyBlbHNlCi0JCSAgICAqZmJwKysgPSAnbCc7Ci0JCSAgICAvKkZBTExUSFJPVUdIKi8KLSMgZW5kaWYKLSNlbmRpZgotCQkgIGNhc2UgVFlQRV9MT05HSU5UOgotCQkgIGNhc2UgVFlQRV9VTE9OR0lOVDoKLSNpZiBIQVZFX1dJTlRfVAotCQkgIGNhc2UgVFlQRV9XSURFX0NIQVI6Ci0jZW5kaWYKLSNpZiBIQVZFX1dDSEFSX1QKLQkJICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0jZW5kaWYKLQkJICAgICpmYnArKyA9ICdsJzsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgVFlQRV9MT05HRE9VQkxFOgotCQkgICAgKmZicCsrID0gJ0wnOwotCQkgICAgYnJlYWs7Ci0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLSNpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfRgotCQlpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ0YnKQotCQkgICpmYnAgPSAnZic7Ci0JCWVsc2UKLSNlbmRpZgotCQkgICpmYnAgPSBkcC0+Y29udmVyc2lvbjsKLSNpZiBVU0VfU05QUklOVEYKLSMgaWYgIShfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMykpCi0JCWZicFsxXSA9ICclJzsKLQkJZmJwWzJdID0gJ24nOwotCQlmYnBbM10gPSAnXDAnOwotIyBlbHNlCi0JCS8qIE9uIGdsaWJjMiBzeXN0ZW1zIGZyb20gZ2xpYmMgPj0gMi4zIC0gcHJvYmFibHkgYWxzbyBvbGRlcgotCQkgICBvbmVzIC0gd2Uga25vdyB0aGF0IHNucHJpbnRmJ3MgcmV0dXJucyB2YWx1ZSBjb25mb3JtcyB0bwotCQkgICBJU08gQyA5OTogdGhlIGdsX1NOUFJJTlRGX0RJUkVDVElWRV9OIHRlc3QgcGFzc2VzLgotCQkgICBUaGVyZWZvcmUgd2UgY2FuIGF2b2lkIHVzaW5nICVuIGluIHRoaXMgc2l0dWF0aW9uLgotCQkgICBPbiBnbGliYzIgc3lzdGVtcyBmcm9tIDIwMDQtMTAtMTggb3IgbmV3ZXIsIHRoZSB1c2Ugb2YgJW4KLQkJICAgaW4gZm9ybWF0IHN0cmluZ3MgaW4gd3JpdGFibGUgbWVtb3J5IG1heSBjcmFzaCB0aGUgcHJvZ3JhbQotCQkgICAoaWYgY29tcGlsZWQgd2l0aCBfRk9SVElGWV9TT1VSQ0U9MiksIHNvIHdlIHNob3VsZCBhdm9pZCBpdAotCQkgICBpbiB0aGlzIHNpdHVhdGlvbi4gICovCi0JCWZicFsxXSA9ICdcMCc7Ci0jIGVuZGlmCi0jZWxzZQotCQlmYnBbMV0gPSAnXDAnOwotI2VuZGlmCi0KLQkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgZm9yIGNhbGxpbmcgc25wcmludGYgb3Igc3ByaW50Zi4gICovCi0JCXByZWZpeF9jb3VudCA9IDA7Ci0JCWlmICghcGFkX291cnNlbHZlcyAmJiBkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQotCQkgIHsKLQkJICAgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLmEuYV9pbnQ7Ci0JCSAgfQotCQlpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggIT0gQVJHX05PTkUpCi0JCSAgewotCQkgICAgaWYgKCEoYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQotCQkgICAgICBhYm9ydCAoKTsKLQkJICAgIHByZWZpeGVzW3ByZWZpeF9jb3VudCsrXSA9IGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS5hLmFfaW50OwotCQkgIH0KLQotI2lmIFVTRV9TTlBSSU5URgotCQkvKiBUaGUgU05QUklOVEYgcmVzdWx0IGlzIGFwcGVuZGVkIGFmdGVyIHJlc3VsdFswLi5sZW5ndGhdLgotCQkgICBUaGUgbGF0dGVyIGlzIGFuIGFycmF5IG9mIERDSEFSX1Q7IFNOUFJJTlRGIGFwcGVuZHMgYW4KLQkJICAgYXJyYXkgb2YgVENIQVJfVCB0byBpdC4gIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZQotCQkgICBzaXplb2YgKFRDSEFSX1QpIGRpdmlkZXMgc2l6ZW9mIChEQ0hBUl9UKSBhbmQKLQkJICAgYWxpZ25vZiAoVENIQVJfVCkgPD0gYWxpZ25vZiAoRENIQVJfVCkuICAqLwotIyBkZWZpbmUgVENIQVJTX1BFUl9EQ0hBUiAoc2l6ZW9mIChEQ0hBUl9UKSAvIHNpemVvZiAoVENIQVJfVCkpCi0JCS8qIFByZXBhcmUgY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiByZXR1cm5zIHRoZSBjb3VudAotCQkgICB2aWEgJW4uICAqLwotCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7Ci0JCSooVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSA9ICdcMCc7Ci0jZW5kaWYKLQotCQlmb3IgKDs7KQotCQkgIHsKLQkJICAgIGludCBjb3VudCA9IC0xOwotCi0jaWYgVVNFX1NOUFJJTlRGCi0JCSAgICBpbnQgcmV0Y291bnQgPSAwOwotCQkgICAgc2l6ZV90IG1heGxlbiA9IGFsbG9jYXRlZCAtIGxlbmd0aDsKLQkJICAgIC8qIFNOUFJJTlRGIGNhbiBmYWlsIGlmIGl0cyBzZWNvbmQgYXJndW1lbnQgaXMKLQkJICAgICAgID4gSU5UX01BWC4gICovCi0JCSAgICBpZiAobWF4bGVuID4gSU5UX01BWCAvIFRDSEFSU19QRVJfRENIQVIpCi0JCSAgICAgIG1heGxlbiA9IElOVF9NQVggLyBUQ0hBUlNfUEVSX0RDSEFSOwotCQkgICAgbWF4bGVuID0gbWF4bGVuICogVENIQVJTX1BFUl9EQ0hBUjsKLSMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKLQkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAotCQkgICAgICB7CQkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAotCQkJcmV0Y291bnQgPSBTTlBSSU5URiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCksIFwKLQkJCQkJICAgICBtYXhsZW4sIGJ1ZiwJCSAgICBcCi0JCQkJCSAgICAgYXJnLCAmY291bnQpOwkJICAgIFwKLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMToJCQkJCQkgICAgXAotCQkJcmV0Y291bnQgPSBTTlBSSU5URiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCksIFwKLQkJCQkJICAgICBtYXhsZW4sIGJ1ZiwJCSAgICBcCi0JCQkJCSAgICAgcHJlZml4ZXNbMF0sIGFyZywgJmNvdW50KTsJICAgIFwKLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAotCQkJcmV0Y291bnQgPSBTTlBSSU5URiAoKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCksIFwKLQkJCQkJICAgICBtYXhsZW4sIGJ1ZiwJCSAgICBcCi0JCQkJCSAgICAgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLCBhcmcsIFwKLQkJCQkJICAgICAmY291bnQpOwkJCSAgICBcCi0JCQlicmVhazsJCQkJCQkgICAgXAotCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCi0JCQlhYm9ydCAoKTsJCQkJCSAgICBcCi0JCSAgICAgIH0KLSNlbHNlCi0jIGRlZmluZSBTTlBSSU5URl9CVUYoYXJnKSBcCi0JCSAgICBzd2l0Y2ggKHByZWZpeF9jb3VudCkJCQkJICAgIFwKLQkJICAgICAgewkJCQkJCQkgICAgXAotCQkgICAgICBjYXNlIDA6CQkJCQkJICAgIFwKLQkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIGFyZyk7CQkgICAgXAotCQkJYnJlYWs7CQkJCQkJICAgIFwKLQkJICAgICAgY2FzZSAxOgkJCQkJCSAgICBcCi0JCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgYXJnKTsJICAgIFwKLQkJCWJyZWFrOwkJCQkJCSAgICBcCi0JCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAotCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgcHJlZml4ZXNbMF0sIHByZWZpeGVzWzFdLFwKLQkJCQkJIGFyZyk7CQkJCSAgICBcCi0JCQlicmVhazsJCQkJCQkgICAgXAotCQkgICAgICBkZWZhdWx0OgkJCQkJCSAgICBcCi0JCQlhYm9ydCAoKTsJCQkJCSAgICBcCi0JCSAgICAgIH0KLSNlbmRpZgotCi0JCSAgICBzd2l0Y2ggKHR5cGUpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSBUWVBFX1NDSEFSOgotCQkJewotCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3NjaGFyOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX1VDSEFSOgotCQkJewotCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VjaGFyOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX1NIT1JUOgotCQkJewotCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Nob3J0OwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKLQkJCXsKLQkJCSAgdW5zaWduZWQgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91c2hvcnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfSU5UOgotCQkJewotCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2ludDsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgVFlQRV9VSU5UOgotCQkJewotCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfTE9OR0lOVDoKLQkJCXsKLQkJCSAgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6Ci0JCQl7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2ludDsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWYgSEFWRV9MT05HX0xPTkdfSU5UCi0JCSAgICAgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKLQkJCXsKLQkJCSAgbG9uZyBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2xvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV91bG9uZ2xvbmdpbnQ7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCSAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0JCQl7Ci0JCQkgIGRvdWJsZSBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfZG91YmxlOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6Ci0JCQl7Ci0JCQkgIGxvbmcgZG91YmxlIGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9sb25nZG91YmxlOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSBUWVBFX0NIQVI6Ci0JCQl7Ci0JCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY2hhcjsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWYgSEFWRV9XSU5UX1QKLQkJICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKLQkJCXsKLQkJCSAgd2ludF90IGFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX2NoYXI7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCSAgICAgIGNhc2UgVFlQRV9TVFJJTkc6Ci0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9zdHJpbmc7Ci0JCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKLQkJCX0KLQkJCWJyZWFrOwotI2lmIEhBVkVfV0NIQVJfVAotCQkgICAgICBjYXNlIFRZUEVfV0lERV9TVFJJTkc6Ci0JCQl7Ci0JCQkgIGNvbnN0IHdjaGFyX3QgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV93aWRlX3N0cmluZzsKLQkJCSAgU05QUklOVEZfQlVGIChhcmcpOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJICAgICAgY2FzZSBUWVBFX1BPSU5URVI6Ci0JCQl7Ci0JCQkgIHZvaWQgKmFyZyA9IGEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9wb2ludGVyOwotCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJICAgICAgZGVmYXVsdDoKLQkJCWFib3J0ICgpOwotCQkgICAgICB9Ci0KLSNpZiBVU0VfU05QUklOVEYKLQkJICAgIC8qIFBvcnRhYmlsaXR5OiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyBvZiBzbnByaW50ZigpCi0JCSAgICAgICBhcmUgSVNPIEMgOTkgY29tcGxpYW50LiAgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YKLQkJICAgICAgIGJ5dGVzIHRoYXQgc25wcmludGYoKSBoYXMgcHJvZHVjZWQgb3Igd291bGQgaGF2ZQotCQkgICAgICAgcHJvZHVjZWQuICAqLwotCQkgICAgaWYgKGNvdW50ID49IDApCi0JCSAgICAgIHsKLQkJCS8qIFZlcmlmeSB0aGF0IHNucHJpbnRmKCkgaGFzIE5VTC10ZXJtaW5hdGVkIGl0cwotCQkJICAgcmVzdWx0LiAgKi8KLQkJCWlmIChjb3VudCA8IG1heGxlbgotCQkJICAgICYmICgoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKSkgW2NvdW50XSAhPSAnXDAnKQotCQkJICBhYm9ydCAoKTsKLQkJCS8qIFBvcnRhYmlsaXR5IGhhY2suICAqLwotCQkJaWYgKHJldGNvdW50ID4gY291bnQpCi0JCQkgIGNvdW50ID0gcmV0Y291bnQ7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJLyogc25wcmludGYoKSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicKLQkJCSAgIGRpcmVjdGl2ZS4gICovCi0JCQlpZiAoZmJwWzFdICE9ICdcMCcpCi0JCQkgIHsKLQkJCSAgICAvKiBEb24ndCB1c2UgdGhlICclbicgZGlyZWN0aXZlOyBpbnN0ZWFkLCBsb29rCi0JCQkgICAgICAgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KLQkJCSAgICBmYnBbMV0gPSAnXDAnOwotCQkJICAgIGNvbnRpbnVlOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICAvKiBMb29rIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCi0JCQkgICAgaWYgKHJldGNvdW50IDwgMCkKLQkJCSAgICAgIHsKLQkJCQkvKiBIUC1VWCAxMC4yMCBzbnByaW50ZigpIGlzIGRvdWJseSBkZWZpY2llbnQ6Ci0JCQkJICAgSXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAnJW4nIGRpcmVjdGl2ZSwKLQkJCQkgICAqYW5kKiBpdCByZXR1cm5zIC0xIChyYXRoZXIgdGhhbiB0aGUgbGVuZ3RoCi0JCQkJICAgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmVxdWlyZWQpIHdoZW4gdGhlCi0JCQkJICAgYnVmZmVyIGlzIHRvbyBzbWFsbC4gICovCi0JCQkJc2l6ZV90IGJpZ2dlcl9uZWVkID0KLQkJCQkgIHhzdW0gKHh0aW1lcyAoYWxsb2NhdGVkLCAyKSwgMTIpOwotCQkJCUVOU1VSRV9BTExPQ0FUSU9OIChiaWdnZXJfbmVlZCk7Ci0JCQkJY29udGludWU7Ci0JCQkgICAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgICAgY291bnQgPSByZXRjb3VudDsKLQkJCSAgfQotCQkgICAgICB9Ci0jZW5kaWYKLQotCQkgICAgLyogQXR0ZW1wdCB0byBoYW5kbGUgZmFpbHVyZS4gICovCi0JCSAgICBpZiAoY291bnQgPCAwKQotCQkgICAgICB7Ci0JCQlpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLQkJCSAgZnJlZSAocmVzdWx0KTsKLQkJCWlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLQkJCSAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLQkJCUNMRUFOVVAgKCk7Ci0JCQllcnJubyA9IEVJTlZBTDsKLQkJCXJldHVybiBOVUxMOwotCQkgICAgICB9Ci0KLSNpZiBVU0VfU05QUklOVEYKLQkJICAgIC8qIEhhbmRsZSBvdmVyZmxvdyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KLQkJICAgICAgIElmIHN1Y2ggYW4gb3ZlcmZsb3cgb2NjdXJzLCBhIEM5OSBjb21wbGlhbnQgc25wcmludGYoKQotCQkgICAgICAgcmV0dXJucyBhIGNvdW50ID49IG1heGxlbi4gIEhvd2V2ZXIsIGEgbm9uLWNvbXBsaWFudAotCQkgICAgICAgc25wcmludGYoKSBmdW5jdGlvbiByZXR1cm5zIG9ubHkgY291bnQgPSBtYXhsZW4gLSAxLiAgVG8KLQkJICAgICAgIGNvdmVyIGJvdGggY2FzZXMsIHRlc3Qgd2hldGhlciBjb3VudCA+PSBtYXhsZW4gLSAxLiAgKi8KLQkJICAgIGlmICgodW5zaWduZWQgaW50KSBjb3VudCArIDEgPj0gbWF4bGVuKQotCQkgICAgICB7Ci0JCQkvKiBJZiBtYXhsZW4gYWxyZWFkeSBoYXMgYXR0YWluZWQgaXRzIGFsbG93ZWQgbWF4aW11bSwKLQkJCSAgIGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkgd2lsbCBub3QgaW5jcmVhc2UgbWF4bGVuLgotCQkJICAgSW5zdGVhZCBvZiBsb29waW5nLCBiYWlsIG91dC4gICovCi0JCQlpZiAobWF4bGVuID09IElOVF9NQVggLyBUQ0hBUlNfUEVSX0RDSEFSKQotCQkJICBnb3RvIG92ZXJmbG93OwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgLyogTmVlZCBhdCBsZWFzdCBjb3VudCAqIHNpemVvZiAoVENIQVJfVCkgYnl0ZXMuCi0JCQkgICAgICAgQnV0IGFsbG9jYXRlIHByb3BvcnRpb25hbGx5LCB0byBhdm9pZCBsb29waW5nCi0JCQkgICAgICAgZXRlcm5hbGx5IGlmIHNucHJpbnRmKCkgcmVwb3J0cyBhIHRvbyBzbWFsbAotCQkJICAgICAgIGNvdW50LiAgKi8KLQkJCSAgICBzaXplX3QgbiA9Ci0JCQkgICAgICB4bWF4ICh4c3VtIChsZW5ndGgsCi0JCQkJCSAgKGNvdW50ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpCi0JCQkJCSAgLyBUQ0hBUlNfUEVSX0RDSEFSKSwKLQkJCQkgICAgeHRpbWVzIChhbGxvY2F0ZWQsIDIpKTsKLQotCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLQkJCSAgICBjb250aW51ZTsKLQkJCSAgfQotCQkgICAgICB9Ci0jZW5kaWYKLQotI2lmIE5FRURfUFJJTlRGX1VOQk9VTkRFRF9QUkVDSVNJT04KLQkJICAgIGlmIChwcmVjX291cnNlbHZlcykKLQkJICAgICAgewotCQkJLyogSGFuZGxlIHRoZSBwcmVjaXNpb24uICAqLwotCQkJVENIQVJfVCAqcHJlY19wdHIgPSAKLSMgaWYgVVNFX1NOUFJJTlRGCi0JCQkgIChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotIyBlbHNlCi0JCQkgIHRtcDsKLSMgZW5kaWYKLQkJCXNpemVfdCBwcmVmaXhfY291bnQ7Ci0JCQlzaXplX3QgbW92ZTsKLQotCQkJcHJlZml4X2NvdW50ID0gMDsKLQkJCS8qIFB1dCB0aGUgYWRkaXRpb25hbCB6ZXJvZXMgYWZ0ZXIgdGhlIHNpZ24uICAqLwotCQkJaWYgKGNvdW50ID49IDEKLQkJCSAgICAmJiAoKnByZWNfcHRyID09ICctJyB8fCAqcHJlY19wdHIgPT0gJysnCi0JCQkJfHwgKnByZWNfcHRyID09ICcgJykpCi0JCQkgIHByZWZpeF9jb3VudCA9IDE7Ci0JCQkvKiBQdXQgdGhlIGFkZGl0aW9uYWwgemVyb2VzIGFmdGVyIHRoZSAweCBwcmVmaXggaWYKLQkJCSAgIChmbGFncyAmIEZMQUdfQUxUKSB8fCAoZHAtPmNvbnZlcnNpb24gPT0gJ3AnKS4gICovCi0JCQllbHNlIGlmIChjb3VudCA+PSAyCi0JCQkJICYmIHByZWNfcHRyWzBdID09ICcwJwotCQkJCSAmJiAocHJlY19wdHJbMV0gPT0gJ3gnIHx8IHByZWNfcHRyWzFdID09ICdYJykpCi0JCQkgIHByZWZpeF9jb3VudCA9IDI7Ci0KLQkJCW1vdmUgPSBjb3VudCAtIHByZWZpeF9jb3VudDsKLQkJCWlmIChwcmVjaXNpb24gPiBtb3ZlKQotCQkJICB7Ci0JCQkgICAgLyogSW5zZXJ0IHplcm9lcy4gICovCi0JCQkgICAgc2l6ZV90IGluc2VydCA9IHByZWNpc2lvbiAtIG1vdmU7Ci0JCQkgICAgVENIQVJfVCAqcHJlY19lbmQ7Ci0KLSMgaWYgVVNFX1NOUFJJTlRGCi0JCQkgICAgc2l6ZV90IG4gPQotCQkJICAgICAgeHN1bSAobGVuZ3RoLAotCQkJCSAgICAoY291bnQgKyBpbnNlcnQgKyBUQ0hBUlNfUEVSX0RDSEFSIC0gMSkKLQkJCQkgICAgLyBUQ0hBUlNfUEVSX0RDSEFSKTsKLQkJCSAgICBsZW5ndGggKz0gKGNvdW50ICsgVENIQVJTX1BFUl9EQ0hBUiAtIDEpIC8gVENIQVJTX1BFUl9EQ0hBUjsKLQkJCSAgICBFTlNVUkVfQUxMT0NBVElPTiAobik7Ci0JCQkgICAgbGVuZ3RoIC09IChjb3VudCArIFRDSEFSU19QRVJfRENIQVIgLSAxKSAvIFRDSEFSU19QRVJfRENIQVI7Ci0JCQkgICAgcHJlY19wdHIgPSAoVENIQVJfVCAqKSAocmVzdWx0ICsgbGVuZ3RoKTsKLSMgZW5kaWYKLQotCQkJICAgIHByZWNfZW5kID0gcHJlY19wdHIgKyBjb3VudDsKLQkJCSAgICBwcmVjX3B0ciArPSBwcmVmaXhfY291bnQ7Ci0KLQkJCSAgICB3aGlsZSAocHJlY19lbmQgPiBwcmVjX3B0cikKLQkJCSAgICAgIHsKLQkJCQlwcmVjX2VuZC0tOwotCQkJCXByZWNfZW5kW2luc2VydF0gPSBwcmVjX2VuZFswXTsKLQkJCSAgICAgIH0KLQotCQkJICAgIHByZWNfZW5kICs9IGluc2VydDsKLQkJCSAgICBkbwotCQkJICAgICAgKi0tcHJlY19lbmQgPSAnMCc7Ci0JCQkgICAgd2hpbGUgKHByZWNfZW5kID4gcHJlY19wdHIpOwotCi0JCQkgICAgY291bnQgKz0gaW5zZXJ0OwotCQkJICB9Ci0JCSAgICAgIH0KLSNlbmRpZgotCi0jaWYgIURDSEFSX0lTX1RDSEFSCi0jIGlmICFVU0VfU05QUklOVEYKLQkJICAgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQotCQkgICAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQotCQkJIGNvZGUgYWJvdmUhICAqLwotCQkgICAgICBhYm9ydCAoKTsKLSMgZW5kaWYKLQotCQkgICAgLyogQ29udmVydCBmcm9tIFRDSEFSX1RbXSB0byBEQ0hBUl9UW10uICAqLwotCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdjJyB8fCBkcC0+Y29udmVyc2lvbiA9PSAncycpCi0JCSAgICAgIHsKLQkJCS8qIHR5cGUgPSBUWVBFX0NIQVIgb3IgVFlQRV9XSURFX0NIQVIgb3IgVFlQRV9TVFJJTkcKLQkJCSAgIFRZUEVfV0lERV9TVFJJTkcuCi0JCQkgICBUaGUgcmVzdWx0IHN0cmluZyBpcyBub3QgY2VydGFpbmx5IEFTQ0lJLiAgKi8KLQkJCWNvbnN0IFRDSEFSX1QgKnRtcHNyYzsKLQkJCURDSEFSX1QgKnRtcGRzdDsKLQkJCXNpemVfdCB0bXBkc3RfbGVuOwotCQkJLyogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBUQ0hBUl9UIGlzICdjaGFyJy4gICovCi0JCQl0eXBlZGVmIGludCBUQ0hBUl9UX3ZlcmlmeQotCQkJCSAgICBbMiAqIChzaXplb2YgKFRDSEFSX1QpID09IDEpIC0gMV07Ci0jIGlmIFVTRV9TTlBSSU5URgotCQkJdG1wc3JjID0gKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCk7Ci0jIGVsc2UKLQkJCXRtcHNyYyA9IHRtcDsKLSMgZW5kaWYKLQkJCXRtcGRzdCA9IE5VTEw7Ci0JCQl0bXBkc3RfbGVuID0gMDsKLQkJCWlmIChEQ0hBUl9DT05WX0ZST01fRU5DT0RJTkcgKGxvY2FsZV9jaGFyc2V0ICgpLAotCQkJCQkJICAgICAgaWNvbnZlaF9xdWVzdGlvbl9tYXJrLAotCQkJCQkJICAgICAgdG1wc3JjLCBjb3VudCwKLQkJCQkJCSAgICAgIE5VTEwsCi0JCQkJCQkgICAgICAmdG1wZHN0LCAmdG1wZHN0X2xlbikKLQkJCSAgICA8IDApCi0JCQkgIHsKLQkJCSAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQkJCSAgICBpZiAoIShyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKSkKLQkJCSAgICAgIGZyZWUgKHJlc3VsdCk7Ci0JCQkgICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLQkJCSAgICBDTEVBTlVQICgpOwotCQkJICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0JCQkgICAgcmV0dXJuIE5VTEw7Ci0JCQkgIH0KLQkJCUVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIHRtcGRzdF9sZW4pKTsKLQkJCURDSEFSX0NQWSAocmVzdWx0ICsgbGVuZ3RoLCB0bXBkc3QsIHRtcGRzdF9sZW4pOwotCQkJZnJlZSAodG1wZHN0KTsKLQkJCWNvdW50ID0gdG1wZHN0X2xlbjsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBUaGUgcmVzdWx0IHN0cmluZyBpcyBBU0NJSS4KLQkJCSAgIFNpbXBsZSAxOjEgY29udmVyc2lvbi4gICovCi0jIGlmIFVTRV9TTlBSSU5URgotCQkJLyogSWYgc2l6ZW9mIChEQ0hBUl9UKSA9PSBzaXplb2YgKFRDSEFSX1QpLCBpdCdzIGEKLQkJCSAgIG5vLW9wIGNvbnZlcnNpb24sIGluLXBsYWNlIG9uIHRoZSBhcnJheSBzdGFydGluZwotCQkJICAgYXQgKHJlc3VsdCArIGxlbmd0aCkuICAqLwotCQkJaWYgKHNpemVvZiAoRENIQVJfVCkgIT0gc2l6ZW9mIChUQ0hBUl9UKSkKLSMgZW5kaWYKLQkJCSAgewotCQkJICAgIGNvbnN0IFRDSEFSX1QgKnRtcHNyYzsKLQkJCSAgICBEQ0hBUl9UICp0bXBkc3Q7Ci0JCQkgICAgc2l6ZV90IG47Ci0KLSMgaWYgVVNFX1NOUFJJTlRGCi0JCQkgICAgaWYgKHJlc3VsdCA9PSByZXN1bHRidWYpCi0JCQkgICAgICB7Ci0JCQkJdG1wc3JjID0gKFRDSEFSX1QgKikgKHJlc3VsdCArIGxlbmd0aCk7Ci0JCQkJLyogRU5TVVJFX0FMTE9DQVRJT04gd2lsbCBub3QgbW92ZSB0bXBzcmMKLQkJCQkgICAoYmVjYXVzZSBpdCdzIHBhcnQgb2YgcmVzdWx0YnVmKS4gICovCi0JCQkJRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgY291bnQpKTsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJLyogRU5TVVJFX0FMTE9DQVRJT04gd2lsbCBtb3ZlIHRoZSBhcnJheQotCQkJCSAgIChiZWNhdXNlIGl0IHVzZXMgcmVhbGxvYygpLiAgKi8KLQkJCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCBjb3VudCkpOwotCQkJCXRtcHNyYyA9IChUQ0hBUl9UICopIChyZXN1bHQgKyBsZW5ndGgpOwotCQkJICAgICAgfQotIyBlbHNlCi0JCQkgICAgdG1wc3JjID0gdG1wOwotCQkJICAgIEVOU1VSRV9BTExPQ0FUSU9OICh4c3VtIChsZW5ndGgsIGNvdW50KSk7Ci0jIGVuZGlmCi0JCQkgICAgdG1wZHN0ID0gcmVzdWx0ICsgbGVuZ3RoOwotCQkJICAgIC8qIENvcHkgYmFja3dhcmRzLCBiZWNhdXNlIG9mIG92ZXJsYXBwaW5nLiAgKi8KLQkJCSAgICB0bXBzcmMgKz0gY291bnQ7Ci0JCQkgICAgdG1wZHN0ICs9IGNvdW50OwotCQkJICAgIGZvciAobiA9IGNvdW50OyBuID4gMDsgbi0tKQotCQkJICAgICAgKi0tdG1wZHN0ID0gKHVuc2lnbmVkIGNoYXIpICotLXRtcHNyYzsKLQkJCSAgfQotCQkgICAgICB9Ci0jZW5kaWYKLQotI2lmIERDSEFSX0lTX1RDSEFSICYmICFVU0VfU05QUklOVEYKLQkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0JCSAgICBpZiAoY291bnQgPiBhbGxvY2F0ZWQgLSBsZW5ndGgpCi0JCSAgICAgIHsKLQkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgZWxlbWVudHMuICBCdXQgYWxsb2NhdGUKLQkJCSAgIHByb3BvcnRpb25hbGx5LiAgKi8KLQkJCXNpemVfdCBuID0KLQkJCSAgeG1heCAoeHN1bSAobGVuZ3RoLCBjb3VudCksIHh0aW1lcyAoYWxsb2NhdGVkLCAyKSk7Ci0KLQkJCUVOU1VSRV9BTExPQ0FUSU9OIChuKTsKLQkJICAgICAgfQotI2VuZGlmCi0KLQkJICAgIC8qIEhlcmUgY291bnQgPD0gYWxsb2NhdGVkIC0gbGVuZ3RoLiAgKi8KLQotCQkgICAgLyogUGVyZm9ybSBwYWRkaW5nLiAgKi8KLSNpZiAhRENIQVJfSVNfVENIQVIgfHwgRU5BQkxFX1VOSVNURElPIHx8IE5FRURfUFJJTlRGX0ZMQUdfWkVSTyB8fCBORUVEX1BSSU5URl9VTkJPVU5ERURfUFJFQ0lTSU9OCi0JCSAgICBpZiAocGFkX291cnNlbHZlcyAmJiBoYXNfd2lkdGgpCi0JCSAgICAgIHsKLQkJCXNpemVfdCB3OwotIyBpZiBFTkFCTEVfVU5JU1RESU8KLQkJCS8qIE91dHNpZGUgUE9TSVgsIGl0J3MgcHJlZmVycmFibGUgdG8gY29tcGFyZSB0aGUgd2lkdGgKLQkJCSAgIGFnYWluc3QgdGhlIG51bWJlciBvZiBfY2hhcmFjdGVyc18gb2YgdGhlIGNvbnZlcnRlZAotCQkJICAgdmFsdWUuICAqLwotCQkJdyA9IERDSEFSX01CU05MRU4gKHJlc3VsdCArIGxlbmd0aCwgY291bnQpOwotIyBlbHNlCi0JCQkvKiBUaGUgd2lkdGggaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIF9ieXRlc18KLQkJCSAgIG9mIHRoZSBjb252ZXJ0ZWQgdmFsdWUsIHNheXMgUE9TSVguICAqLwotCQkJdyA9IGNvdW50OwotIyBlbmRpZgotCQkJaWYgKHcgPCB3aWR0aCkKLQkJCSAgewotCQkJICAgIHNpemVfdCBwYWQgPSB3aWR0aCAtIHc7Ci0jIGlmIFVTRV9TTlBSSU5URgotCQkJICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIHJlc3VsdC4gICovCi0JCQkgICAgaWYgKHhzdW0gKGNvdW50LCBwYWQpID4gYWxsb2NhdGVkIC0gbGVuZ3RoKQotCQkJICAgICAgewotCQkJCS8qIE5lZWQgYXQgbGVhc3QgY291bnQgKyBwYWQgZWxlbWVudHMuICBCdXQKLQkJCQkgICBhbGxvY2F0ZSBwcm9wb3J0aW9uYWxseS4gICovCi0JCQkJc2l6ZV90IG4gPQotCQkJCSAgeG1heCAoeHN1bTMgKGxlbmd0aCwgY291bnQsIHBhZCksCi0JCQkJCXh0aW1lcyAoYWxsb2NhdGVkLCAyKSk7Ci0KLQkJCQlsZW5ndGggKz0gY291bnQ7Ci0JCQkJRU5TVVJFX0FMTE9DQVRJT04gKG4pOwotCQkJCWxlbmd0aCAtPSBjb3VudDsKLQkJCSAgICAgIH0KLQkJCSAgICAvKiBIZXJlIGNvdW50ICsgcGFkIDw9IGFsbG9jYXRlZCAtIGxlbmd0aC4gICovCi0jIGVuZGlmCi0JCQkgICAgewotIyBpZiAhRENIQVJfSVNfVENIQVIgfHwgVVNFX1NOUFJJTlRGCi0JCQkgICAgICBEQ0hBUl9UICogY29uc3QgcnAgPSByZXN1bHQgKyBsZW5ndGg7Ci0jIGVsc2UKLQkJCSAgICAgIERDSEFSX1QgKiBjb25zdCBycCA9IHRtcDsKLSMgZW5kaWYKLQkJCSAgICAgIERDSEFSX1QgKnAgPSBycCArIGNvdW50OwotCQkJICAgICAgRENIQVJfVCAqZW5kID0gcCArIHBhZDsKLSMgaWYgTkVFRF9QUklOVEZfRkxBR19aRVJPCi0JCQkgICAgICBEQ0hBUl9UICpwYWRfcHRyOwotIyAgaWYgIURDSEFSX0lTX1RDSEFSCi0JCQkgICAgICBpZiAoZHAtPmNvbnZlcnNpb24gPT0gJ2MnCi0JCQkJICB8fCBkcC0+Y29udmVyc2lvbiA9PSAncycpCi0JCQkJLyogTm8gemVyby1wYWRkaW5nIGZvciBzdHJpbmcgZGlyZWN0aXZlcy4gICovCi0JCQkJcGFkX3B0ciA9IE5VTEw7Ci0JCQkgICAgICBlbHNlCi0jICBlbmRpZgotCQkJCXsKLQkJCQkgIHBhZF9wdHIgPSAoKnJwID09ICctJyA/IHJwICsgMSA6IHJwKTsKLQkJCQkgIC8qIE5vIHplcm8tcGFkZGluZyBvZiAiaW5mIiBhbmQgIm5hbiIuICAqLwotCQkJCSAgaWYgKCgqcGFkX3B0ciA+PSAnQScgJiYgKnBhZF9wdHIgPD0gJ1onKQotCQkJCSAgICAgIHx8ICgqcGFkX3B0ciA+PSAnYScgJiYgKnBhZF9wdHIgPD0gJ3onKSkKLQkJCQkgICAgcGFkX3B0ciA9IE5VTEw7Ci0JCQkJfQotIyBlbmRpZgotCQkJICAgICAgLyogVGhlIGdlbmVyYXRlZCBzdHJpbmcgbm93IGV4dGVuZHMgZnJvbSBycCB0byBwLAotCQkJCSB3aXRoIHRoZSB6ZXJvIHBhZGRpbmcgaW5zZXJ0aW9uIHBvaW50IGJlaW5nIGF0Ci0JCQkJIHBhZF9wdHIuICAqLwotCi0JCQkgICAgICBjb3VudCA9IGNvdW50ICsgcGFkOyAvKiA9IGVuZCAtIHJwICovCi0KLQkJCSAgICAgIGlmIChmbGFncyAmIEZMQUdfTEVGVCkKLQkJCQl7Ci0JCQkJICAvKiBQYWQgd2l0aCBzcGFjZXMgb24gdGhlIHJpZ2h0LiAgKi8KLQkJCQkgIGZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLQkJCQkgICAgKnArKyA9ICcgJzsKLQkJCQl9Ci0jIGlmIE5FRURfUFJJTlRGX0ZMQUdfWkVSTwotCQkJICAgICAgZWxzZSBpZiAoKGZsYWdzICYgRkxBR19aRVJPKSAmJiBwYWRfcHRyICE9IE5VTEwpCi0JCQkJewotCQkJCSAgLyogUGFkIHdpdGggemVyb2VzLiAgKi8KLQkJCQkgIERDSEFSX1QgKnEgPSBlbmQ7Ci0KLQkJCQkgIHdoaWxlIChwID4gcGFkX3B0cikKLQkJCQkgICAgKi0tcSA9ICotLXA7Ci0JCQkJICBmb3IgKDsgcGFkID4gMDsgcGFkLS0pCi0JCQkJICAgICpwKysgPSAnMCc7Ci0JCQkJfQotIyBlbmRpZgotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIC8qIFBhZCB3aXRoIHNwYWNlcyBvbiB0aGUgbGVmdC4gICovCi0JCQkJICBEQ0hBUl9UICpxID0gZW5kOwotCi0JCQkJICB3aGlsZSAocCA+IHJwKQotCQkJCSAgICAqLS1xID0gKi0tcDsKLQkJCQkgIGZvciAoOyBwYWQgPiAwOyBwYWQtLSkKLQkJCQkgICAgKnArKyA9ICcgJzsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLSNlbmRpZgotCi0jaWYgRENIQVJfSVNfVENIQVIgJiYgIVVTRV9TTlBSSU5URgotCQkgICAgaWYgKGNvdW50ID49IHRtcF9sZW5ndGgpCi0JCSAgICAgIC8qIHRtcF9sZW5ndGggd2FzIGluY29ycmVjdGx5IGNhbGN1bGF0ZWQgLSBmaXggdGhlCi0JCQkgY29kZSBhYm92ZSEgICovCi0JCSAgICAgIGFib3J0ICgpOwotI2VuZGlmCi0KLQkJICAgIC8qIEhlcmUgc3RpbGwgY291bnQgPD0gYWxsb2NhdGVkIC0gbGVuZ3RoLiAgKi8KLQotI2lmICFEQ0hBUl9JU19UQ0hBUiB8fCBVU0VfU05QUklOVEYKLQkJICAgIC8qIFRoZSBzbnByaW50ZigpIHJlc3VsdCBkaWQgZml0LiAgKi8KLSNlbHNlCi0JCSAgICAvKiBBcHBlbmQgdGhlIHNwcmludGYoKSByZXN1bHQuICAqLwotCQkgICAgbWVtY3B5IChyZXN1bHQgKyBsZW5ndGgsIHRtcCwgY291bnQgKiBzaXplb2YgKERDSEFSX1QpKTsKLSNlbmRpZgotI2lmICFVU0VfU05QUklOVEYKLQkJICAgIGlmICh0bXAgIT0gdG1wYnVmKQotCQkgICAgICBmcmVlICh0bXApOwotI2VuZGlmCi0KLSNpZiBORUVEX1BSSU5URl9ESVJFQ1RJVkVfRgotCQkgICAgaWYgKGRwLT5jb252ZXJzaW9uID09ICdGJykKLQkJICAgICAgewotCQkJLyogQ29udmVydCB0aGUgJWYgcmVzdWx0IHRvIHVwcGVyIGNhc2UgZm9yICVGLiAgKi8KLQkJCURDSEFSX1QgKnJwID0gcmVzdWx0ICsgbGVuZ3RoOwotCQkJc2l6ZV90IHJjOwotCQkJZm9yIChyYyA9IGNvdW50OyByYyA+IDA7IHJjLS0sIHJwKyspCi0JCQkgIGlmICgqcnAgPj0gJ2EnICYmICpycCA8PSAneicpCi0JCQkgICAgKnJwID0gKnJwIC0gJ2EnICsgJ0EnOwotCQkgICAgICB9Ci0jZW5kaWYKLQotCQkgICAgbGVuZ3RoICs9IGNvdW50OwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIEFkZCB0aGUgZmluYWwgTlVMLiAgKi8KLSAgICBFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7Ci0gICAgcmVzdWx0W2xlbmd0aF0gPSAnXDAnOwotCi0gICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYgJiYgbGVuZ3RoICsgMSA8IGFsbG9jYXRlZCkKLSAgICAgIHsKLQkvKiBTaHJpbmsgdGhlIGFsbG9jYXRlZCBtZW1vcnkgaWYgcG9zc2libGUuICAqLwotCURDSEFSX1QgKm1lbW9yeTsKLQotCW1lbW9yeSA9IChEQ0hBUl9UICopIHJlYWxsb2MgKHJlc3VsdCwgKGxlbmd0aCArIDEpICogc2l6ZW9mIChEQ0hBUl9UKSk7Ci0JaWYgKG1lbW9yeSAhPSBOVUxMKQotCSAgcmVzdWx0ID0gbWVtb3J5OwotICAgICAgfQotCi0gICAgaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQotICAgICAgZnJlZSAoYnVmX21hbGxvY2VkKTsKLSAgICBDTEVBTlVQICgpOwotICAgICpsZW5ndGhwID0gbGVuZ3RoOwotICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4gcHJvZHVjZSBhIGJpZyBzdHJpbmcgb2YgYSBsZW5ndGggPiBJTlRfTUFYLiAgUE9TSVgKLSAgICAgICBzYXlzIHRoYXQgc25wcmludGYoKSBmYWlscyB3aXRoIGVycm5vID0gRU9WRVJGTE9XIGluIHRoaXMgY2FzZSwgYnV0Ci0gICAgICAgdGhhdCdzIG9ubHkgYmVjYXVzZSBzbnByaW50ZigpIHJldHVybnMgYW4gJ2ludCcuICBUaGlzIGZ1bmN0aW9uIGRvZXMKLSAgICAgICBub3QgaGF2ZSB0aGlzIGxpbWl0YXRpb24uICAqLwotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgb3ZlcmZsb3c6Ci0gICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCi0gICAgICBmcmVlIChyZXN1bHQpOwotICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKLSAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7Ci0gICAgQ0xFQU5VUCAoKTsKLSAgICBlcnJubyA9IEVPVkVSRkxPVzsKLSAgICByZXR1cm4gTlVMTDsKLQotICBvdXRfb2ZfbWVtb3J5OgotICAgIGlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQotICAgICAgZnJlZSAocmVzdWx0KTsKLSAgICBpZiAoYnVmX21hbGxvY2VkICE9IE5VTEwpCi0gICAgICBmcmVlIChidWZfbWFsbG9jZWQpOwotICBvdXRfb2ZfbWVtb3J5XzE6Ci0gICAgQ0xFQU5VUCAoKTsKLSAgICBlcnJubyA9IEVOT01FTTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0jdW5kZWYgVENIQVJTX1BFUl9EQ0hBUgotI3VuZGVmIFNOUFJJTlRGCi0jdW5kZWYgVVNFX1NOUFJJTlRGCi0jdW5kZWYgRENIQVJfQ1BZCi0jdW5kZWYgUFJJTlRGX1BBUlNFCi0jdW5kZWYgRElSRUNUSVZFUwotI3VuZGVmIERJUkVDVElWRQotI3VuZGVmIERDSEFSX0lTX1RDSEFSCi0jdW5kZWYgVENIQVJfVAotI3VuZGVmIERDSEFSX1QKLSN1bmRlZiBGQ0hBUl9UCi0jdW5kZWYgVkFTTlBSSU5URgpkaWZmIC0tZ2l0IGEvaW50bC92YXNucHJpbnRmLmggYi9pbnRsL3Zhc25wcmludGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxZDE4My4uMDAwMDAwMAotLS0gYS9pbnRsL3Zhc25wcmludGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfVkFTTlBSSU5URl9ICi0jZGVmaW5lIF9WQVNOUFJJTlRGX0gKLQotLyogR2V0IHZhX2xpc3QuICAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vKiBHZXQgc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCi0vKiBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIGdjYyB2ZXJzaW9ucyAyLjUgYW5kIGxhdGVyLiAgKi8KLSMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNSkgfHwgX19TVFJJQ1RfQU5TSV9fCi0jICBkZWZpbmUgX19hdHRyaWJ1dGVfXyhTcGVjKSAvKiBlbXB0eSAqLwotIyBlbmRpZgotLyogVGhlIF9fLXByb3RlY3RlZCB2YXJpYW50cyBvZiBgZm9ybWF0JyBhbmQgYHByaW50ZicgYXR0cmlidXRlcwotICAgYXJlIGFjY2VwdGVkIGJ5IGdjYyB2ZXJzaW9ucyAyLjYuNCAoZWZmZWN0aXZlbHkgMi43KSBhbmQgbGF0ZXIuICAqLwotIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KQotIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0Ci0jICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0gICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCi0gICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KLSAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgotICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQotICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKLSAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4KLQotICAgV2hlbiBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIG9jY3VycywgdGhlIHByZWFsbG9jYXRlZCBidWZmZXIgaXMgbGVmdAotICAgYWxvbmUgKHdpdGggcG9zc2libHkgbW9kaWZpZWQgY29udGVudHMpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UKLSAgIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgb3Igc3RhY2stYWxsb2NhdGVkIGJ1ZmZlciwgbGlrZSB0aGlzOgotCi0gICAgICAgICAgY2hhciBidWZbMTAwXTsKLSAgICAgICAgICBzaXplX3QgbGVuID0gc2l6ZW9mIChidWYpOwotICAgICAgICAgIGNoYXIgKm91dHB1dCA9IHZhc25wcmludGYgKGJ1ZiwgJmxlbiwgZm9ybWF0LCBhcmdzKTsKLSAgICAgICAgICBpZiAob3V0cHV0ID09IE5VTEwpCi0gICAgICAgICAgICAuLi4gZXJyb3IgaGFuZGxpbmcgLi4uOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLi4uIHVzZSB0aGUgb3V0cHV0IHN0cmluZyAuLi47Ci0gICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gYnVmKQotICAgICAgICAgICAgICAgIGZyZWUgKG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICovCi1leHRlcm4gY2hhciAqIGFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOwotZXh0ZXJuIGNoYXIgKiB2YXNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCi0gICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfVkFTTlBSSU5URl9IICovCmRpZmYgLS1naXQgYS9pbnRsL3Zhc253cHJpbnRmLmggYi9pbnRsL3Zhc253cHJpbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjAzY2UuLjAwMDAwMDAKLS0tIGEvaW50bC92YXNud3ByaW50Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgotICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAotICAgVVNBLiAgKi8KLQotI2lmbmRlZiBfVkFTTldQUklOVEZfSAotI2RlZmluZSBfVkFTTldQUklOVEZfSAotCi0vKiBHZXQgdmFfbGlzdC4gICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qIEdldCB3Y2hhcl90LCBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCi0gICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCi0gICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KLSAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgotICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQotICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKLSAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCi1leHRlcm4gd2NoYXJfdCAqIGFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLik7Ci1leHRlcm4gd2NoYXJfdCAqIHZhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwotCi0jaWZkZWYJX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX1ZBU05XUFJJTlRGX0ggKi8KZGlmZiAtLWdpdCBhL2ludGwvdmVyc2lvbi5jIGIvaW50bC92ZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjhjZjcuLjAwMDAwMDAKLS0tIGEvaW50bC92ZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBsaWJpbnRsIGxpYnJhcnkgdmVyc2lvbi4KLSAgIENvcHlyaWdodCAoQykgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ251aW50bC5oIgotCi0vKiBWZXJzaW9uIG51bWJlcjogKG1ham9yPDwxNikgKyAobWlub3I8PDgpICsgc3VibWlub3IgKi8KLWludCBsaWJpbnRsX3ZlcnNpb24gPSBMSUJJTlRMX1ZFUlNJT047CmRpZmYgLS1naXQgYS9pbnRsL3dwcmludGYtcGFyc2UuaCBiL2ludGwvd3ByaW50Zi1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBiODlhLi4wMDAwMDAwCi0tLSBhL2ludGwvd3ByaW50Zi1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKLSNkZWZpbmUgX1dQUklOVEZfUEFSU0VfSAotCi0jaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKLQotCi0vKiBGbGFncyAqLwotI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLwotI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCi0jZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCi0jZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLwotI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KLSNkZWZpbmUgRkxBR19aRVJPCTMyCi0KLS8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLwotI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKLQotLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IHdjaGFyX3QqIGRpcl9zdGFydDsKLSAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKLSAgaW50IGZsYWdzOwotICBjb25zdCB3Y2hhcl90KiB3aWR0aF9zdGFydDsKLSAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOwotICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OwotICBjb25zdCB3Y2hhcl90KiBwcmVjaXNpb25fc3RhcnQ7Ci0gIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7Ci0gIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OwotICB3Y2hhcl90IGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLwotICBzaXplX3QgYXJnX2luZGV4OwotfQotd2NoYXJfdF9kaXJlY3RpdmU7Ci0KLS8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc2l6ZV90IGNvdW50OwotICB3Y2hhcl90X2RpcmVjdGl2ZSAqZGlyOwotICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKLSAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOwotfQotd2NoYXJfdF9kaXJlY3RpdmVzOwotCi0KLS8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKLSAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAotICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKLSAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLwotI2lmZGVmIFNUQVRJQwotU1RBVElDCi0jZWxzZQotZXh0ZXJuCi0jZW5kaWYKLWludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKLQotI2VuZGlmIC8qIF9XUFJJTlRGX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2ludGwveHNpemUuaCBiL2ludGwveHNpemUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwMjNhNy4uMDAwMDAwMAotLS0gYS9pbnRsL3hzaXplLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogeHNpemUuaCAtLSBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuCi0KLSAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCi0gICBVU0EuICAqLwotCi0jaWZuZGVmIF9YU0laRV9ICi0jZGVmaW5lIF9YU0laRV9ICi0KLS8qIEdldCBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBHZXQgU0laRV9NQVguICAqLwotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2lmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLQotLyogVGhlIHNpemUgb2YgbWVtb3J5IG9iamVjdHMgaXMgb2Z0ZW4gY29tcHV0ZWQgdGhyb3VnaCBleHByZXNzaW9ucyBvZgotICAgdHlwZSBzaXplX3QuIEV4YW1wbGU6Ci0gICAgICB2b2lkKiBwID0gbWFsbG9jIChoZWFkZXJfc2l6ZSArIG4gKiBlbGVtZW50X3NpemUpLgotICAgVGhlc2UgY29tcHV0YXRpb25zIGNhbiBsZWFkIHRvIG92ZXJmbG93LiAgV2hlbiB0aGlzIGhhcHBlbnMsIG1hbGxvYygpCi0gICByZXR1cm5zIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgaXMgd2F5IHRvbyBzbWFsbCwgYW5kIHRoZSBwcm9ncmFtIHRoZW4KLSAgIGNyYXNoZXMgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIHRoZSBtZW1vcnkuCi0gICBUbyBhdm9pZCB0aGlzLCB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MgaW4gdGhpcyBmaWxlIGNoZWNrIGZvciBvdmVyZmxvdy4KLSAgIFRoZSBjb252ZW50aW9uIGlzIHRoYXQgU0laRV9NQVggcmVwcmVzZW50cyBvdmVyZmxvdy4KLSAgIG1hbGxvYyAoU0laRV9NQVgpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGZhaWwgLS0gdGhpbmsgb2YgYSBtYWxsb2MKLSAgIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtbWFwIC0tLCBpdCdzIHJlY29tbWVuZGVkIHRvIHVzZSBzaXplX292ZXJmbG93X3AoKQotICAgb3Igc2l6ZV9pbl9ib3VuZHNfcCgpIGJlZm9yZSBpbnZva2luZyBtYWxsb2MoKS4KLSAgIFRoZSBleGFtcGxlIHRodXMgYmVjb21lczoKLSAgICAgIHNpemVfdCBzaXplID0geHN1bSAoaGVhZGVyX3NpemUsIHh0aW1lcyAobiwgZWxlbWVudF9zaXplKSk7Ci0gICAgICB2b2lkICpwID0gKHNpemVfaW5fYm91bmRzX3AgKHNpemUpID8gbWFsbG9jIChzaXplKSA6IE5VTEwpOwotKi8KLQotLyogQ29udmVydCBhbiBhcmJpdHJhcnkgdmFsdWUgPj0gMCB0byB0eXBlIHNpemVfdC4gICovCi0jZGVmaW5lIHhjYXN0X3NpemVfdChOKSBcCi0gICgoTikgPD0gU0laRV9NQVggPyAoc2l6ZV90KSAoTikgOiBTSVpFX01BWCkKLQotLyogU3VtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi1zdGF0aWMgaW5saW5lIHNpemVfdAotI2lmIF9fR05VQ19fID49IDMKLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0jZW5kaWYKLXhzdW0gKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyKQotewotICBzaXplX3Qgc3VtID0gc2l6ZTEgKyBzaXplMjsKLSAgcmV0dXJuIChzdW0gPj0gc2l6ZTEgPyBzdW0gOiBTSVpFX01BWCk7Ci19Ci0KLS8qIFN1bSBvZiB0aHJlZSBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi1zdGF0aWMgaW5saW5lIHNpemVfdAotI2lmIF9fR05VQ19fID49IDMKLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0jZW5kaWYKLXhzdW0zIChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgc2l6ZV90IHNpemUzKQotewotICByZXR1cm4geHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpOwotfQotCi0vKiBTdW0gb2YgZm91ciBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCi1zdGF0aWMgaW5saW5lIHNpemVfdAotI2lmIF9fR05VQ19fID49IDMKLV9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCi0jZW5kaWYKLXhzdW00IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMiwgc2l6ZV90IHNpemUzLCBzaXplX3Qgc2l6ZTQpCi17Ci0gIHJldHVybiB4c3VtICh4c3VtICh4c3VtIChzaXplMSwgc2l6ZTIpLCBzaXplMyksIHNpemU0KTsKLX0KLQotLyogTWF4aW11bSBvZiB0d28gc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLwotc3RhdGljIGlubGluZSBzaXplX3QKLSNpZiBfX0dOVUNfXyA+PSAzCi1fX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQotI2VuZGlmCi14bWF4IChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKLXsKLSAgLyogTm8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIGhlcmUsIGJlY2F1c2UgZm9yIGFueSBuOgotICAgICBtYXggKFNJWkVfTUFYLCBuKSA9PSBTSVpFX01BWCBhbmQgbWF4IChuLCBTSVpFX01BWCkgPT0gU0laRV9NQVguICAqLwotICByZXR1cm4gKHNpemUxID49IHNpemUyID8gc2l6ZTEgOiBzaXplMik7Ci19Ci0KLS8qIE11bHRpcGxpY2F0aW9uIG9mIGEgY291bnQgd2l0aCBhbiBlbGVtZW50IHNpemUsIHdpdGggb3ZlcmZsb3cgY2hlY2suCi0gICBUaGUgY291bnQgbXVzdCBiZSA+PSAwIGFuZCB0aGUgZWxlbWVudCBzaXplIG11c3QgYmUgPiAwLgotICAgVGhpcyBpcyBhIG1hY3JvLCBub3QgYW4gaW5saW5lIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IHdvcmtzIGNvcnJlY3RseSBldmVuCi0gICB3aGVuIE4gaXMgb2YgYSB3aWRlciB0dXBlIGFuZCBOID4gU0laRV9NQVguICAqLwotI2RlZmluZSB4dGltZXMoTiwgRUxTSVpFKSBcCi0gICgoTikgPD0gU0laRV9NQVggLyAoRUxTSVpFKSA/IChzaXplX3QpIChOKSAqIChFTFNJWkUpIDogU0laRV9NQVgpCi0KLS8qIENoZWNrIGZvciBvdmVyZmxvdy4gICovCi0jZGVmaW5lIHNpemVfb3ZlcmZsb3dfcChTSVpFKSBcCi0gICgoU0laRSkgPT0gU0laRV9NQVgpCi0vKiBDaGVjayBhZ2FpbnN0IG92ZXJmbG93LiAgKi8KLSNkZWZpbmUgc2l6ZV9pbl9ib3VuZHNfcChTSVpFKSBcCi0gICgoU0laRSkgIT0gU0laRV9NQVgpCi0KLSNlbmRpZiAvKiBfWFNJWkVfSCAqLwo=